Manual Java
Manual Java
AULA MENTOR
educacion.es
Nipo: 820-10-530-5 Autor: Pilar Aranzazu Ocaa Diaz-Ufano y Jos Miguel Ordax Cass Edicin y maquetacin de contenidos: Susana Prez Marn
MDULO A
UNIDADES DIDCTICAS:
1. Introduccin 2. Conceptos bsicos. Objeto, atributo, mtodo, interfaz, clase 3. Paradigmas de la Orientacin a Objetos: Abstraccin, encapsulacin, ocultamiento, herencia y polimorfismo.
Nipo: 820-10-530-5 Autor: Pilar Aranzazu Ocaa Diaz-Ufano y Jos Miguel Ordax Cass Edicin y maquetacin de contenidos: Susana Prez Marn
MDULO A
Introduccin
Tema 1.1
ndice de la unidad:
En esta unidad veremos el origen de la programacin Orientada a Objetos, cuales son sus principales caractersticas.
1. Historia
Una de las caractersticas para poder clasificar los lenguajes de programacin es su nivel de abstraccin. Este nivel puede ser expresado en base a la complejidad del problema que se est intentando resolver. Por ejemplo, el lenguaje Ensamblador, primer lenguaje de programacin, tiene un pequeo nivel de abstraccin relacionado totalmente con la mquina en la que se est ejecutando, por lo que el nivel de abstraccin que se aplicaba al mbito de la solucin era muy bajo. Muchos de los lenguajes que siguieron al Ensamblador, llamados lenguajes imperativos, como es el caso de Fortran, Basic y C, fueron abstracciones de este primer lenguaje de programacin. El nivel de abstraccin de estos lenguajes es mucho ms elevado que el del lenguaje original, pero siguen estando muy relacionados con la estructura del ordenador en el que se ejecutan, en lugar de la estructura del problema a resolver y del mundo real. Debido a esta relacin, los programas desarrollados son difciles de escribir y bastante costosos de mantener. As, acercando el modelo de abstraccin al problema a resolver y no a la mquina fsica, aparecieron en los aos 60 los primeros lenguajes Orientados a Objetos, tambin denominados O.O., tales como LISP (todos los problemas se reducen a listas), APL (todos los problemas se reducen a algoritmos) y PROLOG (todos los problemas se reducen a cadenas de decision). El primer lenguaje considerado totalmente Orientado a Objetos y sobre el que se basa Java, es Smalltalk. Este lenguaje recoge las cinco principales caractersticas que tienen que tener estos lenguajes de programacin y que se vern ms en profundidad en la Unidad 1.2:
almacenar cierta informacin y realizar operaciones sobre ella. Un programa es un conjunto de objetos colaborando entre s,
indicando que es lo que hay que hacer mediante el envo de mensajes. Cada objeto esta contruido en base a otros objetos,
permitiendo alcanzar grados mayores de complejidad. Cada objeto pertenece a un tipo, denominado clase. Todos los objetos del mismo tipo pueden recibir los mismos
mensajes. 1
MDULO 1
A continuacin, se muestra la evolucin de los lenguajes Orientados a Objetos hasta la aparicin del lenguaje Java, objeto de nuestro estudio.
No hay que olvidar, que la Orientacin a Objetos aplica tambin al Anlisis y Diseo de las soluciones. El mtodo ms utilizado a da de hoy es el UML (siglas de Unified Modeling Language) sucesor de los mtodos de Anlisis y Diseo Orientado a Objetos de finales de los 80 y comienzo de los 90, tales como: Booch, Rumbaugh (OMT) y Jacobson. UML es un mtodo visual, basado en diagramas, que permite modelar sistemas, en base a Especificaciones, Arquitectura, Diseo y/o Implementacin.
Suministra modelos similares a los del mundo real. Facilita el desarrollo de sistemas complejos. Facilita la reutilizacin Permite el desarrollo iterativo de aplicaciones. Facilita la interoperabilidad de aplicaciones.
animales donde solo van a tratar mamferos y solo ciertos tipos de mamferos. Por lo tanto, los peces, las aves ... quedan fuera del mbito de nuestro mundo real.
MDULO 1
una entidad, sin necesidad de conocer como lo proporciona. Modularidad. Divisin de las soluciones en componentes ms
pequeos o mdulos independientes que se integran entre s. Una solucin compleja desarrollada en un solo mdulo es imposible de abarcar por un solo lector, debido al nmero de caminos de control, variables ... Herencia. Relacin de jerarqua entre las entidades, en cuanto
a funcionalidad.
parametrizacin (reutilizacin de operaciones en funcin de los parmetros que se les pasan a dichas operaciones). La Orientacin a Objetos soporta la reutilizacin basada en la utilizacin de libreras de componentes (agrupacin de entidades con un significado relacionado), framework). patrones de diseo (soluciones dadas a problemas ya existentes) y arquitecturas software (tambin conocidas con el nombre de
MDULO 1
esta forma se consigue un prototipado controlado: se crea un prototipo al cual se le aaden capacidades de forma incremental. El cliente puede ir probando versiones mucho antes que en el desarrollo tradicional. De esta manera se comprueba que la solucin dada al problema a resolver es realmente lo que se est esperando y no tenemos que esperar a la finalizacin del desarrollo, para verificar que la solucin final satisface el problema a resolver en su totalidad. Actualmente, el desarrollo iterativo, se basa en la utilizacin de Casos de Uso, uno de los diagramas definidos por UML. Describen una visin externa del comportamiento del Sistema desde el punto de vista del usuario, constituyendo un modelo de lo que el Sistema har sin tener en cuenta el cmo lo har. A continuacin se muestra como sera el ciclo iterativo de desarrollo. Por cada conjunto de casos de uso elegidos, se pasar por cada una de las fases, permitiendo tener casos de usos finalizados mientras que otros estn pendientes de iniciarse.
MDULO 1
Los lenguajes orientados a objetos, miden su nivel de abstraccin con respecto a la definicin del mundo real.
Las principales ventajas son: Suministra modelos similares a los del mundo real. Facilita el desarrollo de sistemas complejos. Facilita la reutilizacin. Permite el desarrollo iterativo de aplicaciones. Facilita la interoperabilidad de aplicaciones. Facilita el desarrollo de sistemas complejos.
MDULO A
Tema 1.2
ndice de la unidad:
En esta unidad veremos cuales son los conceptos bsicos en los que se apoya la Orientacin a Objetos, tanto a nivel de Anlisis y Diseo, como en la Programacin.
1. Conceptos bsicos
Como se ha comentado en la Unidad 1.1, los lenguajes de programacin Orientados a Objetos, se caracterizan por tener su nivel de abstraccin basado en el mundo real. As, el nfasis est en la abstraccin de datos, y los problemas del mundo real son representados por un conjunto de objetos de datos para los que se adjunta un conjunto correspondiente de operaciones. As, al igual que otros lenguajes de programacin, introducen un nuevo conjunto de trminos, o conceptos bsicos que son esenciales comprender, para poder realizar cualquier anlisis, diseo o desarrollo Orientado a Objetos: Objeto Atributo Mtodo Interfaz Clase
2. Objeto
Hay muchas definiciones que pueden darse de un objeto, entre las cuales se encuentran: Es cualquier cosa que vemos a nuestro alrededor, algo tangi-
ble y/o visible, animado o inanimado. Por ejemplo, un camin, un perro, una cuenta bancaria ...
11
MDULO 1
Definiciones dadas por creadores de metodologas Orientadas a Objetos como pueden ser: Un objeto se caracteriza por un nmero de operaciones y un
estado que recuerda el efecto de estas operaciones. Ivar Jacobson Un objeto tiene un estado, comportamiento e identidad; la
estructura y comportamiento de objetos similares se definen en sus clases comunes. Grady Booch Un objeto es una entidad que tiene un estado (cuya represen-
tacin est oculta) y un conjunto definido de operaciones que operan sobre ese estado. Ian Sommerville Un objeto es una identidad con unos lmites bien definidos que
encapsulan estado y comportamiento. El estado se representa por atributos y relaciones, el comportamiento es representado por operaciones y mtodos. Object Management Group Los trminos objeto e instancia son usados indistintamente.
12
objetos. En el caso de que los valores de los atributos fueran los mismos, es la nica manera de poder determinar cada uno de los objetos. As si tenemos dos cuentas corrientes con el mismo titular, y el mismo importe, la nica forma de diferenciarlas es va dicha identidad. Comportamiento. Conjunto de operaciones o mtodos que
proporcionan servicios a otros objetos que solicitan dichos servicios cuando necesitan que se realice una cierta operativa. Estado. Conjunto de propiedades o atributos que recuerdan el
unReloj, con los atributos hora (horas, min, seg), dia (dia, mes, ao), modelo y numSerie y cuyos mtodos u operaciones seran getHora, getDia, incrementarHora, incrementarDia, limpiarPantalla y traducirFrecuencia.
MDULO 1
Solo disponible para colecciones de objetos. Constructor: crea un objeto e inicializa su estado. Por ejemplo
ejemplo ~Reloj(). No existe en Java. Propsito general: la lgica del programa. Por ejemplo, lim-
sera la siguiente:
14
Atributo: Es una caracterstica fundamental de cada objeto y por lo tanto como veremos posteriormente de una clase. Todos los atributos tienen algn valor, siendo este una cantidad, una relacin con otro objeto ... Si el valor del atributo es un valor fijo para todos los objetos, se dice que es un atributo esttico
Mtodo: Es una accin que se realiza sobre un objeto para consultar o modificar su estado.
15
MDULO 1
Este aspecto exterior, es llamado tambin interfaz, siendo la parte visible y accesible para el resto de objetos. Puede estar formado por uno o varios mtodos. Tambin se le define como el protocolo de comunicacin de un objeto. Es posible que exista algn mtodo que solo pertenezca al aspecto interno pero no pertenezca al interfaz. En este caso, estos mtodos no pueden ser llamados desde otros objetos, sino que solamente pueden ser llamados desde mtodos del propio objeto.
Ejemplo: Para el objeto unReloj, el interfaz estara formado por los mtodos limpiarPan-
talla y traducirFrecuencia solamente pertenecen (conjuntamente con los que forman el interfaz) al aspecto interno. As el mtodo limpiarPantalla, es llamado por getHora y getDia antes de mostrar la informacin pedida en el mtodo
Interfaz: Aspecto exterior que es visible al resto de objetos. Puede estar formado por uno o varios mtodos.
16
3. Clase
Hasta ahora hemos visto que define a un objeto. Una de las definiciones ms sencillas es algo del mundo real, tangible o visible. Hemos visto que los objetos estn formados por atributos y mtodos. La definicin de estructura y comportamiento de un objeto es a lo que se denomina clase. Es por tanto un patrn para la definicin de atributos y mtodos para un tipo particular de objetos. Todos los objetos de una clase dada son idnticos en estructura y comportamiento pero son nicos (aunque tengan los mismos valores en sus atributos). Instancia es el trmino utilizado para referirse a un objeto que pertenece a una clase concreta. Una clase, por tanto es solamente la definicin. Mientras que un objeto o instancia es algo real con la estructura y comportamiento de la clase a la que pertenece. La estructura de una clase, por tanto, viene determinada por un nombre, los atributos que contiene y los mtodos que realiza.
Ejemplo: El objeto unReloj, pertenece a la clase Reloj, cuyo nombre es Recuyos atributos son dia, hora, modelo y numSerie y cuyos mtodos son
loj,
17
MDULO 1
Frecuencia
Como se puede ver en la imagen anterior, en los diagramas UML, la definicin de una clase, se realiza mediante un rectngulo, divido en tres partes y conteniendo en el siguiente orden: Nombre, Atributos y Mtodos.
18
As para la clase Reloj descrita anteriormente, tendremos los objetos unReloj (dia=01-03-2010, hora=13:01:03, modelo=Rolex, numSerie=123456) y otroReloj (dia=01-03-2010, hora=13:01:03, modelo=Swatch, numSerie=Sab748). Pero si nos paramos a pensar, qu surge antes? La clase y por lo tanto creamos los objetos del mundo real? O partiendo de los objetos del mundo real podemos definir su estructura y comportamiento?. Para solventar esta problemtica, aparece el concepto de Clasificacin. La clasificacin es el medio por el que ordenamos el conocimiento, ya que fundamentalmente es un problema de bsqueda de similitudes. Al clasificar buscamos grupos de cosas que tengan una misma estructura o exhiban un comportamiento comn. La clasificacin dentro de la Orientacin a Objetos, sobre todo en las fases de Anlisis y Diseo, permite que los objetos con la misma estructura de datos y con el mismo comportamiento se agrupan para formar una clase.
19
MDULO 1
Decidir cual es el concepto o conceptos (Clase, Objeto, Mtodo, Atributo) que cuadran con las siguientes definiciones. Pensar la solucin antes de pasar al siguiente cuadro: 1. El valor de mis atributos puede ser distinto al de los de mi semejante: 2. Yo me comporto como una plantilla: 3. A mi me gusta hacer cosas: 4. Yo puedo tener muchos mtodos: 5. Yo represento el estado: 6. Yo represento el comportamiento: 7. Yo estoy en los objetos: 8. Yo vivo en memoria: 9. Yo soy usado para crear instancias: 10. Mi estado puede cambiar: 11. Yo declaro mtodos: 12. Yo puedo cambiar en ejecucin:
Las soluciones a las preguntas anteriores son: 1. El valor de mis atributos puede ser distinto al de los de mi semejante: Objeto
2. Yo me comporto como una plantilla: Clase 3. A mi me gusta hacer cosas: Objeto, mtodo 4. Yo puedo tener muchos mtodos: Clase, objeto 5. Yo represento el estado: Atributo 6. Yo represento el comportamiento: Mtodo 7. Yo estoy en los objetos: Atributo, mtodo 8. Yo vivo en memoria: Objeto 9. Yo soy usado para crear instancias: Clase 10.Mi estado puede cambiar: Objeto 11.Yo declaro mtodos: Clase 12.Yo puedo cambiar en ejecucin: Objeto, atributo
20
En esta Unidad hemos visto los conceptos bsicos en los que se apoya la Orientacin a objetos: Objeto. Atributo. Mtodo. Interfaz. Clase
MDULO A
Paradigmas de la OO
Tema 1.3
ndice de la unidad:
En esta unidad veremos cuales son los paradigmas en los que se apoya la Orientacin a Objetos, tanto a nivel de Anlisis y Diseo, como en la Programacin.
2. Abstraccin
Consiste en la generalizacin conceptual de los atributos y comportamiento de un determinado conjunto de objetos.
25
MDULO 1
La clave de la programacin Orientada a Objetos est en abstraer los mtodos y los datos comunes a un conjunto de objetos y almacenarlos en una clase. As todos los objetos de una clase, se diferenciaran solamente en el estado, teniendo todos ellos el mismo comportamiento. Primeramente hay que centrarse en lo que es y lo que hace un objeto (atributos y comportamiento), antes de decidir cmo debera ser implementado. Nos centramos por tanto en la definicin, en lugar de la implementacin.
Ejemplo de abstraccin: En nuestro mundo real, tenemos los siguientes
objetos, miGato, miPerro, miLeon, miTigre y miLobo. Si abstraemos los atributos comunes que queremos tener contemplados en el mbito de nuestra solucin, encontramos que en todos ellos, queremos tener una foto, que tipo de alimentacin, donde habitan y su tamao, y como comportamiento, queremos saber como hacen ruido, como comen, como duermen y como rugen. As de una realidad, hemos abstrado estado y comportamiento y hemos definido la clase Animal.
3. Encapsulacin y Ocultamiento
Se tratan los dos paradigmas de forma conjunta, puesto que se utilizan normalmente de forma simultnea. Encapsular, significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstraccin. Ocultamiento, consiste en separar el aspecto externo del objeto o interfaz, al cual pueden acceder otros objetos, del aspecto interno e implementacin del mismo, 26
que es inaccesible para los dems. Permite tratar a un objeto como una caja negra, la cual solo es tratada por el resto de objetos por su el interfaz. Permite, por tanto que se modifique la implementacin interna de un objeto sin afectar a los clientes que lo utilizan. De esta manera, mientras el interfaz no vare, se puede modificar la implementacin o el aspecto interno, sin que los objetos con los que interrelaciona se vean afectados.
4. Relaciones
Las clases no existen de forma aislada sino que muchas veces tienen dependencias entre ellas. Estas dependencias es a lo que se llama relacin y existen distintos tipos o grados, que se enumeran a continuacin: Asociacin: Relacin simple. Agregacin: Contenido en ... Composicin: Obligatoriedad. Uno no puede existir sin el otro. Herencia: Relacin Jerrquica. Son del tipo de Relaciones dinmicas: Mensajes.
27
MDULO 1
producto, pero desde un producto no puedo acceder a un pedido. Otro ejemplo, sera miPrograma puede acceder a un producto, pero un producto no puede acceder a miPrograma. Ejemplo de asociacin bidireccional: Un cliente puede acceder a un pedi-
28
Por tanto, un objeto que representa el todo, est asociado con un conjunto de objetos que representan sus componentes. En los diagramas UML, el rombo blanco se utiliza sentar la agregacin.
Ejemplo de agregacin: Una centralita puede contener llamadas. Pero
para repre-
para repre-
29
MDULO 1
para represen-
animales. Todos ellos, deben de hacerRuido, comer, dormir y rugir. Cada una de las especializaciones, tanto los Felinos como los Caninos saben como rugir. A su vez, cada una de las especializaciones saben como comer, y como hacerRuido. Todos ellos, realizan la operacin de dormir de la misma manera que se ha determinado en la clase Animal.
30
Persona al objeto unReloj, para que le de la hora mediante el mtodo getHora. Para ello, el objeto unaPersona tiene que conocer el interfaz de unReloj, para saber que mtodo es el que tiene que llamar, si tiene que pasarle parmetros, de que tipos y si le va a devolver alguna informacin y una vez ms, de que tipo.
31
MDULO 1
5. Polimorfismo
Permite implementar mltiples formas de un mismo mtodo, dependiendo cada una de ellas de la clase sobre la que se realice la implementacin. Esta basado en el concepto especializacin de la herencia, donde cada clase hija, sabe implementar mejor que el padre alguno o todos sus mtodos. Esto posibilita desencadenar implementaciones de operaciones diferentes como respuesta a un mismo mensaje, en funcin del objeto que lo reciba. En el polimorfismo, una vez creados los objetos, se abstraen a la clase padre que proporciona el interfaz, para que el objeto llamante generalice su envo de mensaje independientemente del tipo de objeto especfico o clase hija; solamente debe de ser consciente del interfaz del mismo, mediante la clase padre. Es en ejecucin, cuando dependiendo realmente del tipo de objeto real, se ejecutar la implementacin concreta de cada objeto.
Ejemplo de polimormismo: En el ejemplo, el Matemtico, solo va a tener
relacin con Figura para calcularArea y calcularPerimetro. Pero realmente es cada una de las figuras, la que sabe como tiene que calcularArea o calcularPerimetro. Por eso, cada una de ellas, Cuadrado, Triangulo y Circulo van a implementar cada uno de los mtodos de una manera mas especializada que el padre
32
Construir un Diagrama de Clases UML a partir de las siguientes observaciones: Una margarita es un tipo de flor. Una rosa es un tipo de flor. Las rosas rojas y las rosas amarillas son tipos de rosas. Un ptalo es una parte de ambos tipos de flores. Los pjaros se comen a ciertas plagas como los pulgones, que pueden infectar a ciertos tipos de flores.
Del enunciado de la prctica, se pueden determinar distintas relaciones: Existe una clase Flor que contiene Ptalos: Relacin de composicin. Aunque en el mundo real existen flores sin ptalos (sera una relacin de agregacin) en el mbito de nuestro problema, solo contemplamos flores con ellos. Las clases Rosa y Margarita tienen son Flores, por lo que tienen una relacin de herencia con Flor. 33
MDULO 1
Como solucin tambin vlida, se podra tener una relacin de herencia con Rosa, las clases RosaAmarilla y RosaRoja, pero de esta manera, teniendo un atributo color permite una mejor reutilizacin en el caso de que pueda aparecer otra rosa de otro color.
A su vez, como tipos de Plaga que pueden asolar a nuestras Flores son los Pulgones , por lo que tiene una relacin de herencia entre Plaga y Pulgon y una relacin de asociacin entre Plaga y Flor. La Flor conoce a la Plaga pero no a la inversa.
Como los Pajaros se comen a las plagas, tienen relacin de asociacin con ellas, con cualquier tipo, ya sea un Pulgon o en un futuro una AraaRoja.
34
En esta Unidad hemos estudiado los diferentes paradigmas de la programacin Orientada a Objetos. Estos son: Abstraccin Encapsulacin y Ocultamiento Relaciones Polimorfismo asociacin agregacin composicin herencia mensaje
35
MDULO B
UNIDADES DIDCTICAS:
1. Introduccin a Java. Caractersticas del lenguaje 2. Entorno de desarrollo 3. Sintxis. Identificadores, keywords, variables, tipos de datos, operadores, tipos de sentencias 4. Clases, objetos, herencia, polimorfismo 5. Otros conceptos. Paquetes, modificadores de acceso, static, final, constantes
MDULO B
Tema 2.1
ndice de la unidad:
En esta unidad veremos el origen del lenguaje de programacin Java y cuales son sus principales caractersticas.
1. Introduccin
Fue creado por Sun Microsystems en el ao 1991 e inicialmente se denmino OAK y se desarroll principalmente orientndolo a la programacin de microsistemas y componentes electrnicos. Tras el cambio de nombre y modificaciones de diseo, el lenguaje Java fue presentado en sociedad en Enero de 1995 con una nueva orientacin: Internet. Fue presentado conjuntamente con un navegador Web denominado HotJava. Tiene una sintaxis muy similar a la de C++, pero tiene un modelo de objetos mas simple y elimina elementos de bajo nivel que suelen inducir a muchos errores, como pueden ser la manipulacin directa de punteros o memoria. Entre noviembre de 2006 y mayo de 2007, Sun Microsystems cedi la mayor parte de sus tecnologas Java a GNU GPL, de tal forma que prcticamente todo el Java de Sun es ahora Software libre. La idea inicial del lenguaje se bas en el paradigma de Write Once, Run Anywhere (Escribe una vez, ejecuta en cualquier lugar), proporcionando un lenguaje independiente de la plataforma en la que se ejecute. Java ha sufrido numerosos cambios desde la versin inicial, JDK (Java Depelopment Kit o entorno de desarrollo) 1.0, as como un aumento increble en el nmero de clases y paquetes que componen la biblioteca estndar. Esta biblioteca estndar se ha visto ampliada por numerosas bibliotecas de carcter especfico, como pueden ser las bibliotecas visuales, comunicaciones, etc.
43
MDULO 2
2.1 Sencillo
Los creadores de Java se basaron en el lenguaje de programacin C++, pero eliminaron la mayora de sus complejidades, para facilitar su aprendizaje, su lectura y el mantenimiento de los programas. A continuacin se listan algunas de las complejidades que se eliminaron: No soporta tipos de datos: struct, union, y puntero No soporta typedef ni #define
44
No permite la sobrecarga de operadores. No soporta la herencia mltiple. No soporta destructores. Posee una clase String, en vez del array de tipo char[] finali-
zado con nulo. Cuenta con un sistema automtico para asignar y liberar
memoria: el Garbage Collector. Uno de los grandes problemas de C++ es la reserva y liberacin de la memoria de forma programtica, provocando indeseados memory leaks.
2.2 Distribuido
Est concebido para trabajar en un entorno conectado en red. Cuenta con una amplia biblioteca de clases para comunicarse mediante los protocolos de comunicaciones TCP/IP: HTTP, FTP abriendo sockets, estableciendo y aceptando conexiones con servidores o clientes remotos. Permite manipular con gran facilidad recursos va URL.
2.3 Interpretado
Para que un programa Java puede ejecutarse, tiene que ser compilado previamente mediante un compilador. Es la principal diferencia con el resto de lenguajes interpretados. Necesita ser vlidado y compilado en un paso previo al de su ejecucin. El compilador de Java traduce el cdigo fuente o programa java a un cdigo intermedio (bytecode) o cdigo mquina similar a las instrucciones de ensamblador pero independiente de la mquina fsica en la que se ejecuta.
45
MDULO 2
Los bytecodes son interpretados (ejecutados) en cualquier entorno donde exista un intrprete de Java generando cdigo mquina. El intrprete de Java se llama Mquina Virtual Java o Java Virtual Machine (JVM) y este si que es dependiente de la plataforma en la que se ejecuta, existiendo un instalable para la mayora de sistemas operativos y arquitecturas como veremos en la Unidad 2.2. A continuacin se muestra cual sera el procedimiento a seguir, para poder ejecutar un programa java.
Esta caracterstica es la que posibilita el propsito inicial de Write Once, Run Everywhere.
46
2.4 Robusto
Un software robusto es aquel que no se interrumpe fcilmente a consecuencia de fallos. Al ser previamente compilado, todos los errores sintcticos son detectados en este fase y obligatoriamente tienen que ser eliminados. Un lenguaje de estas caractersticas suele tener ms restricciones a la hora de programar y realiza numerosas comprobaciones tanto en compilacin como en ejecucin. Facilita el manejo de excepciones, para poder tratar los fallos en ejecucin (se vern en ms detalle en la Unidad 3.5). El tratamiento automtico de la memoria impide poder sobrescribirla y corromper o modificar otros datos mediante punteros.
2.5 Seguro
Por su naturaleza distribuida, donde por ejemplo, los applets se bajan desde cualquier punto de la red y se ejecutan en local, el tema de la seguridad es muy crtico. A nadie le gustara ejecutar en su propio ordenador programas que tuvieran total acceso a su sistema, donde por ejemplo, pudieran coger informacin confidencial, tales como passwords o cuentas bancarias o incluso poder formatear el ordenador personal. Todos los navegadores poseen una sand box o entorno de ejecucin controlado donde no se permite realizar ninguna ejecucin fuera de ella (como puede ser acceso al sistema de ficheros) a menos que se indiquen explcitamente excepciones por parte del usuario que lo ejecuta. Estas excepciones pueden venir determinadas por tecnologas de firma digital para confiar en un determinado cdigo Java y/o mediante polticas de seguridad para controlar de una manera ms precisa que puede o no puede hacer (por ejemplo leer ciertos ficheros, poder abrir sockets ...).
47
MDULO 2
Son independientes de que su ejecucin se realicen en estaciones de trabajo, o en servidores, o en arquitecturas fsicas con el mismo sistema operativo o sistemas hetereogneos. Por tanto, el cdigo bytecode es independiente no solo de la plataforma Software en la que se ejecuta, sino tambin de la plataforma Hardware. La portabilidad entre las plataformas, se consigue, debido a que la JVM especifica el tamao de sus tipos bsicos, el comportamiento de los operadores aritmticos y el uso de estndares como UNICODE, IEEE 754 etc que permiten representar cualquier carcter mediante 2 bytes en lugar de uno solo, como ocurre con el ASCII.
A pesar de todo, existe algn compilador real de Java (perdemos la portabilidad y ganamos en rendimiento). Es decir, que se compila antes de su ejecucin, generando un ejecutable (no cdigo interpretable) atado a dicha plataforma. Este tipo de compilador se encuentran en desuso.
2.8 Multithread
El trmino multithread o multihilo en castellano, se refiere a la ejecucin de varias tareas a la vez en un mismo proceso, limitadas estrictamente en tiempo real por el nmero de procesadores.
Ejemplo: Mientras que un thread se encarga de interactuar con el
usuario, y otro thread realiza ciertos clculos. Por ejemplo, es bastante frecuente la existencia de un thread que espera que un usuario lance una peticin de operacin y en el momento de la llegada se abra otro thread para ejecutar dicha operacin, mientras el thread de comunicacin con el usuario queda a la espera de nuevas peticiones. As, si tres usuarios realicen tres peticiones al mismo tiempo el nmero total de threads seran 4, uno por cada operacin ejecutndose ms el thread que sigue quedando a la espera de nuevas comunicaciones. Cuando la ejecucin de cada operacin termine, el thread correspondiente terminar y desaparecer.
Para poder realizar esta ejecucin simultanea de varias tareas, Java posee una serie de clases que facilitan su utilizacin.
2.9 Dinmico
El cdigo C++, a menudo requiere una recompilacin y lincado completa si cambia una clase. Java utiliza una fase de linkado o utilizacin de clases en tiempo de ejecucin en modo dinmico. As las clases solo son utilizadas cuando son necesitadas. Permite utilizar nuevas clases bajo demanda, procedentes de fuentes diversas, inclusive internet. Para conseguir esto, Java emplea un mtodo de interfaces para evitar estas dependencias y recompilaciones. Adems, Java permite la indireccin. Es decir, en lugar de indicarle de forma directa que utilice la clase X, se le puede indicar que busque entre todas las 49
MDULO 2
clases va programtica, una clase denominada X, y una vez encontrada que la ejecute. Este acceso se puede realizar tanto a nivel de clase, como a nivel de mtodo y atributo.
3. La plataforma Java
Como hemos mencionado anteriormente, una plataforma es tanto el entorno hardware y/o software donde se ejecuta un programa.
Ejemplo: Ejemplos de estas plataformas son: 1. Plataformas Intel, RISC, SPARC 2. Plataformas Win32, Linux, AIX, Solaris, HP-UX, z/OS 3. Plataformas IBM, Sun, HP, Microsoft
La plataforma Java es una plataforma solo software que se ejecuta sobre otra plataforma hardware/software. Tiene dos componentes diferenciables: La mquina virtual Java (JVM) o intrprete de Java. La Interfaz de Programacin de Aplicaciones (API). El API Ja-
va es un conjunto de clases ya desarrolladas que ofrecen un gran abanico de posibilidades al programador. El conjunto de las APIs son controlados por el grupo JCP (Java Component Process)
50
sos limitados como telfonos mviles, PDAs, Java SE: Java Standard Edition. Orientados a entornos de
gama media y estaciones de trabajo, como por ejemplo un usuario medio en un PC de escritorio. Java EE: Java Enterprise Edition. Orientados a entornos em-
51
En esta unidad se ha visto el origen del lenguaje de programacin Java y las caractersticas que lo conforman: Orientado a Objetos Seguro Distribuido Interpretado Robusto Seguro Arquitectura neutra y portabilidad Altas prestaciones Multithread Dinmico
Adems se han categorizado los distintos tipos de plataformas Java: Java ME Java SE Java EE
MDULO B
Entorno de desarrollo
Tema 2.2
ndice de la unidad:
1. Java Development Kit 2. Contenido y componentes del JDK 3. IDE o Entorno integrado de desarrollo
En esta unidad veremos el entorno de desarrollo de Java, denominado JDK (Java Development Kit) y sus principales caractersticas.
dows en sus distintas versiones, Linux y Solaris (Sun). Descargable http://java.sun.com/javase/downloads IBM, que tiene una JDK para las siguientes plataformas: Win-
dows en sus distintas versiones, Linux, AIX, OS/2, OS/400 y z/OS. Apple, que tiene una JDK para las siguientes plataformas: Ma-
cintosh .
1. 1 Historia
La primera versin del JDK fu el JDK 1.0.0 que se retir de circulacin con la aparicin del JDK 1.1.0 El nombre ha ido cambiando entre JDK (Java Development Kit) y SDK (Software Development Kit), quedando de nuevo JDK como nombre actual. Tambin ha ido cambiando el sistema de numeracin, cambiando a 5.0 en lugar de 1.5. A su vez, y a partir de la versin 1.2, el nombre "J2SE" (Java 2 Platform, Standard Edition), reemplaz a JDK para distinguir la plataforma base de J2EE (Java 2 Platform, Enterprise Edition) y J2ME (Java 2 Platform, Micro Edition).
55
MDULO 2
A partir de la versin 5 se ha quitado el 2 del nombre, quedando la nomenclatura Java SE, Java EE y Java ME respectivamente Cada una de estas plataformas, contienen tanto una JDK (o entorno de desarrollo y ejecucin) como un JRE (o Java Runtime Environment, solamente utilizado en ejecucin), tambin llamado JVM. En este curso, solamente nos centraremos en el JDK del Java SE.
Desde la versin 1.4 de J2SE, la evolucin del lenguaje de programacin Java ha sido regulada por el JCP (Java Community Process), que utiliza Java Specification Requests (JSRs) para proponer y especificar cambios en la plataforma Java. El lenguaje en s mismo est descrito en el Java Language Specification (JLS), o Especificacin del Lenguaje Java. Los cambios en los JLS son gestionados en JSR 901. Veamos a continuacin un breve resumen de las versiones y los cambios importantes que hubo en cada una de ellas: JDK 1.0: Aparece el 23 de Enero de 1996. JDK 1.1: Aparece el 19 de Febrero de 1997. Los cambios que
incluye son: 56
AWT (Abstract Windowing Toolkit). Clases internas (inner clases), JavaBeans, JDBC (Java
Database Connectivity) para la integracin con bases de datos, RMI (Remote Method Invocation) SDK 1.2: Aparece el 8 de diciembre de 1998, con el nombre en
clave Playground. Esta y las siguientes versiones fueron recogidas bajo la denominacin Java 2. Otras mejoras aadidas incluan: La palabra reservada (o keyword) strictfp, Reflexin en la programacin (Reflection API) La API grfica, Swing, fue integrada en las clases bsi-
compilador JIT (Just in Time) por primera vez El Java Plug-in para ejecucin de Java en los navegado-
Kestrel. Los cambios ms notables fueron: La inclusin de la mquina virtual de HotSpot JVM (la
JVM de HotSpot fue lanzada inicialmente en abril de 1999, para la JVM de J2SE 1.2) RMI fue cambiado para que se basara en CORBA JavaSound API 57
MDULO 2
(JNDI) en el paquete de bibliotecas principales (anteriormente disponible como una extensin) Java Platform Debugger Architecture (JPDA)
clave Merlin. Este fue el primer lanzamiento de la plataforma Java desarrollado bajo el JCP como JSR 59. Los cambios ms notables fueron: Palabra reservada o keyworkd assert Expresiones regulares modeladas al estilo de las expre-
encapsular la excepcin de bajo nivel original. Non-blocking NIO (New Input/Output) Logging API API I/O para la lectura y escritura de imgenes en for-
matos como JPEG o PNG Parser XML integrado y procesador XSLT (JAXP) Seguridad integrada y extensiones criptogrficas (JCE,
JSSE, JAAS) Java Web Start incluido (El primer lanzamiento ocurri
en marzo de 2001 para J2SE 1.3) JDK 5.0: Aparece el 30 de septiembre de 2004 con el nombre
clave Tiger. Los cambios ms notables fueron: Plantillas (generics) que proporcionan conversion de ti-
58
nes y elimina la necesidad de la mayora de conversion de tipos (type casting). Metadatos, tambin llamados anotaciones, permite a
estructuras del lenguaje como las clases o los mtodos, ser etiquetados con datos adicionales, que puedan ser procesados posteriormente por utilidades de proceso de metadatos. Autoboxing/unboxing o conversiones automticas entre
tipos primitivos (como los int) y clases de wrapper para tipos primitivos (como los Integer). Enumeraciones; la palabra reservada enum crea una
typesafe, lista ordenada de valores (como Dia.LUNES, Dia.MARTES, etc.). Anteriormente, esto solo poda ser llevado a cabo por constantes enteras o clases construidas manualmente. Varargs o nmero de argumentos variable. El ltimo
parmetro de un mtodo puede ser declarado con el nombre del tipo seguido por tres puntos (por ejemplo: void drawtext(String... lines)). En la llamada al mtodo, puede usarse cualquier nmero de parmetros de ese tipo, que sern almacenados en un array para pasarlos al mtodo. Bucle for mejorado. La sintaxis para el bucle for se ha
extendido con una sintaxis especial para iterar sobre cada miembro de un array o sobre cualquier clase que implemente el interfaz Iterable, como la clase estndar Collection JDK 6.0: Aparece el 11 de diciembre de 2006 con el nombre
clave Mustang. Los cambios ms importantes introducidos en esta versin son: Incluye un nuevo marco de trabajo y APIs que hacen
posible la combinacin de Java con lenguajes dinmicos como PHP, Python, Ruby y JavaScript. 59
MDULO 2
las ltimas especificaciones para Servicios Web, como JAX-WS 2.0, JAXB 2.0, STAX y JAXP. Mejoras en la interfaz grfica y en el rendimiento. Incluye JavaDB (el conocido Derby de Apache).
listan los directorios donde se encuentran los ejecutables de los programas instalados en una mquina. En el caso del JDK, se encuentran en el directorio bin de la instalacin. CLASSPATH: Variable de entorno del Sistema Operativo en la
que se le indican donde se van a encontrar las clases Java para la compilacin y ejecucin de los programas. Esta variable solo ser necesaria en la ejecucin de los programas Java. Desde el JDK 1.4.0 si no hay variable CLASSPATH definida, el JDK asume el . (punto), es decir, el directorio desde donde ejecutemos las herramientas como punto de partida para buscar.
2.1 Contenido
A continuacin se muestran que directorios contiene el JDK y para que se utilizan: 60
/bin: las herramientas y utilidades del JDK (ejecutables). /db: gestor de base de datos (nuevo de la versin 6.0). /lib:las libreras del JDK, utilidadas por l mismo. /include: los archivos C/C++ utilizados para construir la JVM. /demo: una variedad de ejemplos escritos en Java. /jre: la JVM sin herramientas de desarrollo /src.zip: el cdigo fuente de las APIs Java.
2.2 Componentes
A continuacin se muestran los componentes que conforman el JDK. Existe javac.exe: Compilador de Java. java.exe: Intrprete de Java (JVM). appletviewer.exe: Intrprete de applets Java. jdb.exe: Depurador de Java. javadoc.exe: Generador de documentacin. javah.exe: Integrador de C y C++ (JNI). javap.exe: Desensamblador. online acerca del JDK en la siguiente URL
documentacin
http://java.sun.com/javase/6/docs/api/index.html
MDULO 2
gramas Java (al menos en entornos de desarrollo). Mencionamos a continuacin las mas importantes y las URLs de referencia: Eclipse: Es Open Source. Es la herramienta grfica que utiliza-
remos durante el curso. http://www.eclipse.org (ver la Unidad Instalacin del JDK y Eclipse para su instalacin) Rational Application Developer: Es de IBM
NetBeans IDE: Es Open Source. http://www.netbeans.org Sun Java Studio Creator: Es de Sun
http://www.codegear.com/products/jbuilder
PRCTICA A: Requiere instalar el JDK. Desde una sesin de DOS, ir a un directorio distinto del de la instalacin del JDK y ejecutar los comandos java.exe -version
62
y javac.exe
En el caso de que no aparezcan correctamente la salida de los comandos mencionados anteriormente, verificar el valor de la variable de entorno PATH comprobando que contiene el directorio bin donde se haya instalado el JDK.
PRCTICA B: Requiere instalar el JDK. Desarrollar un programa Java que muestre por pantalla el texto Hola Mundo! con el JDK de Sun.
63
MDULO 2
En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS y ajustar la variable PATH para que el Sistema Operativo sepa encontrar las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le aadimos %PATH%.
Ajustar la variable CLASSPATH para que las herramientas del JDK sepan encontrar nuestras clases Java. Tenemos dos opciones, o aadir el . (punto) y siempre ejecutar las herramientas en el directorio donde se encuentre el cdigo, o aadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para respetar el valor que ya tuviese la variable CLASSPATH le aadimos %CLASSPATH%.
64
Ahora arrancamos un editor de texto (por ejemplo Notepad) para escribir el cdigo fuente de nuestro programa que guardaremos en el fichero Practica1.java; el nombre del fichero debe ser exactamente igual (incluyendo maysculas y minsculas) al de la clase Java que vamos a desarrollar.
65
MDULO 2
Compilamos el programa Java con el compilador javac. Al compilador hay que darle el nombre del fichero incluyendo su extensin. 66
Si no sale ningn mensaje significa que todo ha ido bien y que ha creado el bytecode, es decir, Practica1.class
Por ltimo, ejecutamos el programa Java con la JVM java. A la JVM hay que darle el nombre del fichero del bytecode sin la extensin.
67
MDULO 2
PRCTICA C: Requiere instalar Eclipse. Desarrollar un programa Java que muestre por pantalla el texto Hola Mundo! con Eclipse Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe Seleccionar la ubicacin del workspace (o rea de trabajo).
Cerrar la ventana de bienvenida si aparece (esta ventana aparece la primera vez que se arranca Eclipse).
68
69
MDULO 2
70
Crear una clase Java nueva llamada Practica2 con el mtodo main.
71
MDULO 2
Seleccionar Finish Escribir el cdigo dentro del mtodo main y salvar con Ctrl + S o File -> Save
72
Por defecto, en eclipse, al salvar los cambios realizados en un fichero, se realiza la compilacin de las clases que estn en el worskpace. En el caso de producirse algn error de compilacin, se pueden ver en la vista Problems
Seleccionando la clase Java, con el botn derecho del ratn ejecutarla como Java Application
73
MDULO 2
74
En este unidad hemos visto la historia del JDK desde su comienzo hasta el momento actual, viendo las distintas posiblidades de desarrollo, va el JDK directamente (entorno no grfico) o va los entornos grficos o IDEs, tales como Eclipse, Rational Application Development ... Se han visto tambin el contenido y componentes que forman un JDK y dos variables muy importantes a tener en cuenta en entornos de desarrollo Java que son PATH y CLASSPATH.
MDULO B
Sintxis
Tema 2.3
ndice de la unidad:
1. Comentarios 2. Puntos y coma, bloques y espacios en blanco 3. Identificadores 4. Variables 5. Tipos de datos 6. Variables primitivas versus complejas 7.
En esta unidad trataremos en detalle la sintaxis del lenguaje de programacin Java. Dicha sintaxis es comprobada por el compilador y en caso de no ser correcta, este nos indicar los errores o avisos existentes. Por defecto, no se pueden ejecutar programas Java con errores de compilacin, por lo que la sintaxis del programa debe ser 100% correcta.
1. Comentarios
Los comentarios son lneas de cdigo que no son ejecutadas en tiempo de ejecucin, ni siquiera son incluidas en el byte code compilado. Estos comentarios, permiten incluir explicaciones acerca de qu es lo que est haciendo nuestro cdigo, documentacin, inhabilitar lneas de cdigo que ya no son necesarias en runtime, etc. Existen tres formas distintas de escribir los comentarios: // comentario de una sola lnea. Abarca desde el comienzo del
comentario // hasta el final de lnea. /* */ Comentario de una o ms lneas. Abarca desde el co-
mienzo del comentario /* hasta el final del mismo */ /** */ Comentario de documentacin, utilizado por la
herramienta javadoc.exe. Abarca desde el comienzo del comentario /** hasta el final del mismo */.
Ejemplo: A continuacin se muestra un ejemplo con los distintos ti-
79
MDULO 2
80
Otro concepto importante a tener en cuenta en Java es el de bloque de cdigo. Un bloque es un conjunto de sentencias (de 0 a n) agrupadas entre llaves ({ }). Los bloques pueden estar anidados. Suelen utilizarse conjuntamente con las sentencias de control de flujo (ver punto 8), pero tambin pueden utilizarse, por ejemplo, para minimizar el mbito de ciertas variables, como son las variables de bloque (ver punto 4.2).
Ejemplo: A continuacin se muestra un ejemplo de bloques de cdi-
Java permite los espacios en blanco entre elementos de cdigo fuente. Son utilizados principalmente para separar cada uno de los elementos de la sintaxis Java (al menos un espacio en blanco como mnimo) y mejorar el entendimiento del cdigo (el nmero de espacios utilizado para este propsito es irrelevante).
Ejemplo: A continuacin se muestran ejemplos donde los espacios
se utilizan como separadores de elementos de la sintaxis (entre int e i, y entre int y j entre otros) y como mejoras para el entendimiento del cdigo:
81
MDULO 2
3. Identificadores
Son los nombres unvocos que se le dan a las clases, mtodos y variables. Hay que tener presente las siguientes reglas: El identificador debe empezar por una letra, subrayado (_) o
dlar ($). Despus del primer carcter se pueden usar nmeros. Java distingue entre maysculas y minsculas (es case sensi-
tive). Los identificadores VARIABLE y variable son dos identificadores distintos. Nunca pueden coincidir con una keyword o palabra reservada
del lenguaje. A continuacin se muestra un listado de las keyword mas utilizadas en Java y que por tanto tienen un significado especial para el lenguaje
82
$va-
riable2, CONSTANTE, nombre_usuario, nombreUsuario, _variable_sistema Ejemplo: Los siguientes identificadores no son vlidos: 1variable,
4. Variables
Una variable es un contenedor de datos identificado mediante un identificador o nombre. Dicho identificador se utilizar para referenciar el dato que contiene. Toda variable debe llevar asociado un tipo que describe el tipo de dato (ver punto 5) que guarda. Por tanto, una variable tiene:
4. 1 Declaracin de variables
83
MDULO 2
La declaracin es la sentencia mediante la cual se define una variable, asignndola un tipo y un identificador. El formato es tipo identificador;
Ejemplo: int contador; // tendr el valor por defecto 0
Adicionalmente se le puede asignar un valor inicial mediante una asignacin. El formato es tipo identificador = valor;
Ejemplo: int contador = 10;
En el caso de que no se le asigna un valor, se inicializar con el valor por defecto para ese tipo (veremos los distintos tipos y sus valores por defecto en el punto 5 Tipos de Datos).
zar solamente asociados a la clase a la que pertenecen. Parmetros de mtodo. Se pueden utilizar solamente en el
mtodo del cual son parmetros. Variables locales: (o de mtodo) siempre hay que inicializar-
las. Solamente puede accederse a ellas, dentro del mtodo donde han sido declaradas. das. Variables de bloque: siempre hay que inicializarlas. Solamente
puede accederse a ellas, dentro del bloque donde han sido declara-
84
En el caso de que se declaren variables con el mismo identificador en mbitos distintos (en el mismo no se puede), tienen preferencia las del mbito ms interno. Las variables de bloque tienen preferencia frente a las locales; estas tienen preferencia frente a los parmetros y por ltimo las de menor preferencia son los atributos.
Ejemplo: El siguiente ejemplo muestra el error de compilacin al in-
85
MDULO 2
86
5. Tipos de datos.
En Java existen dos tipos de datos genricos: Tipos Primitivos. Existen ocho tipos de datos primitivos clasifi Lgico: boolean. Carcter: char. Nmeros enteros: byte, short, int y long. Nmeros reales: double y float.
Se suelen utilizar en las sentencias de control de flujo del tipo bifurcaciones del tipo if-then-else (ver punto 8).
MDULO 2
Un carcter especial con \ por delante: \n, \t, etc. Un cdigo UNICODE: \uxxxx (donde xxxx es un valor en
cio en blanco.
Ejemplos: char letra1 = a; char letra2 = \n; char letra3 = \u0041; char letra4; // su valor es null
Para las cadenas de caracteres existe un tipo complejo: la clase String que se ver en ms detalle en la Unidad 2.6 Clases bsicas. Se suelen utilizar para el tratamiento de caracteres, ya sea como caracteres individuales dentro de un String, caracteres contenidos en un fichero, etc.
88
Un valor octal: 077 (comenzando por cero). Un valor hexadecimal: 0xBAAC El valor por defecto es 0.
Ejemplos: byte unByte = 12; short unShort; // tiene el valor 0 short unShort; // tiene el valor 0 int unInt = -199; int otroInt = 065; long unLong = 2; (o long unLong = 2L;) long otroLong = 0xABCD;
Se suelen utilizar en operaciones arimticas, en sentencias de control de tipo bucle (en concreto la sentencia for y el tipo int), etc.
plataforma. Sus posibles valores son: Un valor decimal entero: 2 (por defecto para tipo int). Un valor decimal real: 0.17 o 6.02E23 (por defecto double). Un valor decimal real: 0.17F o 0.17D (redundante).
89
MDULO 2
Se suelen utilizar para tener una lista de posibles valores asociados a una variable y solamente dichos valores.
El siguiente ejemplo muestra el valor de variables de distintos tipos con sus valores asignados en la declaracin
MDULO 2
Un tipo de dato nmerico puede llegar a convertirse a otro tipo. Existen cuatro entornos de conversin en Java: float. long Llamada a mtodos con parmetros. Por ejemplo: f(long p) -> Asignacin. Por ejemplo: long l = 42; // un int se convierte en Promocin aritmtica. Por ejemplo: de short a int y este a
f(5) //se llama a un mtodo con un int y se convierte a un long Casting. Por ejemplo: int i = (int)42L //un long se convierte en
int. Ver la explicacin de downcasting. Las conversiones implcitas se resuelven en tiempo de compilacin. El upcasting (de un tipo ms pequeo convertirlo a uno ms grande) se realiza implcitamente. El downcasting (de un tipo ms grande convertirlo a uno ms pequeo) se realizan explcitamente (hay que indicar a que tipo se quiere convertir) y se resuelve en tiempo de ejecucin. Nota: puede perderse informacin, por lo que se obliga a que sean realizados explcitamente.
te:
Una variable de tipo complejo contiene una referencia (puntero) a la zona de memoria donde est el objeto:
92
7. Operadores
Los operadores realizan funciones sobre uno, dos o tres operandos (op). Por tanto, una primera clasificacin puede ser esta: Operadores unarios: pueden ser de tipo prefijos o postfijos.
Operadores ternarios: op ? op : op
Ejemplo: contador > 2 ? true : false; // es similar a un if-then-else
Los operadores siempre devuelven un valor que depende del operador y del tipo de los operandos. Otra posible clasificacin es por la naturaleza del operador: Aritmticos Relacionales Condicionales De desplazamiento 93
MDULO 2
con las variables de tipo String, porque en este caso concatena los valores. - : resta dos operandos op1 op2 * : multiplica dos operandos op1 * op2 / : divide dos operandos op1 / op2 % : calcula el resto de la divisin op1 % op2
Los valores que devuelven estos operadores depende de los tipos de los operandos: int: cuando ninguno de los operandos es float, double o long.
En el caso del operador % siempre devuelve un int. long: cuando ninguno de los operandos es float o double y hay
al menos uno que es long. float: cuando ninguno de los operandos es double y hay al
menos uno que es float. double: cuando al menos hay uno de los operandos es double.
94
short o char. -op: cambia el signo al operando. ++op: incrementa al operando en 1 (evaluando el operando
antes de decrementarse).
Ejemplo: En el ejemplo siguiente se muestran los operadores autoin-
MDULO 2
>: compara si un operando es mayor que otro op1 > op2 <: compara si un operando es menor que otro op1 < op2 ==: compara si un operando es igual que otro op1 == op2.
Cuidado con no confundir con el operador de asignacin = !=: compara si un operando es distinto que otro op1 != op2 >=: compara si un operando es mayor o igual que otro op1
>= op2 <=: compara si un operando es menor o igual que otro op1
<= op2 Todos estos operandos devuelven un boolean indicando si cumple la comparacin.
Ejemplo: if (5 < 7) { ... } // La condicin se ejecutar al devolver el
ros op1 && op2 ||: OR lgico. Comprueba si uno de los dos operandos es ver-
tantas veces como indique el segundo operando op1 >> op2. Realiza la misma funcin que multiplicar por 2, tantas veces se desplace. <<: desplaza los bits del primer operando hacia la izquierda
tantas veces como indique el segundo operando op1 << op2. Realiza la misma funcin que dividir por 2, tantas veces se desplace. >>>: desplaza los bits del primer operando hacia la derecha
tantas veces como indique el segundo operando pero sin signo op1 >>> op2. Realiza la misma funcin que multiplicar por 2, tantas veces se desplace, pero sin tener en cuenta la posicin de signo.
Ejemplo: En los siguientes ejemplos se muestran los operadores de
desplazamiento
97
MDULO 2
uno si los bits de ambos operandos son uno) op1 & op2. Cuidado con no confundir con el operador lgico &&
uno si alguno de los bits de los operandos es uno) op1 | op2. Cuidado con no confundir con el operador lgico ||
98
uno si alguno de los bits de los operandos es uno, pero no los dos a la vez) op1 ^ op2
= op2
99
MDULO 2
mero op1 *= op2 /=, %=, &=, |=, ^=, <<=, >>=, >>>=: Similar al anterior,
op1? then op2 : else op3) op1?op2:op3 [] : utilizado para declarar, crear y acceder a arrays (se vern
en la Unidad 3.1). . : utilizado para acceder a los atributos y mtodos de los ob-
jetos (se vern en la Unidad 2.4). (parmetros) : utilizado para pasar parmetros a un mtodo. (tipo) : utilizado para realizar castings (conversiones de tipo). new : utilizado para crear objetos nuevos (se ver en la Uni-
100
con ms detalle en la Unidad 3.5 Manejo de excepciones. De ruptura: break, continue, label: y return.
while(expresin) { sentencias; } La sentencia do-while es parecida a la sentencia while pero asegura que como mnimo el bloque de cdigo se ejecuta una vez.
do { sentencias; } while(expresin);
for(inicializacin; terminacin; incremento) { sentencias; } Las variables definidas en la sentencia de inicializacin son locales al bloque. Por tanto dejan de existir una vez se haya terminado el bucle.
Ejemplo: se muestra un ejemplo de las sentencias de control de tipo
101
MDULO 2
Las variables definidas en la sentencia de inicializacin son locales al bloque. Por tanto dejan de existir una vez se haya terminado el bucle.
Ejemplo: se muestra un ejemplo de la sentencia de control for/in public void listar(int[] param) { for(int i: param) System.out.println(i); }
Bsicamente, se trata de una simplificacin a la hora de codificar. Es decir, al final, el compilador convierte el cdigo en una sentencia for convencional como la siguiente: 102
public void listar(int[] param) { int i = 0; for(int j=0; j<param.length; j++) i = param[j]; System.out.println(i); }
if(expresin) { sentencias; } else { sentencias; } Las sentencias if pueden estar concatenadas. Su sintaxis sera:
103
MDULO 2
public void evaluar(int param) { if (param < 5) { //ejecutamos algo } else if (param >=5 && param < 10){ //ejecutamos algo } else { //ejecutamos algo } }
104
mo de la sentencia switch. Por tanto, salta a la siguiente lnea de cdigo despus del bucle o switch. continue: sirve para detener la ejecucin del bloque de cdigo
de un bucle y volver a evaluar la condicin de este. return: sirve para finalizar la ejecucin de un mtodo (y devol-
ver un valor en el caso de ser necesario). Nota: Las guas de programacin estructurada prohiben el uso de estas sentencias o aconsejan un uso muy lmitado para facilitar la legibilidad y mantenimiento del cdigo
105
MDULO 2
PRCTICA A: Identificar que sentencias son correctas y cules no (se irn utilizando las variables segn se va avanzando en el ejercicio): 1. int x = 34.5; 2. boolean boo = x; 3. int g = 17; 4. int y = g; 5. y = y + 10; 6. short s; 7. s = y; 8. byte b = 3; 9. byte v = b; 10. short n = 12; 11. v = n; 12. byte k = 128; 13. int p = 3 * g + y;
Solucin: 1. int x = 34.5; -> int x = (int)34.5; // Posible con downcasting 2. boolean boo = x; -> No hay solucin 3. int g = 17; 4. int y = g; 5. y = y + 10; 6. short s; 7. s = y; -> s = (short)y; // posible con downcasting 8. byte b = 3; 9. byte v = b; 10. short n = 12; 11. v = n; -> v = (byte)n; // posible con downcasting 12. byte k = 128; -> byte k = (byte)128; // posible con downcasting 13. int p = 3 * g + y;
PRCTICA B: Identificar si este cdigo compila bien. Si no compila solucionarlo. Si compila decir cul sera la salida. public class Temp { public static void main(String[] args) { int x = 1; 106
} }
Solucin: El cdigo compila bien. Pero entra en un bucle infinito. Habra que modificarlo con la lnea roja y saldra la palabra Hola siete veces por pantalla. public class Temp { public static void main(String[] args) { int x = 1; while(x<10) { x = x + 1; if(x>3) { System.out.println("Hola"); } } } }
PRCTICA C: Identificar si este cdigo compila bien. Si no compila solucionarlo. Si compila decir cul sera la salida. public class Temp { public static void main(String[] args) { int x = 5; while(x>1) { x = x - 1; if(x<3) { System.out.println("Hola"); } } } } Solucin: Compila y saldra la palabra Hola dos veces por pantalla.
107
MDULO 2
PRCTICA D: Al siguiente programa Java le falta un trozo de cdigo public class Temp { public static void main(String[] args) { int x = 0; int y = 0; while(x<5) { //TROZO DE CODIGO A SUSTITUIR System.out.print(x + + y + ); x = x + 1; } } } Seleccionar para cada trozo de cdigo de la izquierda, la salida por pantalla al ejecutar el programa anterior con ese trozo de cdigo
Solucin
108
PRCTICA E: Desarrollar un programa Java que muestre por pantalla los nmeros primos del 1 al 1000 y todos los aos bisiestos entre el ao 2000 y el 3000. Vamos a realizar la prctica con el con el JDK de Sun. En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le aadimos %PATH%.
109
MDULO 2
Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan encontrar nuestras clases Java. Tenemos dos opciones, o aadir el . (punto) y siempre ejecutar las herramientas en el directorio donde se encuentre el cdigo, o aadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para respetar el valor que ya tuviese la variable CLASSPATH le aadimos %CLASS-
110
PATH%.
Ahora arrancamos un editor de texto (por ejemplo Notepad) para escribir el cdigo fuente de nuestro programa que guardaremos en el fichero PracticaE.java; el nombre del fichero debe ser exactamente igual (incluyendo maysculas y minsculas) al de la clase Java que vamos a desarrollar.
111
MDULO 2
Escribimos el cdigo y salvamos los cambios. Cerramos el Notepad. En la Unidad 2.4 veremos el concepto de clase y mtodo main. Mientras tanto, nuestro cdigo estar incluido entre las lnea de cdigo public class PracticaE { public static void main(String[] args) { } }
112
Compilamos el programa Java con el compilador javac. Al compilador hay que darle el nombre del fichero incluyendo su extensin.
Si no sale ningn mensaje significa que todo ha ido bien y que ha creado el bytecode, es decir, PracticaE.class
Por ltimo, ejecutamos el programa Java con la JVM java. A la JVM hay que darle el nombre del fichero del bytecode sin la extensin.
113
MDULO 2
Ahora realizaremos la misma practica con Eclipse Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe Seleccionar la ubicacin del workspace (o rea de trabajo).
Cerrar la ventana de bienvenida si aparece (esta ventana aparece la primera vez que se arranca Eclipse).
114
115
MDULO 2
116
Crear una clase Java nueva llamada PracticaE con el mtodo main.
117
MDULO 2
Seleccionar Finish Escribir el cdigo dentro de la clase y salvar con Ctrl + S o File -> Save
118
Por defecto, en eclipse, al salvar los cambios realizados en un fichero, se realiza la compilacin de las clases que estn en el worskpace. En el caso de producirse algn error de compilacin, se pueden ver en la vista Problems Seleccionando la clase Java, con el botn derecho del ratn ejecutarla como Java Application
119
MDULO 2
120
En esta unidad hemos visto la sintaxis del cdigo Java, aprendiendo a utilizar comentarios, delimitar una sentencia Java con el ; y el uso de los espacios en blanco. Se han definido los Identificadores, las Keywords, las Variables y los mbitos donde se pueden utilizar: Atributos Parmetros de mtodo. Variables locales Variables de bloque Se han visto los distintos Tipos de datos: tipos primitivos: Lgico: boolean Carcter: char. Nmeros enteros: byte, short, int y long. Nmeros reales: double y float. tipos complejos o clases: viendo el tipo especial enum
Se han visto adems los distintos tipos de Operadores: Aritmticos Relacionales Condicionales De desplazamiento Lgicos De asignacin. Otros Por ltimo se han determinado los distintos tipos de Sentencias de control de flujo, que permiten ejecutar el cdigo de una manera no secuencial: Bucles: while, do-while, for y for/in Bifurcaciones: if-then-else y switch-case Gestin de excepciones: try-catch-finally y throw De ruptura: break, continue, label: y return.
MDULO B
ndice de la unidad:
En esta unidad veremos los cuatro paradigmas bsicos en los que se apoya los lenguajes orientados a objetos y por tanto el lenguaje de programacin Java.
1. Clases
Una clase representa la abstraccin de las operaciones y los datos (o atributos y mtodos) comunes a un conjunto de objetos, en relacin a nuestro mundo real. La implementacin de una clase Java debe ir en un fichero fsico en formato texto, con la extensin *.java y nombre idntico a la clase implementada.
Ejemplo: La clase MiClase debe ir en un fichero: MiClase.java
La declaracin de una clase Java se realiza mediante la keyword: class seguida de su nombre. La keyword siempre va precedida por un modificador de acceso: public, protected, private o default (nada) que ya explicaremos ms adelante. La implementacin de la clase ir contenida en un bloque { } justo despus de la declaracin. La sintaxis de la declaracin de una clase es: modificador_acceso class nombre_clase { }
Ejemplo: public class MiClase { }
1. 1 Atributos y mtodos
La implementacin de una clase consiste en una serie de: Atributos o datos. Mtodos u operaciones. 125
MDULO 2
La sintaxis de la declaracin de un atributo es la siguiente: modificador_acceso tipo nombre; // sin inicializacin modificador_acceso tipo nombre = valor_inicial;
Ejemplo: private boolean sw = true; private int i; // sin inicializar. Su valor por defecto es 0
Java SE 5.0 aade una novedad a la definicin de un mtodo mediante la caracterstica: varargs. Se permite definir un nmero indefinido de parmetros del mismo tipo mediante: ... Lo que recibimos es un array del tipo definido.
Ejemplo: public int suma(int params) { int acum = 0; for(int num: params) { // He usado tambin el nuevo for/in acum = acum + num; } return acum; }
Hay que tener en cuenta que podemos recibir, cero, uno o varios valores en dicho parmetro y que tiene las siguientes restricciones: 126
cin.
Solo puede usarse una vez por mtodo. Siempre debe ser el ltimo parmetro de todos en la defini-
Ejemplo: public int metodo(String param1, int param2, int params) { } // en este ejemplo, siempre se recibir param1 y param2, mientras que params ser una array de un tamao indeterminado hasta su ejecucin.
1. 2 Constructores
Existe un tipo de mtodo especial en Java llamado constructor. Se utiliza para la construccin (instanciacin) de objetos (o instancias) a partir de esa clase. En su implementacin se suele dar valores a los atributos para ese objeto para asegurar que los atributos estn inicializados. Su declaracin es idntica a la de los mtodos convencionales con dos salvedades: No tienen tipo de retorno. Se tiene que llamar igual que la clase.
127
MDULO 2
Si nuestra clase no tiene constructores, el compilador aade por defecto uno sin parmetros; pero si hemos declarado alguno, el compilador no aade nada.
1. 3 Sobrecarga de mtodos
Se dice que un mtodo est sobrecargado cuando existen dos mtodos con el mismo nombre y tipo de retorno pero con parmetros distintos. De esta manera podemos tener en una clase varios constructores.
Ejemplo: public MiClase() { } public MiClase(int param1, boolean param2) { }
Java SE 5.0 aade una novedad al respecto. Se permite la sobrecarga de mtodos cambiando tambin el tipo de retorno, pero siempre que: El mtodo que se est sobrecargando sea de una clase padre
(de la que heredamos directa o indirectamente). El nuevo tipo de retorno sea hijo del tipo de retorno del mto-
do original (es decir, que herede de l directa o indirectamente). Por tanto, no es vlido para tipos primitivos.
1. 4 Convenciones en Java
Aunque no est obligado por la sintaxis, existen una serie de convenciones respecto a en la nomenclatura de clases, mtodos y atributos, que todo programador de Java suele seguir para hacer mas legible el cdigo. 128
129
MDULO 2
2. Objetos
Los objetos en Java no son mas que variables de tipo complejo, frente a las de tipo primitivo. El tipo de un objeto es la clase de la que se ha instanciado o creado. La declaracin de un objeto es idntica a la declaracin de una variable de tipo primitivo: tipo identificador;
Ejemplo: Cuenta miCuenta;
El valor por defecto de un objeto sin inicializar es: null. La inicializacin de un objeto si que es algo distinta a la inicializacin de las variables de tipo primitivo: 130 Se utiliza el operador new.
Mientras que una variable de tipo complejo contiene una referencia (puntero) a la zona de memoria donde est el objeto:
Ejemplo:
131
MDULO 2
En ambos casos utilizaremos el operador . (punto). La sintaxis para acceder a un atributo de un objeto es la siguiente: objeto.atributo
Ejemplo: miCuenta.saldo = 0;
La sintaxis para acceder a un mtodo (lo que en Orientacin a Objetos se denominaba mensaje) es la siguiente: objeto.metodo([parametro,..]) 132
Ejemplo: miCuenta.reintegro(13.7);
La posibilidad de acceso a un atributo o a un mtodo de un objeto depender del modificador de acceso que exista en su definicin.
Ejemplo: partiendo de la siguiente definicin de la clase cuenta
133
MDULO 2
Las llamadas a mtodos se pueden encadenar para evitar tener que crear variables intermedias entre distintas ejecucines de mtodos: String s1 = new String(abc"); char c = s1.toUpperCase().charAt(0); Equivaldra a: String s1 = new String(abc"); String s2 = s1.toUpperCase(); char c = s2.charAt(0);
134
El parmetro args es un array (ver Unidad 3.1) donde permite pasarle argumentos al programa Java para su ejecucin, en caso de necesitarlos. Si las clases representan entidades que participan en la resolucin de un problema. En qu entidad tiene sentido incluir el mtodo main?. En ninguna. Por eso crearemos siempre una clase a parte (de ahi el denominarla truco), que solo tenga el mtodo main. Debido a que no est relacionado con ninguna clase en concreto, no se necesita la creacin de ningn objeto para llamarla.
ba puede ser eliminado. lidez. Se termina su mbito. Por lo que la variable deja de tener va-
jeto creado va new. Pero ojo!, el objeto al que referenciaba pun no se puede limpiar porque sigue referenciado por centro desde un atributo del objeto referenciado por
135
MDULO 2
cir.
3. Relacin de herencia
Se basa en la existencia de relaciones de generalizacin/especializacin entre clases. Las clases se disponen en una jerarqua, donde una clase hereda los atributos y mtodos de las clases superiores en la jerarqua. Es decir, definimos una especie de interfaz (API) para un grupo de clases relacionados mediante la herencia. Una clase puede tener sus propios atributos y mtodos adicionales a lo heredado. Una clase puede modificar los atributos y mtodos heredados. Las clases por encima en la jerarqua a una clase dada, se denominan superclases o clases padre. Las clases por debajo en la jerarqua a una clase dada, se denominan subclases o clases hijas. 136
Una clase puede ser superclase y subclase al mismo tiempo. Existen distintos tipos de herencia:
Simple. Solo puede heredar de una clase. Mltiple (no soportada en Java)
Ejemplo:
La implementacin de la herencia se realiza mediante la keyword: extends. La sintaxis de la declaracin de la herencia es la siguiente: modificador_acceso class nom_clase extends nom_clase { }
Ejemplo: public class MiClase extends OtraClase { }
Ejemplo:
137
MDULO 2
138
Esto significa que nuestras clases siempre van a contar con los atributos y mtodos de la clase Object por lo que es importante conocerlos. Algunos de sus mtodos ms utilizados son: public boolean equals(Object o); //Compara dos objetos y dice
despus de aplicarle un algoritmo hash. public Object clone(); //Devuelve una copia del objeto. public void finalize(); //Un mtodo llamado por el Garbage Co-
llector. public void wait(); public void notify(); public void notifyAll();
139
MDULO 2
3.2 Casting
El casting es una forma de realizar conversiones de tipos. Hay dos tipos de casting: UpCasting: conversin de un tipo en otro superior en la jerar-
qua de clases. No hace falta especificarlo. DownCasting: conversin de un tipo en otro inferior en la je-
rarqua de clases. Se especifica precediendo al objeto a convertir con el nuevo tipo entre parntesis.
Ejemplo:
140
141
MDULO 2
142
143
MDULO 2
Habr que tener muy en cuenta los parmetros que se envan y las conversiones por defecto para saber qu mtodo se ejecuta.
Ejemplo: Veremos la sobrecarga de un mtodo que recibe un float y un dou-
ble: public void miMetodo(float param) { } miObjeto.miMetodo(1.3); //llamar sin problemas al mtodo anterior Sobrecargamos el mtodo para que reciba un double. public void miMetodo(double param) { } miObjeto.miMetodo(1.3); //ya no llama al mtodo con float. Recordemos que un nmero real por defecto es double. Para seguir llamando al mtodo con float debemos especificarlo implcitamente: miObjeto.miMetodo(1.3F); o miObjeto.miMetodo((float)1.3); Ejemplo:
144
MDULO 2
Ejemplo: Lobo es mas especfico que Canino. Luego tiene sentido que Lobo
herede de Canino.
Debemos usar herencia cuando tengamos un comportamiento que se puede reutilizar entre varias otras clases del mismo tipo genrico.
Ejemplo: Las clases Cuadrado, Circulo y Triangulo tiene que calcular su rea
y permetro luego tiene sentido poner esa funcionalidad en una clase genrica como Figura.
No debemos usar herencia solo por el hecho de reutilizar cdigo. Nunca debemos romper las dos primeras reglas.
Ejemplo: Podemos tener el comportamiento cerrar en Puerta. Pero aunque
necesitemos ese mismo comportamiento en Coche no vamos a hacer que Coche herede de Puerta. En todo caso, coche tendr un atributo del tipo Puerta.
146
147
MDULO 2
this es una referencia al objeto actual. this se utiliza para acceder desde un objeto a atributos y mtodos (incluyendo constructores) del propio objeto. Existen dos ocasiones en las que su uso no es redundante: Acceso a un constructor desde otro constructor. Acceso a un atributo desde un mtodo donde hay definida una
148
4. Polimorfismo
Es otro de los paradigmas de la Orientacin a Objetos. Consiste en que una vez se ha definido una superclase para un grupo de subclases, cualquier instancia de esas subclases puede ser usada en el lugar de la superclase. Esto significa que podemos referenciar un objeto de una subclase mediante una referencia declarada como una de sus superclases. Ver punto 3.2 Casting para las conversiones de tipos.
Ejemplo: Object o = new String(Hola);
149
MDULO 2
Por tanto mediante el polimorfismo podemos asignar a una referencia de un tipo superior en la jerarqua de herencia, una instancia de un tipo inferior (que herede). Ahora bien, que la referencia sea de otro tipo no significa que los mtodos que se ejecuten sean distintos. Siguen siendo los de la instancia. Algunos usos habituales del polimorfismo en Java son:
150
Con el polimorfismo podemos desarrollar cdigo que no tiene que ser modificado por la introduccin en el programa de nuevas subclases o tipos debido a: Cambio en las especificaciones. 151
MDULO 2
Rediseo
mos nuevas figuras como Cuadrado, Ameba, etc. siempre y cuando hereden de la superclase Figura.
Ejemplo: Supongamos que necesitamos implementar una clase para
Ahora nos diden que en el mismo proyecto tambin necesitamos almacenar dos gatos. Tenemos distintas alternativas:
Crear una clase nueva MiLista2 Aadir a MiLista dos atributos nuevos del topo Gato y otro mtodo add() que reciba un Gato
Modificar MiLista para que maneje el tipo genrico Animal y as nos valga tanto para Lobos como pata Gatos e incluso otros animales en le futuro. Nos decidimos por este ltimo.
152
Hablando con un compaero de otro proyecto, nos comenta que en su proyecto necesita implementar una clas par almacenar dos Tringulos. Le podramos pasar nuestra clase si la hubiramos hecho ms genrica. No heredaba en Java todo de la clase Object? En Java encontraremos multitud de ejemplos que usen el Polimormismo con este fin.
153
MDULO 2
154
MDULO 2
El objetivo de un mtodo abstracto es forzar una interfaz (API) pero no una implementacin.
Ejemplo:
156
Qu ocurre si queremos reusar el diseo para un aplicativo de Tienda de Mascotas? Una primera aproximacin sera aadir a la clase Animal todos los mtodos especficos de una mascota como son jugar, vacunar. Automticamente todas las mascotas tendrn los mtodos necesarios. Pero tambin los tendrn las no mascotas. Y seguro que hay que retocar cada mascota reescribiendo sus mtodos porque tengan alguna peculiaridad. Modificamos la primera aproximacin definiendo los mtodos de las mascotas en la clase Animal como abstractos de manera que cada mascota los implemente.
157
MDULO 2
As todas las mascotas heredan el interfaz e implementan su comportamiento dependiendo de la mascota en concreto. Pero no solo el resto de animales heredarn tambin el interfaz si no que tienen que implementarlo aunque sea vaco.
158
Otra aproximacin sera introducir los nuevos mtodos solo en las mascotas. As ya no nos tenemos que preocupar de que haya clases que sin ser mascotas tengan mtodos de estas. Sin embargo esto implica otro tipo de problemas como que los programadores de mascotas tendrn que ponerse de acuerdo en el interfaz de estas y siempre llevarlo a raja tabla puesto que ahora no se hereda y el compilador no nos ayuda con los posibles errores. Otro inconveniente muy importante es que no tenemos posibilidad de usar el polimorfismo con las mascotas.
159
MDULO 2
La solucin que parece ptima, sera tener otra clase abstracta llamada Mascota con los mtodos abstractos de las mascotas. Y que todas las mascotas heredasen de ella. As, ya no nos tenemos que preocupar de que haya clases que sin ser mascotas tengan mtodos de estas. Todas las mascotas cumplirn forzosamente el API de las mascotas y el compilador nos ayudar a asegurarlo. Y tambin tendremos la posibilidad de usar el polimorfismo con las mascotas. Pero eso significa que habr clases que heredarn de dos clases a la vez y en Java no existe la herencia mltiple.
160
5. Interfaces
Los interfaces en Java nos solucionan en parte la no existencia de la herencia mltiple; habilitando as las posibilidades del polimorfismo en la herencia mltiple sin los problemas que esta conlleva. Los interfaces son un tipo de clase especial que no implementa ninguno de sus mtodos. Todos son abstractos. Por tanto no se pueden instanciar. La declaracin de un interface Java se realiza mediante la keyword: interface seguido de su nombre. La sintaxis de la declaracin de un interface es la siguiente: modificador_acceso interface nombre_interface { }
Ejemplo: public interface MiInterface
161
MDULO 2
{ }
Siguen siendo clases Java por lo que su cdigo fuente se guarda en un fichero texto de extensin *.java y al compilarlo se generar un *.class Los mtodos se definen como abstractos mediante la keyword: abstract. La sintaxis de la declaracin de un mtodo abstracto es la siguiente: modif_acceso abstract tipo_retorno nombre([tipo param,]);
El objetivo de un mtodo abstracto es forzar una interfaz (API) pero no una implementacin. De los interfaces tambin se hereda, aunque se suele utilizar ms el trmino implementa por la keyword utilizada. Se realiza mediante la keyword: implements. La sintaxis de la declaracin de la herencia de un interface es la siguiente: modif_acceso class nom_clase implements nom_interface[,nom_int.] { }
Ejemplo: public class MiClase implements MiInterface { }
Una clase puede heredar o implementar mltiples interfaces consiguiendo as la herencia mltiple. Y tambin un interface puede heredar de otros interfaces Una clase puede heredar de otra clase (como mximo de una) y a la vez heredar de mltiples interfaces. Un interface puede tambin definir constantes. Si una clase que hereda de un interface, no implementa todos los mtodos de este, deber ser definida como abstracta.
162
Ejemplo:
Un interface se trata como un tipo cualquiera. Por tanto, cuando hablamos de polimorfismo, significa que una instancia de una clase puede ser referenciada por un tipo interface siempre y cuando esa clase o una de sus superclases implemente dicho interface.
Ejemplo: Este sera el diseo final de la tienda de mascotas
163
MDULO 2
dispares pueden implementar el mismo interface. El objetivo de un mtodo abstracto es forzar una interfaz (API)
164
pase la prueba de Es-Un. Veremos por ejemplo, si un Circulo Es-Una Figura (por lo que heredar de Figura), pero que Figura no es un Circulo, ni un Triangulo .... por lo que no heredar de nadie. Haremos una subclase cuando necesitemos hacer una especia-
lizacin de la superclase mediante sobreescritura o aadiendo nuevos mtodos. Haremos una clase abstracta cuando queramos definir un gru-
po genrico de clases y adems tengamos algunos mtodos implementados que reutilizar. Tambin cuando no queramos que nadie instancie dicha clase. Haremos un interface cuando queramos definir un grupo gen-
rico de clases y no tengamos mtodos implementados que reutilizar. O cuando nos veamos forzados por la falta de herencia mltiple en Java.
165
MDULO 2
166
PRCTICA C: Identificar si hay algo mal en este cdigo,suponiendo que la clase Rectangulo existe.
Solucin: Estaba mal. El objeto miRect no est inicializado, por tanto vale null. Con null no podemos hablarnos.
167
MDULO 2
Contesta a las siguientes preguntas: 1. 2. 3. 4. 5. 6. 7. Cuntos atributos tiene la clase Cirujano?:__. Cuntos atributos tiene la clase MedicoDeCabecera?:__. Cuntos mtodos tiene la clase Medico?:__. Cuntos mtodos tiene la clase Cirujano?:__. Cuntos mtodos tiene la clase MedicoDeCabecera?:__. Puede un MedicoDeCabecera tratar pacientes?:___. Puede un MedicoDeCabecera hacer incisiones?:___.
Solucin: 1. 2. 3. 4. 5. 6. 7. Cuntos atributos tiene la clase Cirujano?:_1_. Cuntos atributos tiene la clase MedicoDeCabecera?:_2_. Cuntos mtodos tiene la clase Medico?:_1_. Cuntos mtodos tiene la clase Cirujano?:_2_. Cuntos mtodos tiene la clase MedicoDeCabecera?:_2_. Puede un MedicoDeCabecera tratar pacientes?:_SI__. Puede un MedicoDeCabecera hacer incisiones?:_NO__.
PRCTICA E: Desarrollar el siguiente programa tanto en la JDK de Sun como en Eclipse. Hay que tener en cuenta que hay que desarrollar los siguientes elementos:
168
Desarrollar una clase llamada Punto que: Tenga dos atributos private de tipo double. Tenga un constructor con dos parmetros de tipo double que inicialice los dos atributos. Tenga un constructor por defecto (sin parmetros) que inicialice los dos atributos al valor que se quiera. Tenga un getter para cada uno de los atributos. Tenga un mtodo calcularDistanciaDesde que recibe un parmetro de tipo Punto y que devuelve un double.
Desarrollar una clase llamada Circulo que: Tenga dos atributos private de tipo Punto y double. Tenga un constructor con dos parmetros de tipo Punto y double que inicialice los dos atributos. Tenga un constructor por defecto (sin parmetros) que inicialice los dos atributos al valor que se quiera. Tenga un constructor con tres parmetros de tipo double que inicialice los dos atributos. Tenga un getter para cada uno de los atributos. Tenga un mtodo calcularDistanciaDesde que recibe un parmetro de tipo Punto y que devuelve un double. Tenga un mtodo calcularArea que no recibe ningn parmetro y devuelve un double. Tenga un mtodo calcularPerimetro que no recibe ningn parmetro y devuelve un double.
Desarrollar una clase llamada Triangulo que: Tenga tres atributos private de tipo Punto. Tenga un constructor con tres parmetros de tipo Punto que inicialice los dos atributos. Tenga un constructor por defecto (sin parmetros) que inicialice los tres atributos al valor que se quiera. Tenga un constructor con seis parmetros de tipo double que inicialice los tres atributos. Tenga un getter para cada uno de los atributos. Tenga un mtodo calcularDistanciaDesde que recibe un parmetro de tipo Punto y que devuelve un double. Tenga un mtodo calcularArea que no recibe ningn parmetro y devuelve un double. Tenga un mtodo calcularPerimetro que no recibe ningn parmetro y devuelve un double.
Desarrollar una clase llamada Practica5a que en su mtodo main: Cree e inicialice dos objetos de la clase Punto y muestre la distancia entre ambos. Cree un objeto de la clase Circulo y muestre su rea, permetro y distancia a uno de los dos puntos creados al comienzo. Cree un objeto de la clase Triangulo y muestre su rea, permetro y distancia a un nuevo punto.
Nota 1: No seremos rigurosos con las matemticas y supondremos que los tringulos siempre son rectngulos. 169
MDULO 2
Nota 2: Para calcular la raz cuadrada de un nmero usaremos Math.sqrt(?) siendo ? el nmero.
Solucin con la JDK De Sun En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le aadimos %PATH%.
Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan encontrar nuestras clases Java. Tenemos dos opciones, o aadir el . (punto) y siempre ejecutar las herramientas en el directorio donde se encuentre el cdigo, o 170
aadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para respetar el valor que ya tuviese la variable CLASSPATH le aadimos %CLASSPATH%
Ahora arrancamos un editor de texto (por ejemplo Notepad) para escribir el cdigo fuente de cada uno de nuestras clases java; el nombre del fichero debe ser exactamente igual (incluyendo maysculas y minsculas) al de la clase Java que vamos a desarrollar. Empezamos con Punto.java
171
MDULO 2
Escribimos el cdigo y salvamos los cambios. Cerramos el Notepad. Los atributos les aplicamos el modificador de acceso private (los veremos en detalle en la Unidad 2.5)
Compilamos el programa Java con el compilador javac. Al compilador hay que darle el nombre del fichero incluyendo su extensin. 172
Todava no podemos ejecutar ningn programa Java, porque no tenemos un mtodo main al que llamar y nos faltan por desarrollar ms clases. Creamos con el notepad las siguientes clases y las compilamos al igual que hemos hecho con el Punto.java : Circulo.java y Triangulo.java
173
MDULO 2
174
Por ltimo crearemos nuestra clase truco con el mtodo main que guardaremos en el fichero PracticaE.java
175
MDULO 2
Salvamos los cambios y compilamos la clase con javac. Debemos de tener los bytecode de todas las clases
176
Ahora si que podemos ejecutar el programa llamando a la clase PracticaE mediante el ejecutable java. La salida por consola queda como sigue:
Ahora realizaremos la misma practica con Eclipse Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe Seleccionar la ubicacin del workspace (o rea de trabajo).
177
MDULO 2
178
179
MDULO 2
Crear una clase Java nueva llamada Punto sin el mtodo main
180
Seleccionar Finish Escribir el cdigo dentro del bloque de la clase y salvar con Ctrl + S o File -> Save
181
MDULO 2
182
Crear una clase Java nueva llamada PracticaE con el mtodo main.
183
MDULO 2
184
Seleccionando la clase Java PracticaE, con el botn derecho del ratn ejecutarla como Java Application
185
MDULO 2
186
En esta unidad hemos visto los cuatro paradigmas bsicos en los que se apoya los lenguajes orientados a objetos y por tanto el lenguaje de programacin Java. Clases, donde su implementacin consta normalmente de una serie de atributos y mtodos. Existen ciertos mtodos especiales llamados Constructores, que permiten crear objetos. Se pueden sobrecargar los mtodos, teniendo el mismo nombre de mtodo y distintos parmetros. Objetos, que son instancias de una clase determinada. Para poder acceder a sus atributos y mtodos se utiliza el operador punto. El mtodo main se utiliza directamente sin la creacin de un objeto, para empezar la ejecucin de un programa Java. La eliminacin de los objetos en memoria se utiliza via el Garbage Collector. La relacin de herencia, se basa en la existencia de relaciones de generalizacin/especializacin entre clases. Todas las clases por defecto heredan de la clase Object Se puede generalizar o especializar entre las superclases y subclases mediante los casting. Se pueden reimplementar mtodos heredados mediante la sobrescritura de mtodos. La relacin de polimorfismo, consiste en que una vez se ha definido una superclase para un grupo de subclases, cualquier instancia de esas subclases puede ser usada en el lugar de la superclase. Utilizacin de clases abstractas, o genricas que no pueden ser instanciadas. Si se utilizan mtodos abstractos, la clase debe ser identificada como abstracta, y alguna de las subclases tiene que implementar dichos mtodos. Los Interfaces, que proporcionan el API que cualquier clase que implemente dicho interface debe de desarrollar.
PA-
MDULO B
Otros conceptos
Tema 2.5
ndice de la unidad:
1. Paquetes 2. Modificadores de acceso 3. Mtodos estticos 4. final 5. Paso por valor o por referencia 6. Cosas que ocurren por defecto 7. Instanceof
En las unidades anteriores se ha visto la sintaxis de Java, y paradigmas bsicos de la programacin orientada a objetos. Existen otros conceptos, a nivel organizativo de las clases y de acceso de las clases y objetos que son los que veremos en esta Unidad.
1. Paquetes
Los paquetes Java son una caracterstica ms del lenguaje que nos permite organizar el cdigo en grupos. Adicionalmente, ayudan a evitar colisiones en los nombres de las clases. De manera que en un programa que va a usar un framework (conjunto de clases con un propsito en concreto) de un tercero, tenga un 99% de seguridad de que no tiene ninguna clase con el mismo nombre, que las del framework. Para especificar el paquete al que pertenece una clase se utiliza la keyword: package. La sintaxis de la declaracin de un paquete es la siguiente: package nombre_del_paquete;
Ejemplo: es.java.aula.mentor.figuras;
El nombre de una clase no se limita solamente al identificador utilizado en la definicin, sino a la suma del paquete al que pertenece ms el del identificador: Nombre de paquete + Identificador de la Clase
Ejemplo: La clase Circulo del paquete es.java.aula.mentor.figuras es la clase
Por tanto, al ir a utilizar una clase debemos conocer siempre el paquete al que pertenece para poder referenciarla porque si no el compilador no va a saber encontrarla. Toda clase Java pertenece a un paquete. Si no se especifica nada, pertenece al paquete por defecto (que es un paquete raz sin nombre o nada, pero no est recomendado su uso). En el caso de especificarlo, la sentencia package tiene que ser la primera lnea del fichero con el cdigo fuente de la clase.
191
MDULO 2
Existe una convencin aceptada por todos los desarrolladores en cuanto a la nomenclatura de los paquetes Java: Todas las palabras que componen el nombre del paquete van
organizacin o institucin invertido para intentar asegurar nombres unvocos y evitar colisiones.
Ejemplos: com.ibm.test es.miempresa.utilidades es.practicas.tema1
Para poder utilizar una clase en nuestro cdigo tenemos que escribir su nombre completo cada vez que la utilicemos: paquete + clase. Para mejorar la legibilidad del cdigo, existe otro mecanismo para facilitar la codificacin y facilitar la vida al desarrollador que es el uso de la keyword: import. La sintaxis de la declaracin de la sentencia es la siguiente: import nombre_del_paquete.nombre_de_la_clase; import nombre_del_paquete.*;
Las sentencias import se ubican entre la sentencia package y la definicin de la clase. Las clases importadas de esta manera pueden ser referenciadas en el cdigo directamente por su nombre de clase sin necesidad de escribir el paquete al que pertenecen. Un import genrico (es decir, con el *) importa solo las clases de ese paquete, pero no de los subpaquetes.
Ejemplo: Si se utiliza el import es.java.aula.* importar las clases del pa-
192
por
debajo
de
este,
como
es
el
caso
de
la
clase
es.java.aula.mentor.figuras.Circulo
Por tanto para utilizar una clase tenemos tres alternativas: Utilizar su nombre completo: paquete + clase (unidos
mediante el punto) Un import no implica la inclusin de cdigo como ocurre en un #include de C++. Simplemente son vas de acceso para buscar el cdigo. El cdigo se va cargando segn se necesita. Al igual que las clases Java tienen un reflejo en el Sistema de Archivos (una clase Java equivale a un fichero texto de extensin *.java), lo mismo ocurre con los paquetes Java. Los paquetes Java equivalen a directorios. Es decir, cada miembro del paquete (separado por puntos) se traduce a un directorio en el Sistema de Archivos.
Ejemplo: package es.java.aula.mentor.figuras; public class Circulo {...}
Para compilar una clase que pertenece a un paquete tenemos distintas opciones: Desde c:\trabajo ejecutamos: javac
es\java\aula\mentor\figuras\Circulo.java
193
MDULO 2
Desde
c:\trabajo\es\java\aula\mentor\figuras
ejecutamos:
javac Circulo.java Para ejecutar una clase solo tenemos una opcin posible: Desde cualquier punto del sistema Nota: ejecutamos: el java
es.java.aula.mentor.figuras.Circulo.java.
directorio
c:\trabajo debe estar en el CLASSPATH (o si estamos en el directorio c:\trabajo, con que estuviera el . en el CLASSPATH tambin sera suficiente) A continuacin mostramos distintos ejemplos de utilizacin de clases teniendo en cuenta los paquetes a los que pertenecen:
Ejemplo: Ambas clases estn en el paquete por defecto y por tanto se en-
cuentran.
194
Ejemplo: Las clases estn en paquetes distintos y se utilizan las clases con el
nombre completo
195
MDULO 2
Ejemplo: Las clases estn en paquetes distintos y se utilizan las clases con la
sentencia import
Ejemplo: Las clases estn en paquetes distintos y se utilizan las clases con la
196
MDULO 2
Las clases bsicas System, String, Math, etc pertenecen al paquete java.lang.*. (las veremos con ms detalle en la Unidad 2.6). Cmo compilaban todas nuestras prcticas si no conocamos los paquetes Java (y por tanto la keyword import)? La respuestas es porque el compilador, por defecto, siempre aade la siguiente lnea a nuestro cdigo: import java.lang.*; Aunque no es frecuente, es posible que provoquemos ambigedades en el uso de los imports, y por tanto errores de compilacin. Qu ocurre al usar una clase cuyo nombre existe a la vez en dos paquetes que hemos importado? Cul de las dos clases es la que se debe utilizar? En esos casos, hay que importar o referirse a la clase conflictiva mediante su identificador completo: paquete + clase.
Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que estn en
198
Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que estn en
paquetes distintos. Utilizamos la sentencia import genrico y en la clase conflictiva utilizamos el nombre completo.
Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que estn en
199
MDULO 2
Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que estn en
200
Hemos visto que existe el llamado paquete por defecto al que pertenecen todas aquellas clases que no indican de forma explcita un paquete determinado en su cdigo. Desde la versin 1.4.x, el compilador no permite importar desde una clase que pertenece a un paquete explcito, una clase que pertenece al paquete por defecto. Esto no tendra que ser un problema en la mayora de los casos porque siempre deberamos ubicar las clase en paquetes Java de forma explcita. Cuando consultamos el API, por ejemplo, via online en la documentacin de SUN http://java.sun.com/javase/6/docs/api/index.html, podemos apreciar la categorizacin de los paquetes y las clases que pertenecen a cada uno de ellos.
2. Modificadores de acceso
Hasta ahora hemos visto que podemos utilizar cualquier clase, mtodo y atributo desde cualquier punto de nuestro cdigo sin ningn tipo de problema. Pero el lenguaje de programacin Java, nos permite poder delimitar quin o desde donde se puede acceder a una clase, a un mtodo o a un atributo. Existen cuatro tipos de modificadores de acceso y por tanto, cuatro keywords. Las hemos ordenados de menor a mayor restriccin.
201
MDULO 2
public -> Pblico protected -> Protegido. -> Paquete, identificado por la ausencia de keyword. private -> Privado.
Los modificadores de acceso se utilizan en las definiciones de: Clases e interfaces: solo se puede utilizar public y package (o
paquete en castellano)
Atributos: se permiten cualquiera de los cuatro. Mtodos: se permiten cualquiera de los cuatro.
Ejemplo: Ejemplo de modificadores de acceso con atributos.
202
203
MDULO 2
clases
3. Mtodos estticos
Existen casos en los que nos encontramos con clases cuyos mtodos no dependen en absoluto de los atributo de la clase, y en todo caso de los parmetros de los mtodos. Por ejemplo, la clase java.lang.Math: Su mtodo round recibe un nmero decimal y lo devuelve
redondeado. Su mtodo sqrt recibe un nmero y devuelve su raiz cuadrada. Su mtodo min recibe dos nmeros y devuelve el menor.
Son mtodos que parece no pertenecer a una entidad concreta. Son genricos, globales, independientes de cualquier estado del objeto. Tiene sentido instanciar un objeto para ejecutar algo que no depende de nada de dicho objeto?
204
La respuesta es no. Y para ello contamos en Java con los mtodos estticos. Estn asociados a una clase solamente desde un punto de vista organizativo. Para definir un mtodo esttico utilizamos la keyword: static. La sintaxis de la declaracin es la siguiente: modifi_acceso static tipo_retorno nombre([tipo parametro,..]) { }
Ejemplo: public static void miMetodo() { }
Para ejecutar por tanto un mtodo esttico no hace falta instanciar un objeto de la clase. Se puede ejecutar el mtodo directamente sobre la clase.
Ejemplo: int a = Math.min(10,17); Mientras que los mtodos convencionales requieren de un objeto: String s = new String(Hola); int a = s.indexOf(a); No se puede realizar la siguiente llamada int a = String.indexOf(a);
Una
clase
puede
perfectamente
mezclar
mtodos
estticos
con
mtodos
convencionales. Un ejemplo clsico es el mtodo main: public static void main(String[] args) { }
Hay ciertas reglas que hay que tener en cuenta en el uso de mtodos estticos: Un mtodo esttico jams puede acceder a un atributo de
instancia (no esttico). Pero desde un mtodo convencional si que se puede acceder a
205
MDULO 2
206
Hay que tratarlos con cuidado puesto que son fuente de problemas difciles de detectar. Como todos los objetos de una misma clase comparte el mismo atributo esttico, si un objeto a modifica el valor del atributo, cuando el objeto b vaya a usar dicho atributo, lo usa con un valor modificado. Recordemos que sin embargo los atributos convencionales (de instancia) son propios de cada objeto. Los atributos estticos son cargados en memoria cuando se carga la clase. Siempre antes de que: Se pueda instanciar un objeto de dicha clase. Se pueda ejecutar un mtodo esttico de dicha clase.
207
MDULO 2
208
4. final
final es una keyword que modifica el funcionamiento de: Clases Atributos Mtodos
Definiendo una clase como final conseguimos que ninguna otra clase pueda heredar de ella. Para definir una clase final utilizamos la keyword: final. La sintaxis de la declaracin es la siguiente: 209
MDULO 2
210
211
MDULO 2
Por convencin, a la hora de programar, las constantes se suelen llamar con todas las letras en maysculas.
Ejemplo: Constantes ya existentes en las clases bsicas: java.lang.Math.PI: el nmero PI. java.lang.Math.E: el nmero E. javax.swing.SwingConstants.CENTER: centrado. java.awt.event.KeyEvent.VK_ENTER: tecla de intro.
212
En ocasiones cuando se crea una clase solo con constantes, se suele hacer mediante un interface, debido a que no es necesario tener ningn mtodo definido ni implementado.
213
MDULO 2
En C se decida mediante la gestin de punteros con los operadores: * y & En Java sin embargo no hay decisin posible: todo se pasa por valor. Si se modifica el valor de la variable recibida, no se modifica la variable original..
Ejemplo:
Ejemplo:
214
de esas referencias.
215
MDULO 2
va.lang.* lo hacen de forma implcita: import java.lang.*; Las clases que no heredan explcitamente de otra clase, here-
216
citamente uno sin parmetros: public MiClase() { super(); } Los constructores que no llamen a otro constructor de la mis-
ma clase o del padre, contienen una llamada implcita al del padre sin parmetros: public MiClase(int param) { super(); this.valor = param; } Siempre que se haga referencia un atributo o mtodo de la
propia clase, implcitamente se aade this: this.miMetodo(); Todos los mtodos de un interfaz son definidos como abstract
de forma implcita: public abstract int miMetodo(); Todos los atributos son inicializados a su valor por defecto si
no se inicializan de forma explcita. Cuidado, que no ocurre lo mismo con las variables locales. Si no se especifica ningn package, la clase pertenece al pac-
217
MDULO 2
6. Instanceof
Se trata de un operador especial del lenguaje Java representado por la keyword: instanceof. La sintaxis de la declaracin es la siguiente: objeto instanceof clase
Ejemplo: num instanceof Integer num instanceof java.util.Date
Este operador permite comprobar si un objeto es instancia de una clase o no. Devuelve un boolean por lo que puede utilizarse en expresiones lgicas (condiciones). Bsicamente lo que hace es comprobar si un casting concreto se puede realizar o no.
Ejemplo:
218
Solucin:
219
MDULO 2
Solucin:
Solucin:
220
PRCTICA D: Desarrollar, tanto en la JDK de Sun como en Eclipse, el comienzo de un juego de rol donde tengamos distintas criaturas: Elfos, Trolls y Enanos. Inventad una serie de atributos (entre ellos la fuerza), constructores y mtodos para todos ellos. Debern estar en el paquete es.java.aula.mentor.practicad.criaturas. Al mismo tiempo, tendremos un interfaz con los puntos de fuerza de cada una de las criaturas definidas como constantes en el paquete es.java.aula.mentor.practicad.util. De esta manera un simple cambio en el interfaz actualiza todo el juego. La clase PracticaD que se encuentra en el paquete es.java.aula.mentor.practicad tiene un mtodo main en el que se crean una serie de criaturas y se muestran por pantalla. Aunque en esta primera fase del desarrollo del juego no utilicemos las criaturas, realizar un diseo lo mas genrico, reutilizable y fcil de mantener que se pueda. Solucin con la JDK De Sun En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le aadimos %PATH%.
221
MDULO 2
Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan encontrar nuestras clases Java. Tenemos dos opciones, o aadir el . (punto) y siempre ejecutar las herramientas en el directorio donde se encuentre el cdigo, o aadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para respetar el valor que ya tuviese la variable CLASSPATH le aadimos %CLASSPATH%
222
Creamos los directorios donde van a estar nuestras clases es\java\aula\mentor\\practicad\criaturas y es\java\aula\mentor\practicad\util
Desde el directorio es\java\aula\mentor\practicad\criaturas, con un editor de texto (por ejemplo Notepad) vamos a escribir el cdigo fuente de cada una de nuestras clases java; el nombre del fichero debe ser exactamente igual (incluyendo maysculas y minsculas) al de la clase Java que vamos a desarrollar. Empezamos con Criatura.java
223
MDULO 2
Escribimos el cdigo y salvamos los cambios. Cerramos el Notepad. Hacemos el mismo proceso para la clase Troll.java
224
MDULO 2
Desde el directorio es\java\aula\mentor\practicad, escribimos la clase PracticaD.java que va a contener el mtodo main.
226
Compilamos el programa Java con el compilador javac. Al compilador hay que darle el nombre del fichero incluyendo su extensin. Podemos hacerlo desde cada uno de los directorios donde estn las clases, indicando solamente el nombre de la clase sin paquete (por ejemplo javac Troll.java) o desde el directorio trabajo, indicando el nombre completo de la clase (por ejemplo javac es\java\aula\mentor\practicad\criaturas\Troll.java). Para poder compilar las clases, es necesario que las clases que utilizan sean compiladas previamente. A continuacin mostramos un posible orden de compilacin:
Vemos como han quedado las clases compiladas en cada uno de los directorios
227
MDULO 2
Ahora realizaremos la misma prctica con Eclipse Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe Seleccionar la ubicacin del workspace (o rea de trabajo).
228
229
MDULO 2
230
231
MDULO 2
Seleccionar Finish Escribir el cdigo dentro del bloque del interface y salvar con Ctrl + S o File -> Save
232
Crear las siguientes clases Troll , Enano, Elfo (sin mtodo main) dentro del mismo paquete. Para no tener que volver a escribir el nombre del paquete, podemos seleccionarlo va el botn derecho del ratn y luego seleccionar el crear una nueva clase.
233
MDULO 2
234
En Eclipse, cuando se salvan los cambios, se compila el cdigo, por lo que no hace falta realizar este paso. Crear el interface Constantes en el paquete es.java.aula.mentor.practicad.util.
235
MDULO 2
Por ltimo, creamos la clase que va a contener el main PracticaD, en el paquete java es.java.aula.mentor.practicad
236
Seleccionando la clase Java PracticaD, con el botn derecho del ratn ejecutarla como Java Application
237
MDULO 2
238
En esta unidad hemos visto distintos conceptos que nos permiten organizar nuestro cdigo y modificar el acceso a nuestras clases, mtodos y atributos. Paquetes: son una caracterstica del lenguaje que nos permite organizar el cdigo en grupos. Fsicamente, cada uno de los subgrupos del paquete se convierten en un directorio del sistema operativo. Modificadores de acceso: son una caracterstica del lenguaje que nos posibilita delimitar quin o desde donde se puede acceder a una clase, a un mtodo o a un atributo. Existen cuatro delimitadores: public: puede acceder todo el mundo. protected: Solamente se pueden acceder desde el mismo paquete o subclases de otros paquetes. : Solamente se pueden acceder desde el mismo paquete. private: Solamente se puede acceder desde la misma clase.
Adicionalmente hemos visto otros keyword que modifican el comportamiento de clases, atributos y mtodos Mtodos estticos: son mtodos que son dependientes de la clase a la que pertenecen y no a una instancia de una clase. Atributos estticos: son atributos de clase y son compartidos por todas las instancias de la clase a la que pertenecen. Bloques estticos: son bloques de cdigo que se ejecutan una sola vez cuando la clase es cargada en memoria. Clases finales: son clases de la que nadie ms puede heredar.
Mtodos finales: son mtodos que no pueden ser sobreescritos. Atributos finales: son atributos que una vez definidos no se puede cambiar su valor. Si se utilizan conjuntamente con la keyword static, se convierten en constantes a nivel de clase.
MDULO C
UNIDADES DIDCTICAS:
1. Clases bsicas. String, StringBuffer, System, Math, Integer, . 2. Estructuras de datos. Arrays y colecciones
MDULO C
Clases bsicas
Tema 3.1
ndice de la unidad:
1. Clase java.lang.String 2. Clase java.lang.StringBuffer 3. Clase java.lang.StringBuilder 4. Clase java.lang.System 5. Clase java.lang.Math 6. Otras clases 7. Wrapper de tipos primitivos
En el paquete java.lang, importado por defecto por el compilador en las clases Java, existen ciertas clases muy utilizadas a la hora de desarrollar un programa. Es por este motivo, que es importante que se conozcan.
1. Clase java.lang.String
A diferencia de C++, en Java se usa la clase String para el manejo de cadenas de caracteres. Existen distintas formas de crear un String: Mediante su constructor por defecto.
Ejemplo: String s = new String(); // Se inicializa a (y no a ).
Otros
constructores:
http://java.sun.com/javase/6/docs/api/java/lang/String.html#constr uctor_detail Es importante tener en cuenta que para la clase String, la primera posicin de la cadena de caracteres es la cero (y no la uno). Implementa una serie de mtodos muy tiles para el manejo de las cadenas de caracteres. Por ejemplo: public char charAt(int index); Devuelve el carcter que se
encuentra en la posicin index. public String concat(String str); Devuelve la cadena con
str aadido al final del objeto String que realiza la llamada (es igual que con el operador +). public int indexOf(int ch); Devuelve la primera ocurrencia
MDULO 3
str. Devuelve 0 si son iguales, < 1 si es menor o > 1 si es mayor (la comparacin se realiza siguiendo el abecedario). public String replace(char oldChar, char newChar);
Cambia todas las ocurrencias de oldChar por newChar y devuelve el String cambiado. public int lastIndexOf(String str); Devuelve la ltima ocu-
rrencia de str (devuelve -1 si no se encuentra). public int length(); Devuelve la longitud de la cadena de ca-
dena desde la posicin beginIndex hasta el final. 1. culas. public String toUpperCase(); Devuelve la cadena en mapublic String toLowerCase(); Devuelve la cadena en minspublic String substring(int beginIndex, int endIndex);
blanco ni por delante ni por detrs. public static String valueOf(double d); Devuelve la cadena
de caracteres que representa d. Este mtodo est sobrecargado varias veces recibiendo como parmetro otros tipos primitivos (char, int, float, long). Otros mtodos:
http://java.sun.com/javase/6/docs/api/java/lang/String.html#metho d_detail
Ejemplo:
246
La clase String, sobreescribe el mtodo equals() de la clase java.lang.Object (recordemos que mtodo el equals de Object comparaba las posiciones de memoria, y no el contenido de los objetos). De esta forma, podemos saber si dos objetos String distintos, representan la misma cadena de caracteres o no.
Ejemplo:
Hay un concepto muy importante relacionado con el uso de Strings: son inmutables. Es decir, jams se modifica el valor de un String si no que se crean nuevos objetos. En la ejecucin del siguiente cdigo String s = "0"; for(int i=1; i <10; i++) s = s + i;
247
MDULO 3
No existe un solo objeto de tipo String al que se le ha ido cambiando su valor interno (atributos), sino que se han creado 10 objetos distintos. Pero an hay ms la JVM reserva un espacio en memoria llamado String Pool donde va guardando todos los String. Y el Garbage Collector jams los elimina. Cada vez que se crea un objeto nuevo del tipo String, la JVM mira antes si ese String ya existe, y si es as lo reutiliza.
Por este motivo, el uso de String es un tema no tan trivial como pudiera parecer. Un uso indebido puede provocar problemas de rendimiento.
2. Clase java.lang.StringBuffer
StringBuffer es otra clase relacionada con las cadenas de caracteres. Pero en este caso no son inmutables. Existen distintas formas de crear un StringBuffer:
Otros
constructores:
http://java.sun.com/javase/6/docs/api/java/lang/StringBuffer.html# constructor_detail
248
Para la clase StringBuffer, la primera posicin de la cadena de caracteres es la cero (y no la uno). Algunos de sus mtodos ms importantes son:
valor del StringBuffer. Este mtodo est sobrecargado varias veces recibiendo como parmetro otros tipos: String, Object, int, float, long Modifica el propio objeto que realiza la llamada. public char charAt(int index); Devuelve el carcter que se
encuentra en la posicin index. public int indexOf(int ch); Devuelve la primera ocurrencia
puede contener sin necesidad de alocar o pedir ms memoria. public String toString(); Devuelve un String representado
String desde la posicin beginIndex hasta el final. public StringBuffer reverse(); Devuelve la cadena invertida
en orden. Modifica el propio objeto. public void setCharAt(int index, char ch); Reemplaza el
carcter de la posicin index por ch. public StringBuffer replace(int start, int end, String str);
Reemplaza la cadena entre las posiciones start y end con str. Modifica el propio objeto que hace la llamada.
249
MDULO 3
la posicin offset de la cadena. Este mtodo est sobrecargado varias veces recibiendo como parmetro a insertar otros tipos: int, float, long Modifica el propio objeto que hace la llamada. public StringBuffer delete(int start, int end); Elimina los
http://java.sun.com/javase/6/docs/api/java/lang/StringBuffer.html# method_detail
Ejemplo:
Ejemplo:
250
El uso ms habitual es la creacin de Strings cuyo valor se calcula de forma dinmica. Al no ser inmutable, permite la creacin del String final sin otros objetos intermedios que consumirn memoria de forma innecesaria. En la ejecucin del siguiente cdigo StringBuffer tmp = new StringBuffer(10); for(int i=0; i <10; i++) tmp.append(i); String s = tmp.toString(); Solo se han creado 2 objetos en memoria: un StringBuffer (el GC puede limpiarlo) y un String.
3. Clase java.lang.StringBuilder
Java SE 5.0 aade la clase StringBuilder al tratamiento de cadenas de caracteres. Su funcionalidad (constructores y mtodos) es idntica a la de StringBuffer. La nica diferencia es que sus mtodos no estn sincronizados (veremos qu significa esto en la Unidad 3.7 Threads). 251
MDULO 3
En ejecuciones paralelas tiene mejor rendimiento que StringBuffer. Se puede encontrar una informacin ms detallada en http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html
Ejemplo:
4. Clase java.lang.System
Se trata de una clase con utilidades genricas del sistema. Todos sus atributos y mtodos son estticos. Tiene tres atributos muy utilizados: public static final PrintStream out; Representa por defecto
al stream de salida en pantalla. public static final InputStream in; Representa por defecto
al stream de entrada del teclado. public static final PrintStream err; Representa por defecto
252
Para
ms
informacin
http://java.sun.com/javase/6/docs/api/java/lang/System.html#field_detail Y entre sus mtodos ms utilizados se encuentran: public static long currentTimeMillis(); Devuelve la diferen-
cia de entre la hora actual y la medianoche del 1 de enero de 1970 en milisegundos. public static long nanoTime(); Devuelve la hora actual en
nanosegundos. Es novedad del JSE 5.0 public static void exit(int status); Termina la ejecucin de
la JVM devolviendo status como cdigo de retorno (cero significa que todo ha ido bien). public static void gc(); Pide a la JVM que ejecute el Garbage
Collector. Se trata de un mtodo muy peligroso. Utilizado sin cuidado puede afectar muy negativamente al rendimiento. public static String getProperty(String key); Devuelve el
valor de la propiedad del sistema key, o null si no existiese. public static Properties getProperties(); Devuelve una
instancia de java.util.Properties encapsulando todas las propiedades del sistema. public static void loadLibrary(String libname); Carga la
librera nativa libname. Se utiliza con la programacin JNI (Java Native Interface). Otros mtodos:
http://java.sun.com/javase/6/docs/api/java/lang/System.html#meth od_detail
Ejemplo:
253
MDULO 3
5. Clase java.lang.Math
Se trata de una clase con utilidades matemticas. Todos sus atributos y mtodos son estticos. Tiene dos atributos (constantes) muy utilizados: public static final double E; Es el nmero e, utilizado en los
http://java.sun.com/javase/6/docs/api/java/lang/Math.html#field_detail Alguno de sus mtodos ms importantes son: public static double abs(double a); Devuelve el valor abso-
luto de a. Este mtodo se encuentra sobrecargado recibiendo otros tipos: int, long public static double log10(double a); Devuelve el logarit-
mo base 10 de a. 254
yor comparando a y b. Este mtodo se encuentra sobrecargado recibiendo otros tipos: long, float public static int min(int a, int b); Devuelve el nmero me-
nor comparando a y b. Este mtodo se encuentra sobrecargado recibiendo otros tipos: long, float public static double pow(double a, double b); Calcula po-
tencias de base a y exponente b. public static double random(); Devuelve un nmero aleato-
rio entre 0.0 y 1.0 (0.0 est incluido pero no as el 1.0). public static long round(double a); Redondea a al nmero
entero ms cercano. Este mtodo se encuentra sobrecargado con otros tipos: float. public static double sqrt(double a); Calcula la raz cuadra-
da de a. Otros mtodos:
http://java.sun.com/javase/6/docs/api/java/lang/Math.html#method _detail
Ejemplo:
255
MDULO 3
6. Otras clases
A continuacin se enumeran otras clases importantes a tener en cuenta pertenecientes a otros paquetes Para manejar fechas: java.util.Date y java.util.Calendar Para formatear fechas y nmeros: java.text.DateFormat y
cadena separados por un identificador): java.util.StringTokenizer Para trabajar con expresiones regulares: ja-
256
short, int y long respectivamente. Float, Double: para los tipos primitivos float y double respec-
tivamente Como norma a seguir, suelen tener los siguientes mtodos: Constructores que reciben un String o el tipo primitivo que re-
presentan:
Ejemplo: Integer a = new Integer(3);
toString
Ejemplo: String d = Integer.toString(c);
257
MDULO 3
todo XXXValue
Ejemplo: int e = b.intValue();
Todos los wrappers sobreescriben el mtodo equals de la clase java.lang.Object. De esta forma, podemos saber si dos objetos distintos de un mismo tipo de wrapper, representan el mismo valor primitivo o no.
Ejemplo:
String s. Si s no vale true entonces siempre coger el valor false. public static Boolean valueOf(String s); Convierte el
String s en un Boolean. Si s no vale true entonces siempre devuelve un Boolean con false. public static boolean parseBoolean(String s); Convierte el
String s en un boolean. Si s no vale true entonces siempre devuelve false. public static String toString(boolean b); Convierte el
boolean b en un String.
258
(sobrescribe el mtodo toString() de java.lang.Object). public boolean booleanValue(); Extrae el boolean que re-
http://java.sun.com/javase/6/docs/api/java/lang/Boolean.html
con el char value. public static String toString(char c); Convierte el char c en
(sobrescribe el mtodo toString() de java.lang.Object). public char charValue(); Extrae el char que representa. Ms informacin y mtodos:
http://java.sun.com/javase/6/docs/api/java/lang/Character.html
259
MDULO 3
(sobrescribe el mtodo toString() de java.lang.Object). public byte byteValue(); Extrae el byte que representa. Ms informacin y mtodos:
http://java.sun.com/javase/6/docs/api/java/lang/Byte.html
short value. s. public static Short valueOf(String s); Convierte el String s public Short(String s); Constructor de un Short con el String
(sobrescribe el mtodo toString() de java.lang.Object). 260 public short shortValue(); Extrae el short que representa.
Ms informacin y mtodos:
http://java.sun.com/javase/6/docs/api/java/lang/Short.html
(sobrescribe el mtodo toString() de java.lang.Object). public int intValue(); Extrae el int que representa. Ms informacin y mtodos:
http://java.sun.com/javase/6/docs/api/java/lang/Integer.html
261
MDULO 3
value. s.
(sobrescribe el mtodo toString() de java.lang.Object). public long longValue(); Extrae el long que representa. Ms informacin y mtodos:
http://java.sun.com/javase/6/docs/api/java/lang/Long.html
float value. s. public static Float valueOf(String s); Convierte el String s public Float(String s); Constructor de un Float con el String
s en un float. 262
(sobrescribe el mtodo toString() de java.lang.Object). public float floatValue(); Extrae el float que representa. Ms informacin y mtodos:
http://java.sun.com/javase/6/docs/api/java/lang/Float.html
(sobrescribe el mtodo toString() de java.lang.Object). public double doubleValue(); Extrae el double que
representa.
263
MDULO 3
Ms informacin y mtodos:
http://java.sun.com/javase/6/docs/api/java/lang/Double.html
7.9
Autoboxing/Auto-unboxing
Java SE 5.0 aade una novedad al respecto de los wrappers de tipo bsico, permitiendo que las conversiones entre tipos hagan de forma automtica. Antes, para crear un wrapper a partir de un tipo primitivo se utilizaba su constructor: primitivos y sus wrappers se
264
Integer i = new Integer(1); Sin embargo ahora se puede hacer directamente: Integer i = 1; El compilador se encarga de realizar la conversin de forma automtica (autoboxing). De igual forma, antes para extraer un tipo primitivo de su wrapper utilizbamos el siguiente mtodo: Integer a = new Integer(1); int b = a.intValue(); Sin embargo ahora se puede hacer directamente: int b = a; El compilador se encarga de realizar la extraccin de forma automtica (autounboxing). Esto nos permite tambin operar con los wrappers: Integer a = 10; Integer b = 3; int c = a + b; Tambin se permiten las comparaciones: Integer a = 5; int b = 6; if(a == b) System.out.println(Iguales); El wrapper Boolean tambin se ve favorecido por esta nueva funcionalidad. Antes no poda participar en condiciones, pero ahora si: Boolean a = true; boolean b = false; Boolean c = a && b;
Ante esta nueva funcionalidad, nos podemos preguntar qu pasa con la sobrecarga de mtodos? public void metodo(double param) { }; public void metodo(Integer param) { }; 265
MDULO 3
int a = 5; this.metodo(a); Para evitar diferencias en la funcionalidad de una aplicacin al migrar de versiones anteriores, primero se busca el mtodo a ejecutar sin tener en cuenta el autoboxing y auto-unboxing. Si no se encuentra ninguno, entonces de busca teniendo en cuenta el autoboxing y auto-unboxing. Se llamara por tanto a: public void metodo(double param) { };
PRCTICA A: Desarrollar, tanto en la JDK de Sun como en Eclipse, una clase a la que se le pase un parmetro de tipo String (sin blancos de separacin) y muestre: la cadena de caracteres en maysculas. la cadena de caracteres en minsculas. los dos primeros caracteres de la cadena (solo en caso de que la longitud de esta sea de dos o ms caracteres). los dos ltimos caracteres de la cadena (solo en caso de que la longitud de esta sea de dos o ms caracteres). el nmero de ocurrencias en la cadena del ltimo carcter. la cadena con todas las ocurrencias del primer carcter en maysculas. la cadena con tres asteriscos por delante y por detrs. La cadena invertida.
Solucin con la JDK De Sun En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le aadimos %PATH%.
266
Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan encontrar nuestras clases Java. Tenemos dos opciones, o aadir el . (punto) y siempre ejecutar las herramientas en el directorio donde se encuentre el cdigo, o aadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para respetar el valor que ya tuviese la variable CLASSPATH le aadimos %CLASSPATH%
267
MDULO 3
Desde el directorio es\java\aula\mentor\practica26, con un editor de texto (por ejemplo Notepad) vamos a escribir el cdigo fuente de nuestra clases java; el nombre del fichero PracticaA.java debe ser exactamente igual (incluyendo maysculas y minsculas) al de la clase Java que vamos a desarrollar.
268
Y aceptamos la creacin de un fichero nuevo. Para poder coger un parmetro pasado en la ejecucin del programa, incluir las siguientes lneas despus del main. Veremos el tratamiento de los arrays en la Unidad 3.1 if (args == null || args.length != 1){ System.out.println("Numero de parametros incorrectos"); System.exit(1); } String s = args[0]; Nuestra clase quedara de la manera siguiente:
269
MDULO 3
270
Ahora realizaremos la misma prctica con Eclipse Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe Seleccionar la ubicacin del workspace (o rea de trabajo).
271
MDULO 3
272
llamado
PracticaA,
especificando
el
paquete
273
MDULO 3
274
Salvar los cambios con Ctrl + S o File -> Save Para ejecutar la clase, pasndole un parmetro, seleccionamos la clase Java PracticaA, con el botn derecho del ratn ejecutarla como Run Configurations
275
MDULO 3
276
PRCTICA B: Desarrollar, tanto en la JDK de Sun como en Eclipse, una clase a la que se le pasen dos parmetros de tipo String y que sern convertidos a dos nmeros decimales (double); estos nmeros decimales sern los dos catetos de un tringulo rectngulo. Deber tener un mtodo que muestre: El mayor y menor de los catetos. El valor de la hipotenusa.
Adicionalmente, habr que mostrar el tiempo que tarda en ejecutarse este mtodo. 277
MDULO 3
Solucin con la JDK De Sun En el directorio es\java\aula\mentor\practicas26, creamos una clase nueva llamada PracticaB.java con un editor de texto como notepad. Para el paso de parmetros en ejecucin, incluiremos las siguientes lneas en el mtodo min. if (args == null || args.length != 2){ System.out.println("Numero de parametros incorrectos"); System.exit(1); } String s1 = args[0]; // tenemos en primer parmetro de tipo String String s2 = args[1]; // tenemos en segundo parmetro de tipo String Nuestra clase quedara como sigue:
278
Ahora realizaremos la misma prctica con Eclipse Nos creamos una nueva clase en el paquete es.java.aula.mentor.practicas26, llamada PracticaB
279
MDULO 3
Y ejecutamos mediante Run Configurations, verificando que en el Main class aparece la clase PracticaB (en el caso de no aparecer cambiar el nombre o buscarla mediante el botn Search)
280
281
En esta unidad se han visto una relacin de clases bsicas e imprescindibles de conocer a la hora de la programacin en Java. java.lang.String: utilizada para el tratamiento de cadenas de caracteres o String. Se utiliza sobre todo para cadenas de caracteres inmutables Para el tratamiento de cadenas de caracteres que cambian de valor se utilizan las clases java.lang.StringBuffer (sincronizada) java.lang.StringBuilder (no sincronizada)
Adems se han estudidado las clases wrappers de los tipos primitivos, como son: java.lang.Boolean java.lang.Character java.lang.Byte java.lang.Short java.lang.Integer java.lang.Long java.lang.Float java.lang.Double
MDULO C
ndice de la unidad:
1. Arrays 2. Colecciones 3. Importancia de los mtodos equals() y hashCode() 4. Arrays vs. Colecciones
En Unidades anteriores hemos estudiado los tipos de datos, tanto primitivos como complejos. Hemos visto como trabajar con datos de ambos dos tipos, pero siempre de una manera unitaria. En esta Unidad veremos como trabajar con los conjuntos de datos, como una sola variable u objeto.
1. Arrays
Un array es una estructura de datos que permite albergar varios elementos del mismo tipo. La longitud de un array se establece durante su creacin y una vez establecida la longitud de un array, ya no se puede modificar, por lo que se puede considerar que tiene una longitud fija. Un elemento de un array, es el valor de una de sus posiciones, y se identifica mediante un ndice. Un array en Java, es un tipo de clase especial que hereda implcitamente de java.lang.Object. La declaracin de un array se realiza mediante el tipo de datos que va a albergar y los corchetes [ ]. La sintaxis de la declaracin de un array es la siguiente: modificador_acceso tipo[] nombre [= valor_inicial];
Ejemplos: private int[] numeros; private String[] cadenas;
Los arrays pueden albergar tanto tipos primitivos como tipos complejos y para poder utilizarlos, hay que inicializarlos. Un array sin inicializar, por defecto vale null. La creacin de un array se realiza mediante la keyword: new, como con cualquier otra clase, tanto para tipos primitivos como para tipos complejos. La sintaxis de la creacin de un array es: modificador_acceso tipo[] nombre = new tipo[longitud];
285
MODULO 3
Ejemplos: private int[] numeros = new int[5]; private String[] cadenas = new String[4];
Una vez hayamos creado un array, todas sus posiciones son inicializadas al valor por defecto del tipo de variable que albergue. Es decir, 0 o 0.0 si se trataba de un nmero, false si se trataba de un boolean y null si se trataba de un tipo complejo. Existe una forma de crear un array inicializando todas sus posiciones a un valor determinado, igualndolo a un listado de elementos separados por comas entre { }. El tamao del array ser el nmero de elementos del listado.
Ejemplos: private int[] numeros = {1,2,3,4,5}; private String[] cadenas = {hola,adios}; private Integer[] ints = {new Integer(12), new Integer(98)};
Para el acceso al elemento de un array se utiliza en nombre del array seguido de unos [ ] con la posicin a la que queremos acceder, siendo siempre el ndice de un array de tipo int. Hay que tener en cuenta que la primera posicin de un array es la 0.
Ejemplos: numeros[2] = 3; int a = numeros[0];
if(numeros[4] == 5)..
286
Para conocer la longitud de un array, podremos acceder a su atributo pblico: length. Al no ser dinmico, no podemos: Ni eliminar posiciones. Ni insertar posiciones.
El borrado ser algo lgico, como igualar a null, a -1, etc.. las posiciones que no se quieran o se necesiten utilizar, dependiendo de la lgica que necesite el programa o de la propia eleccin del programador. 287
MODULO 3
Es imposible acceder a una posicin fuera del array en tiempo de ejecucin. Llegado el caso se lanzar una excepcin del tipo ArrayIndexOutOfBoundException (se vern en ms detalle en la Unidad 3.5).
programa public class Colecciones { public static void main(String[] args) { // Creacin e inicializacin. String[] saludos = new String[4]; // Insercin. saludos[0] = saludos[1] = saludos[2] = saludos[3] = new new new new String("Hola"); String("Adios"); String("Hello"); String("GoodBye"); Ejemplo: Si seguimos la ejecucin del siguiente
// Extraccin. String tmp = saludos[2]; // Borrado. saludos[2] = null; saludos[3] = null; // Recorrido. for(int i=0; i<saludos.length; i++) System.out.println(saludos[i]); // Bsqueda. boolean sw = false; for(int i=0; i<saludos.length; i++) { if(saludos[i] != null && saludos[i].equals("Adios")) { System.out.println("Adios ha sido encontrado en la posicin: " + i); sw = true; break; } }
288
1. 1 Sentencia for/in
Esta nueva sentencia del Java SE 5.0 nos facilita la iteracin por los elementos de cualquier tipo de coleccin: arrays, listas, etc for(inicializacin: coleccin) { sentencias; } Nota: Se usa : en vez de ;.
Las variables definidas en la sentencia de inicializacin son locales al bloque. Por tanto dejan de existir una vez se haya terminado el bucle.
Ejemplo: se muestra un ejemplo de la sentencia de control for/in public void listar(int[] param) { for(int i: param) System.out.println(i); }
Bsicamente, se trata de una simplificacin a la hora de codificar. Es decir, al final, el compilador convierte el cdigo en una sentencia for convencional como la siguiente:
public void listar(int[] param) { int i = 0; for(int j=0; j<param.length; j++) i = param[j]; System.out.println(i); }
1. 2 Arrays multidimensionales
Un array multidimensional es un array de arrays o desde un punto de vista matemtico es una matriz. Es decir, una matriz de 4 x 2 en realidad en Java est formada por 5 arrays: 1 array con 4 arrays. Y si estuviramos hablando de tres dimensiones entonces tendramos un array de arrays de arrays, aunque son bastante menos utilizados.
289
MODULO 3
La sintaxis de la creacin de un array bidimensional es la siguiente: modificador_acceso tipo[][] nombre = new tipo[long][long];
Ejemplo: private int[][] numeros = new int[4][2];
Pero podemos tener arrays bidimensionales no cuadradas. Es decir, que la segunda dimensin tenga longitud diferente para cada posicin de la primera dimensin. La sintaxis de la creacin de un array bidimensional no cuadrado es la siguiente: modificador_acceso tipo[][] nombre = new tipo[long][];
Ejemplo: private int[][] numeros = new int[4][]; numeros[0] = new int[2]; numeros[1] = new int[10]; numeros[3] = new int[1];
Al igual que ocurriera en los arrays de una dimensin, los arrays bidimensionales tambin se pueden inicializar en la creacin con un listado de valores.
Ejemplos: private int[][] numeros = { {1,2,3} , {1,2,3} }; private String[][] dias = { {Lunes,Martes} , {Mircoles} };
290
Ejemplo: private int[][] numeros = { {1,2,3} , {1,2,3} }; Ejemplo: Si seguimos la ejecucin del siguiente programa, obten-
dremos la salida mostrada public class Matriz { public static void main(String[] args) { int[][] matriz = new int[4][]; // Rellenar la matriz for(int i=0; i<matriz.length; i++) { matriz[i] = new int[5]; for(int j=0; j<matriz[i].length; j++) matriz[i][j] = i + j; } // Mostrar la matriz for(int i=0; i<matriz.length; i++) { for(int j=0; j<matriz[i].length; j++) System.out.print(matriz[i][j] + " "); System.out.println(); }
} }
291
MODULO 3
292
2. Colecciones
Una coleccin es simplemente un objeto que agrupa varios elementos en uno solo. Se utilizan para guardar y manipular datos as como transmitir informacin entre mtodos. En Java tenemos un framework de colecciones, implementado mediante: Interfaces: representaciones abstractas de las colecciones
que permiten usarlas sin conocer sus detalles. Implementaciones: colecciones concretas. Algoritmos: mtodos que permiten realizar operaciones co-
mo bsquedas, ordenaciones, etc A continuacin se muestra la organizacin jerrquica de este framework y una forma rpida de saber cual podra ser la elegida a utilizar en cada caso. En el caso de los Collection, hay una clara diferenciacin en cuanto si permite duplicados accediendo por ndice java.util.List, o sin duplicados sin posibilidad de acceso va ndice, java.util.Set
293
MODULO 3
En el caso de los Map, se utilizan siempre que necesitemos trabajar con parejas de datos clave/valor.
Todas las colecciones se encuentran en el paquete java.util.*; siendo java.util.Collection y java.util.Map las raices de la jerarqua de las colecciones. Existirn especializaciones que permitan elementos duplicados o no, que permitan ordenar los elementos o no, etc. Estas interfaces contiene la definicin de todos los mtodos genricos que deben implementar las colecciones.
2.1 java.util.Collection
Los mtodos bsicos de este interfaz son: mento. int size(); // Indica el nmero de elementos que contiene. boolean isEmpty(); // Indica s no contiene ningn ele-
294
ese elemento. blemas. remove(Object element); // Borra un elemento. Iterator iterator(); // Devuelve una instancia de Iterator. boolean add(Object element); // Aade un elemento.
Los mtodos que corresponden a operaciones masivas son: boolean containsAll(Collection c); // Indica s contiene
todos esos elementos. boolean addAll(Collection c); // Aade todos los elemen-
tos del parmetro pasado. Devuelve un boolean para indicar si ha tenido xito o ha tenido problemas. boolean removeAll(Collection c); // Borra todos los ele-
mentos del parmetro pasado. Devuelve un boolean para indicar si ha tenido xito o ha tenido problemas. boolean retainAll(Collection c); // Borrar todos los ele-
mentos menos los pasados en el parmetro. Devuelve un boolean para indicar si ha tenido xito o ha tenido problemas. void clear(); // Borra todos los elementos.
Los mtodos que corresponden a operaciones con arrays son: Object[] toArray(); // Devuelve un array con todos los
295
MODULO 3
Hay que tener siempre en cuenta que las colecciones no permiten el uso de tipos primitivos. Por tanto, siempre que necesitemos trabajar con ellos habr que hacer uso de los Wrappers de Tipos Primitivos.
2.2 java.util.Iterator
El interfaz Iterator representa un componente que permite iterar o recorrer los elementos de una coleccin. Todas las colecciones ofrecen una implementacin de Iterator por medio del mtodo: public Iterator iterator(); Sus mtodos son: boolean hasNext(); // Indica s tiene ms elementos des-
de la posicin en la que se encuentra el iterador. Object next(); // Devuelve el primer elemento y se queda
apuntando al siguiente. En la siguiente llamada, devolver el segundo elemento y apuntar al siguiente y as sucesivamente hasta el final de la coleccin que devolver un null. void remove(); // Elimina el primer elemento y se queda
apuntando al siguiente. En el caso de que no estemos en la primera posicin, borrar el elemendo donde est el iterador y apuntar al siguiente. En el SDK 1.1.x exista otro interfaz, java.util.Enumeration, pero ya ha dejado de utilizarse.
2.2 java.util.Set
El interfaz Set hereda del interfaz Collection. Pero no aade la definicin de ningn mtodo nuevo. Representa colecciones que no permiten tener elementos duplicados. Para saber si un elemento est duplicado, hace uso del mtodo:
296
public boolean equals(Object o); Existen distintas implementaciones de este interfaz: java.util.HashSet: Es nueva en el SDK 1.2.x. Ofrece el ac-
ceso ms rpido cuando dicho acceso es aleatorio (no secuencial). Su orden de iteracin es impredecible. java.util.LinkedHashSet: Es nueva en el SDK 1.4.x. Su
iteracin depende de la implementacin que los elementos hagan del interfaz java.lang.Comparable, mediante la implementacin del mtodo public int compareTo(Object o);
Ejemplo: Utilizacin de java.util.HashSet import java.util.*; public class TestHashSet { public static void main(String[] args) { HashSet ciudades = new HashSet(); ciudades.add("Madrid"); ciudades.add("Barcelona"); ciudades.add("Malaga"); ciudades.add("Vigo"); ciudades.add("Sevilla"); ciudades.add("Madrid"); // Repetido. Iterator it = ciudades.iterator(); while(it.hasNext()) System.out.println("Ciudad: " + it.next());
297
MODULO 3
Ejemplo: Utilizacin de java.util.LinkedHashSet import java.util.*; public class TestLinkedHashSet { public static void main(String[] args) { LinkedHashSet ciudades = new LinkedHashSet(); ciudades.add("Madrid"); ciudades.add("Barcelona"); ciudades.add("Malaga"); ciudades.add("Vigo"); ciudades.add("Sevilla"); ciudades.add("Madrid"); // Repetido. Iterator it = ciudades.iterator(); while(it.hasNext()) System.out.println("Ciudad: " + it.next());
298
Ejemplo: Utilizacin de java.util.TreeSet import java.util.*; public class TestTreeSet { public static void main(String[] args) { TreeSet ciudades = new TreeSet(); ciudades.add("Madrid"); ciudades.add("Barcelona"); ciudades.add("Malaga"); ciudades.add("Vigo"); ciudades.add("Sevilla"); ciudades.add("Madrid"); // Repetido. Iterator it = ciudades.iterator(); while(it.hasNext()) System.out.println("Ciudad: " + it.next());
2.3 java.util.List
El interfaz List hereda del interfaz Collection. Representa colecciones con elementos en secuencia. Es decir, con orden. Permite tener duplicados. Es accesible mediante ndice, de manera que se puede: Acceder a un elemento concreto de una posicin.
299
MODULO 3
Los mtodos que aade este interfaz, para acceso posicional son: Object get(int index); // Devuelve el elemento de la posi-
elemento de la posicin indicada en el parmetro, con el elemento del parmetro. void add(int index, Object element); // Inserta el ele-
mento pasado por parmetro, en la posicin pasada por parmetro. Object remove(int index); // Elimina el elemento de la
posicin indicada por parmetro. Devuelve el objeto borrado. rmetro. Los mtodos que aade este interfaz para operaciones de bsqueda son: int indexOf(Object o); // Devuelve la posicin de la priboolean addAll(int index, Collection c); // Inserta todos
mera ocurrencia del elemento pasado por parmetro. int lastIndexOf(Object o); // Devuelve la posicin de la
ltima ocurrencia del elemento pasado por parmetro. Los mtodos que aade este interfaz para obtener subcolecciones son: metro. A continuacin se enumeran las distintas implementaciones de este interfaz: java.util.ArrayList: Es nueva en el SDK 1.2.x. Ofrece un List subList(int from, int to); // Devuelve una lista con
300
tiempo de acceso ptimo cuando dicho acceso es para aadir o eliminar elementos del comienzo y final de la lista (tpico para pilas). java.util.Vector: Es como el ArrayList, pero sincronizado,
lo que penaliza notablemente el rendimiento. La sincronizacin es importante cuando ms de un thread (hilo de ejecucin) va a acceder a la coleccin (los threads se vern en ms detalle en la Unidad 3.7.
Ejemplo: Utilizacin de java.util.ArrayList y java.util.Iterator import java.util.*; public class TestArrayList { public static void main(String[] args) { ArrayList ciudades = new ArrayList(); ciudades.add("Madrid"); ciudades.add("Barcelona"); ciudades.add("Malaga"); ciudades.add("Vigo"); ciudades.add(1,"Sevilla"); ciudades.add("Madrid"); // Repetido. Iterator it = ciudades.iterator(); while(it.hasNext()) System.out.println("Ciudad: " + it.next());
301
MODULO 3
public static void main(String[] args) { ArrayList ciudades = new ArrayList(); ciudades.add("Madrid"); ciudades.add("Barcelona"); ciudades.add("Malaga"); ciudades.add("Vigo"); ciudades.add(1,"Sevilla"); ciudades.add("Madrid"); // Repetido. for(int i=ciudades.size()-1; i >=0; i--) System.out.println("Ciudad: " + i + " es: " + ciudades.get(i));
Ejemplo: Utilizacin de java.util.LinkedList import java.util.*; public class TestLinkedList { public static void main(String[] args) { LinkedList ciudades = new LinkedList(); ciudades.add("Madrid"); ciudades.add("Barcelona"); ciudades.add("Malaga"); ciudades.add("Vigo"); ciudades.add(1,"Sevilla"); ciudades.add("Madrid"); // Repetido. Iterator it = ciudades.iterator(); while(it.hasNext()) System.out.println("Ciudad: " + it.next());
302
Ejemplo: Utilizacin de java.util.Vector import java.util.*; public class TestVector { public static void main(String[] args) { Vector ciudades = new Vector(); ciudades.add("Madrid"); ciudades.add("Barcelona"); ciudades.add("Malaga"); ciudades.add("Vigo"); ciudades.add(1,"Sevilla"); ciudades.add("Madrid"); // Repetido. for(int i=ciudades.size()-1; i >=0; i--) System.out.println("Ciudad: " + i + " es: " + ciudades.get(i));
303
MODULO 3
2.4 java.util.Map
El interfaz Map no hereda del interfaz Collection. Representa colecciones con parejas de elementos: clave y valor. No permite tener claves duplicadas. Pero si valores duplicados. Para calcular la colocacin de un elemento se basa en el uso del mtodo: public int hashCode(); Los mtodos bsicos de este interfaz son: Object put(Object key, Object value); // Inserta una
pareja de clave/valor pasados como parmetros. Object get(Object key); // Accede al valor de una clave
pasada como parmetro. do. boolean containsKey(Object key); // Comprueba la Object remove(Object key); // Elimina una pareja de
existencia de una clave pasada como parmetro. boolean containsValue(Object value); // Comprueba la
existencia de un valor pasado como parmetro. ja. Los mtodos que realizan operaciones masivas son: void putAll(Map t); // Aade todas las parejas que existen int size(); // Indica el nmero de pareja que contiene. boolean isEmpty(); // Indica s no contiene ninguna pare-
304
Los mtodos que realizan operaciones de obtencin de colecciones son: public Set keySet(); // Devuelve las claves en un ja-
java.util. Collection. A continuacin enumeramos las distintas implementaciones de este interfaz: java.util.HashMap: Es nueva en el SDK 1.2.x. Ofrece un
tiempo de acceso ptimo cuando dicho acceso es aleatorio. Su orden de iteracin es imprevisible. Map. java.util.LinkedHashMap: Es nueva en el SDK 1.4.x. Su java.util.Hashtable: Es la versin sincronizada de Hash-
orden de iteracin es el de insercin. java.util.TreeMap: Su orden de iteracin depende de la que los elementos hagan del interfaz ja-
implementacin
305
MODULO 3
Ejemplo: Utilizacin de java.util.HashTable import java.util.*; public class TestHashtable { public static void main(String[] args) { Hashtable codigos = new Hashtable(); codigos.put("01","Urgente"); codigos.put("02","Importante"); codigos.put("03","Normal"); codigos.put("04","Baja prioridad"); System.out.println("Aleatorio 03: " + codigos.get("03")); System.out.println("Aleatorio 01: " + codigos.get("01")); Set s = codigos.keySet(); Iterator it = s.iterator(); while(it.hasNext()) { String aux = (String)it.next(); System.out.println(aux + ": " + codigos.get(aux)); } } }
306
Ejemplo: Utilizacin de java.util.LinkedHashMap import java.util.*; public class TestLinkedHashMap { public static void main(String[] args) { LinkedHashMap codigos = new LinkedHashMap(); codigos.put("01","Urgente"); codigos.put("02","Importante"); codigos.put("03","Normal"); codigos.put("04","Baja prioridad"); System.out.println("Aleatorio 03: " + codigos.get("03")); System.out.println("Aleatorio 01: " + codigos.get("01")); Set s = codigos.keySet(); Iterator it = s.iterator(); while(it.hasNext()) { String aux = (String)it.next(); System.out.println(aux + ": " + codigos.get(aux)); }
307
MODULO 3
Ejemplo: Utilizacin de java.util.TreeMap import java.util.*; public class TestTreeMap { public static void main(String[] args) { TreeMap codigos = new TreeMap(); codigos.put("04","Baja prioridad"); codigos.put("01","Urgente"); codigos.put("03","Normal"); codigos.put("02","Importante"); System.out.println("Aleatorio 03: " + codigos.get("03")); System.out.println("Aleatorio 01: " + codigos.get("01")); Set s = codigos.keySet(); Iterator it = s.iterator(); while(it.hasNext()) { String aux = (String)it.next(); System.out.println(aux + ": " + codigos.get(aux)); }
} }
308
2.5 Generics
Se trata de una de las grandes novedades que introdujo Java SE 5.0 Permite tipar el contenido de las colecciones, de manera que se restringe el tipo utilizado y se elimina el uso masivo de castings. Para definir el tipo del contenido de una coleccin se utiliza <tipo>: tipo_coleccion<tipo_contenido> identificador = null; identificador = new tipo_coleccion<tipo_contenido>();
Ejemplo: List<String> lista = new ArrayList<String>(); En este caso, se trabajara utilizando Strings directamente sin necesidad de casting alguno: String elemento = lista.get(0);
En el caso de colecciones de tipo Map, se definira tanto el tipo de las claves como el de los valores: Map<Integer,String> mapa = new HashMap<Integer,String>();
309
MODULO 3
Un Map internamente contiene una secuencia de compartimentos (buckets) donde se van almacenando todos los valores (clave/valor). Para decidir en qu compartimento se almacena un valor, se llama al mtodo hashCode() del objeto utilizado como clave. Pero pueden ocurrir colisiones, es decir, que un compartimento ya est utilizado por una pareja clave/valor. Esto puede ser debido a que: Dos objetos distintos devolvieron el mismo cdigo hash. Dos cdigos hash distintos correspondieron al mismo com-
partimento. 310
Imaginemos que hacemos un get del Map y el compartimento correspondiente tiene colisiones. Qu valor nos devuelve? Lo sabe mediante el uso del mtodo equals() de la clave. Va iterando por todas las claves de ese compartimento para encontrar la que se ha pedido. Imaginemos que hacemos un put en el Map con una clave ya existente. Cmo sabe que ya existe y que hay que machacar el valor anterior? Lo sabe mediante el uso del mtodo equals() de la clave. Itera para comprobar si ya existe. La implementacin del mtodo equals() debe cumplir las siguientes normas: Reflexiva: x.equals(x) debe devolver true. Simtrica: Si x.equals(y) devuelve true, y.equals(x) debe
vuelve true, x.equals(z) debe devolver tambin true. Consistente: Si x.equals(y) devuelve true, entonces las su-
cesivas invocaciones de x.equals(y) sin haber modificado el estado de x o y deben seguir devolviendo true.
311
MODULO 3
public static void main(String[] args) { TestEquals test1 = new TestEquals(1, new Integer(2)); TestEquals test2 = new TestEquals(1, new Integer(2)); System.out.println(test1.equals(test2)); }
La implementacin del mtodo hashCode() debe cumplir las siguientes normas: La ejecucin sucesiva del mtodo hashCode() sobre un
mismo objeto sin haber modificado su estado interno entre medias, debe devolver siempre el mismo cdigo hash. Si x.equals(y) devuelve true, entonces tanto x como y de-
ben generar el mismo cdigo hash. Sin embargo, si x.equals(y) devuelve false, no es obligato-
rio que tanto x como y deban generar un cdigo hash distinto. No obstante es lo deseable para evitar en la medida de lo posible las colisiones en los Map y por tanto ofrecer un mejor rendimiento. La implementacin del mtodo hashCode() no es una tarea tan trivial. No obstante, aqu proponemos dos sugerencias bastante sencillas: Convertir a String los valores de los distintos atributos de la
clase. Concatenarlos y delegar la generacin del cdigo hash en el mtodo hashCode() del String resultante (la clase String posee una implementacin bastante eficaz del mtodo hashCode()). Sumar el cdigo hash de cada uno de los atributos de la
clase (los wrappers de tipos primitivos tambin tienen sobreescrito el mtodo hashcode()).
Ejemplo: Sobreescritura del mtodo hashcode
312
public class TestHashCode { private int valor1; private Integer valor2; public int hashCode() { StringBuffer buffer = new StringBuffer(); buffer.append(Integer.toString(valor1)); buffer.append(valor2.toString()); return buffer.toString().hashCode(); } }
public static void main(String[] args) { TestHashCode test1 = new TestHashCode(1, new Integer(2)); TestHashCode test2 = new TestHashCode(1, new Integer(2)); System.out.println(test1.hashCode()); System.out.println(test2.hashCode()); }
El mtodo equals() tambin es importante para el resto de Colecciones. Por ejemplo, cmo funcionan los mtodos contains(), add() y remove() de las colecciones? Para saber si un objeto est contenido en una coleccin se va llamando al mtodo equals() de todos los objetos de la coleccin. Para borrarlo de una coleccin, se le busca de igual forma. Y para aadirlo en un Set que no permite duplicados, lo mismo.
Ejemplo: Sobreescritura del mtodo equals public static void main(String[] args) { TestEquals test1 = new TestEquals(1, new Integer(2)); List list = new ArrayList(); list.add(test1); TestEquals test2 = new TestEquals(1, new Integer(2)); System.out.println(list.contains(test2)); }
313
MODULO 3
Las caractersticas de las Colecciones son: Tamao dinmico. Su tamao se conoce mediante el mtodo size(). Solo puede almacenar tipos complejos. Puede albergar elementos de distinto tipo.
314
PRCTICA A: Desarrollar, tanto en la JDK de Sun como en Eclipse, un sistema de gestin de un garaje siguiendo estas especificaciones. En el garaje se cambian las ruedas tanto de coches como de motos. El precio del cambio de una rueda se fija al abrir el garaje, al igual que la capacidad mxima de vehculos, ya sean motos o coches. Si no hubiese hueco para registrar un vehculo nuevo, habr que tener contemplado un sistema de aviso para quien est dejando su vehculo. El sistema de gestin del garaje requiere un mecanismo para ingresar y retirar los vehculos, conocer el nmero total de vehculos recibidos en ese momento, el precio que supondra cambiar todas las ruedas de todos los vehculos, y el kilometraje medio de todos ellos. La informacin que manejaremos de los coches entre otras cosas es la marca y el nmero de puertas. Mientras que de las motos ser la marca y la cilindrada. Las clases relacionadas con los vehculos se guardarn en el paquete
es.java.aula.mentor.practicas31.vehiculos mientras que el Garaje y PracticaA se guardarn en el paquete es.java.aula.mentor.practicas31. La clase PracticaA tiene un mtodo main en el que se crea un Garaje, una serie de vehculos que se irn recibiendo en el garaje y por ltimo se imprimir por pantalla toda la informacin general del garaje as como la informacin de cada vehculo. NOTA: Realizar esta prctica mediante Arrays. Solucin con la JDK De Sun
En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le aadimos %PATH%. 315
MODULO 3
Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan encontrar nuestras clases Java. Tenemos dos opciones, o aadir el . (punto) y siempre ejecutar las herramientas en el directorio donde se encuentre el cdigo, o aadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para respetar el valor que ya tuviese la variable CLASSPATH le aadimos %CLASSPATH%
316
Creamos los directorios donde van a estar nuestras clases es\java\aula\mentor\\practicas31 y es\java\aula\mentor\\practicas31\vehiculos
Desde el directorio es\java\aula\mentor\practicas31\vehiculos, con un editor de texto (por ejemplo Notepad) vamos a escribir el cdigo fuente de nuestras clases java; el nombre del fichero de la clase debe ser exactamente igual (incluyendo maysculas y minsculas) al de la clase Java que vamos a desarrollar. Empezamos con la clase Vehiculo.java
317
MODULO 3
318
Ahora toca el turno a la clase Moto que tambin implementa el interface Vehiculo
Ya
podemos
implementar
la
clase
Garaje,
desde
el
directorio
es\java\aula\mentor\practicas31
319
MODULO 3
Por ltimo la clase PracticaA, que contiene el mtodo main podra quedar como sigue:
320
Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe Seleccionar la ubicacin del workspace (o rea de trabajo).
321
MODULO 3
322
Darle el nombre y seleccionar Finish. Crear un interface Java nuevo llamado Vehiculo, especificando el paquete es.java.aula.mentor.practicas31.vehiculos
323
MODULO 3
A continuacin creamos la clase Coche, en el mismo paquete que el interface Vehiculo e indicamos que vamos a implementar dicho interface
324
325
MODULO 3
Creamos la clase Garaje en el paquete es.java.aula.mentor.practicas31, que es la que va a contener a los distintos vehiculos
package es.java.aula.mentor.practicas31; import es.java.aula.mentor.practicas31.vehiculos.Vehiculo; public class Garaje { // Atributos. private Vehiculo[] vehiculos = null; private int precio = 0;
326
// Constructores. public Garaje(int param1, int param2) { vehiculos = new Vehiculo[param1]; precio = param2; } // Mtodos. public boolean ingresarVehiculo(Vehiculo param) { boolean sw = false; for(int i=0; i<vehiculos.length; i++) { if(vehiculos[i] == null) { sw = true; vehiculos[i] = param; break; } } return sw; } public void retirarVehiculo(Vehiculo param) { for(int i=0; i<vehiculos.length; i++) { if(vehiculos[i] == param) { vehiculos[i] = null; break; } } } public Vehiculo[] getVehiculos() { Vehiculo[] temp = new Vehiculo[this.getNumVehiculos()]; for(int j=0, i=0; j<temp.length && i<vehiculos.length; i++) { if(vehiculos[i] != null) { temp[j] = vehiculos[i]; j++; } } return temp; } public double getKilometrajeMedio() { int cont = 0; double acum = 0; for(int i=0; i<vehiculos.length; i++) { if(vehiculos[i] != null) { cont++; acum += vehiculos[i].getKilometraje(); } } return acum / cont; } public int getCosteTotal() { int acum = 0; for(int i=0; i<vehiculos.length; i++) { if(vehiculos[i] != null) acum += vehiculos[i].getNumRuedas(); } return acum * precio; } public int getNumVehiculos() { int cont = 0; for(int i=0; i<vehiculos.length; i++) {
327
MODULO 3
Finalizamos creando la clase PracticaA, marcando que nos cree el mtodo main
328
Verificar que todas las clases estn grabadas. Para ello utilizar Ctrl + S en cada clase o en File -> Save All Para ejecutar la aplicacin, seleccionar encima de la clase PracticaA con el botn derecho del ratn Run As -> Java Application
329
MODULO 3
330
PRCTICA B: Desarrollar, tanto en la JDK de Sun como en Eclipse, un sistema de gestin de pacientes. Tendremos un archivador donde iremos guardando todas las fichas de los pacientes. Las fichas contienen la siguiente informacin: nombre, apellidos y edad. Todas las fichas que vayamos creando, se podrn guardar o eliminar del archivador. Al archivador tambin le podremos pedir un listado. Este listado consistir en imprimir por pantalla el nmero de fichas guardadas, as como el contenido de las fichas. Todas las clases se guardarn en el paquete es.java.aula.mentor.practicas31. La clase PracticaB tiene un mtodo main en el que se crea un archivador, dos o tres fichas que se guardarn en el archivador, se listar el contenido, se eliminar alguna ficha y se volver a listar su contenido. NOTA: Realizar esta prctica mediante Colecciones. Reutilizaremos los directorios, paquetes .... realizados en la PracticaA. Solucin con la JDK De Sun En el directorio es\java\aula\mentor\practicas31\, mediante el notepad, creamos la clase Ficha
331
MODULO 3
A continuacin nos creamos la clase Archivador, que es la que va a contener a las fichas
332
Ejecutamos la prctica
333
MODULO 3
Ahora realizaremos la misma prctica con Eclipse. Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe Seleccionar la ubicacin del workspace (o rea de trabajo). Ya tenemos creado el proyecto Practicas31, utilizado en la Prctica A. Vamos a crear la clase Ficha, perteneciente al paquete es.java.aula.mentor.practicas31
334
335
En esta Unidad hemos visto como trabajar con los conjuntos de datos, como una sola variable u objeto. Los dos grandes grupos que permiten tratar con conjuntos de datos son: Arrays: Colecciones: Tienen un tamao dinmico Su tamao se conoce mediante mtodo size(). Puede almacenar solo tipo complejos, ya sean del mismo o distinto tipo. Las Colecciones se clasifican en dos grandes grupos: java.util.Collection que trabaja con elementos de tipos complejos de forma conjunta. Se clasifican a su vez en: java.util.Set: Representa colecciones que no permiten tener elementos duplicados. java.util.HashSet se utiliza para acceso aleatorio, java.util.LinkedHashSet se utiliza para el acceso segn su orden de insercin y java.util.TreeSet depende de la implementacin del mtodo public int compareTo(Object o); java.util.List: Representa colecciones que pueden tener elementos duplicados. java.util.ArrayList utilizado para accesos aleatorios, java.util.LinkedList utilizado cuando se necesita aadir o eliminar elementos del comienzo y final de la lista y java.util.Vector que es como el ArrayList, pero sincronizado. Tienen un tamao esttico Su tamao se conoce mediante el atributo length. Puede almacenar tanto tipos primitivos como tipos complejos. Solo pueden albergar elementos de un tipo.
java.util.Map que trabaja con elementos del tipo clave/valor. Se clasifican a su vez en: java.util.HashMap: Ofrece un tiempo de acceso ptimo cuando dicho acceso es aleatorio. java.util.Hashtable: Es la versin sincronizada de HashMap.