Manual Java INICIAL AULA MENTOR

Programación en Java inicial Nipo: 820-10-530-5 Autor: Pilar Aranzazu Ocaña Diaz-Ufano y José Miguel Ordax Cassá Edición

Views 149 Downloads 3 File size 40MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Programación en Java inicial Nipo: 820-10-530-5 Autor: Pilar Aranzazu Ocaña Diaz-Ufano y José Miguel Ordax Cassá Edición y maquetación de contenidos: Susana Pérez Marín

Diseño gráfico e ilustración de portada: María Guija Medina

AULA MENTOR

educacion.es

MÓDULO A

Nipo: 820-10-530-5 UNIDADES DIDÁCTICAS:

1. Introducción 2. Conceptos básicos. Objeto, atributo, método,

Autor: Pilar Aranzazu Ocaña Diaz-Ufano y José Miguel Ordax Cassá Edición y maquetación de contenidos: Susana Pérez Marín

interfaz, clase 3. Paradigmas de la Orientación a Objetos: Abstracción, encapsulación, ocultamiento, herencia y polimorfismo.

Diseño gráfico e ilustración de portada: María Guija Medina

MÓDULO A

Introducción

Tema 1.1

Índice de la unidad:

1. Historia 2. Ventajas de la Orientación a Objetos

Unidad 1.1 Introducción

En esta unidad veremos el origen de la programación Orientada a Objetos,

y

cuales son sus principales características.

1. Historia Una de las características para poder clasificar los lenguajes de programación es su nivel de abstracción. 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 programación, tiene un pequeño nivel de abstracción relacionado totalmente con la máquina en la que se está ejecutando, por lo que el nivel de abstracción que se aplicaba al ámbito de la solución 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 programación. El nivel de abstracción de estos lenguajes es mucho más 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 relación, los programas desarrollados son difíciles de escribir y bastante costosos de mantener. Así, acercando el modelo de abstracción al problema a resolver y no a la máquina física, aparecieron en los años 60 los primeros lenguajes Orientados a Objetos, también 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 características que tienen que tener estos lenguajes de programación y que se verán más en profundidad en la Unidad 1.2: x

Todo puede ser representado como un objeto, siendo capaz de

almacenar cierta información y realizar operaciones sobre ella. x

Un programa es un conjunto de objetos colaborando entre sí,

indicando que es lo que hay que hacer mediante el envío de mensajes. x

Cada

objeto

esta

contruido

en

base

a

otros

objetos,

permitiendo alcanzar grados mayores de complejidad. x

Cada objeto pertenece a un tipo, denominado clase.

x

Todos los objetos del mismo tipo pueden recibir los mismos

mensajes. 1

MÓDULO 1

A continuación, se muestra la evolución de los lenguajes Orientados a Objetos

Unidad 1.1 Introducción

2. Ventajas de la Orientación a Objetos

hasta la aparición del lenguaje Java, objeto de nuestro estudio. Habiendo visto la evolución de los lenguajes de programación en base a su nivel de abstracción, el principal objetivo de los lenguajes Orientados a Objetos fue reducir la complejidad del desarrollo y mantenimiento del Software. Así las principales ventajas de estos lenguajes son:

No hay que olvidar, que la Orientación a Objetos aplica también al Análisis y Diseño

x

Suministra modelos similares a los del mundo real.

x

Facilita el desarrollo de sistemas complejos.

x

Facilita la reutilización

x

Permite el desarrollo iterativo de aplicaciones.

x

Facilita la interoperabilidad de aplicaciones.

2.1 Similitud con el mundo real

de las soluciones. El método más utilizado a día de hoy es el UML (siglas de Unified Modeling Language) sucesor de los métodos de Análisis y Diseño Orientado a

Mediante la abstracción del mundo real, lo que se pretende es definirlo tal y

Objetos de finales de los 80 y comienzo de los 90, tales como: Booch, Rumbaugh

como es en base al problema a resolver y ciñéndonos al ámbito de la solución.

(OMT) y Jacobson.

Nos permitirá definir que entidades como tales vamos a necesitar que existan para solucionar nuestro problema y las relaciones entre ellas, tales como

UML es un método visual, basado en diagramas, que permite modelar sistemas, en base a Especificaciones, Arquitectura, Diseño y/o Implementación.

relaciones jerárquicas, relaciones de interacción. x

Ejemplo: Tenemos que desarrollar un programa para una tienda de

animales donde solo van a tratar mamíferos y solo ciertos tipos de mamíferos. Por lo tanto, los peces, las aves ... quedan fuera del ámbito de nuestro mundo real.

2

3

MÓDULO 1

Unidad 1.1 Introducción

x

Encapsulamiento. Permite ocultar que és lo que proporciona

una entidad, sin necesidad de conocer como lo proporciona. x

Modularidad. División de las soluciones en componentes más

pequeños o módulos independientes que se integran entre sí. Una solución compleja desarrollada en un solo módulo es imposible de abarcar por un solo lector, debido al número de caminos de control, variables ... x

Herencia. Relación de jerarquía entre las entidades, en cuanto

a funcionalidad.

2.3 Facilita la reutilización 2.2 Facilita el desarrollo de sistemas complejos.

La reutilización de código es una de las grandes ventajas de los lenguajes Orientados a Objetos. ¿Cuáles son las características que permiten obtener

El sistema de abstracción del mundo real, permite centrarnos por una parte en cuales son las entidades del dominio, qué información de toda la posible es la que ayuda a solventar nuestro problema, que tipo de acciones u operaciones son relevantes en estas entidades, etc. para una vez que

dicha

ventaja? Se consigue mediante la herencia (relaciones jeráquicas de

entidades),

composición

(creación

de

entidades

en

base

a

otras)

y

parametrización (reutilización de operaciones en función de los parámetros que se les pasan a dichas operaciones).

tengamos toda esta información, ver las interrelaciones entre todos ellos y su convivencia.

La Orientación a Objetos soporta la reutilización basada en la utilización de librerías de componentes (agrupación de entidades con un significado

Este tipo de abstracción nos permite realizar un tipo de programación BottonUp (de abajo a arriba), donde partiendo de piezas más pequeñas se va conformando el todo.

relacionado),

patrones

de

diseño

(soluciones

dadas

a

problemas

ya

existentes) y arquitecturas software (también conocidas con el nombre de framework).

Se puede llegar a comparar con el mecanismo de contrucción del Hardware, que para la construcción de un todo, es necesario la utilización de piezas pequeñas que se van ensamblando para conformar las piezas más grandes, que a su vez conforman

el elemento Hardware

2.4 Permite el desarrollo iterativo.

final como puede ser un El desarrollo iterativo, permite ir paso a paso en el ciclo de desarrollo. No se

ordenador.

pretende empezar desde 0 y terminar el 100% del desarrollo en una sola Los elementos fundamentales del modelo de Objetos, en el que se van a

etapa.

basar el desarrollo de estos sistemas, y que se verán más en profundidad en la Unidad 1.3 son: x

Con el desarrollo iterativo, se van definiendo etapas e hitos a conseguir, consiguiendo fases de pruebas y aprobación de lo desarrollado hasta el

Abstracción. Capacidad de definir los datos y operaciones que

momento en fases mucho mas tempranas que en el desarrollo tradicional. De

se necesitan, de las entidades de nuestro mundo real.

4

5

MÓDULO 1

esta forma se consigue un prototipado controlado: se crea un prototipo al cual

Unidad 1.1 Introducción

2.5 Facilita la interoperabilidad

se le añaden capacidades de forma incremental. Las arquitecturas Orientadas a Objetos permiten un mejor aislamiento de las El cliente puede ir probando versiones mucho antes que en el desarrollo

dependencias de la topología en la que se ejecuta la solución. De esta manera

tradicional. De esta manera se comprueba que la solución dada al problema a

no nos tendremos que preocupar en que topología se va a ejecutar nuestra

resolver es realmente lo que se está esperando y no tenemos que esperar a la

solución, ni en el caso de que la solución vaya a estar dividida en distintas

finalización del desarrollo, para verificar que la solución final satisface el

partes, las plataformas de ejecución de las mismas. De esta manera la

problema a resolver en su totalidad.

entidad oficina, con la definición de sus datos y de sus operaciones, será la misma independientemente de que se ejecute en un PC, en un Servidor o en

Actualmente, el desarrollo iterativo, se basa en la utilización de ‘Casos de

un Mainframe.

Uso’, uno de los diagramas definidos por UML. Describen una visión externa del comportamiento del Sistema desde el punto de vista del usuario,

Es una diferencia a tener en cuenta, con respecto a C++ que sí que necesita

constituyendo un modelo de lo que el Sistema hará sin tener en cuenta el

saber en que topología se va a ejecutar.

cómo lo hará. A continuación se muestra como sería 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 están pendientes de iniciarse.

6

7

MÓDULO A

MÓDULO 1

x

Los lenguajes orientados a objetos, miden su nivel de abstracción con respecto a la definición del mundo real.

x

Conceptos básicos. Objeto, atributo, método, interfaz, clase

Las principales ventajas son: -

Suministra modelos similares a los del mundo real.

-

Facilita el desarrollo de sistemas complejos.

-

Facilita la reutilización.

-

Permite el desarrollo iterativo de aplicaciones.

-

Facilita la interoperabilidad de aplicaciones.

-

Facilita el desarrollo de sistemas complejos.

Tema 1.2

Índice de la unidad:

1. Conceptos básicos 2. Objeto 3. Clase

Unidad 1.2 Conceptos básicos

En esta unidad veremos cuales son los conceptos básicos en los que se apoya la Orientación a Objetos, tanto a nivel de Análisis y Diseño, como en la Programación.

1. Conceptos básicos Como se ha comentado en la Unidad 1.1, los lenguajes de programación Orientados a Objetos, se caracterizan por tener su nivel de abstracción basado en el mundo real. Así, el énfasis está en la abstracción 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 programación, introducen un nuevo conjunto de términos, o conceptos básicos que son esenciales comprender, para poder realizar cualquier análisis, diseño o desarrollo Orientado a Objetos: x

Objeto

x

Atributo

x

Método

x

Interfaz

x

Clase

A continuación veremos en más detalle cada uno de estos conceptos básicos.

2. Objeto Hay muchas definiciones que pueden darse de un objeto, entre las cuales se encuentran: x

Es cualquier cosa que vemos a nuestro alrededor, algo tangi-

ble y/o visible, animado o inanimado. Por ejemplo, un camión, un perro, una cuenta bancaria ...

11

MÓDULO 1

Unidad 1.2 Conceptos básicos

2.1 Características de un objeto Todos los objetos, tienen intrínsecos las siguientes características, como se han visto en alguna de definiciones del apartado anterior: x

x

Algo que puede comprenderse intelectualmente. Por ejemplo,

Identidad. Es un identificador unívoco para cada uno de los

objetos. En el caso de que los valores de los atributos fueran los

una proceso de ordenación

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 vía dicha identidad. x

x

Comportamiento. Conjunto de operaciones o métodos que

proporcionan servicios a otros objetos que solicitan dichos servicios

Una entidad Software. Por ejemplo una lista de cosas.

cuando necesitan que se realice una cierta operativa. x

Estado. Conjunto de propiedades o atributos que recuerdan el

efecto de las operaciones. Definiciones dadas por creadores de metodologías Orientadas a Objetos como pueden ser:

x

Ejemplo: Para un reloj determinado, la identidad o identificador podría ser

unReloj, con los atributos hora (horas, min, seg), dia (dia, mes, año), modelo y

x

numSerie y cuyos métodos u operaciones serían getHora, getDia, incrementar-

Un objeto se caracteriza por un número de operaciones y un

Hora, incrementarDia, limpiarPantalla y traducirFrecuencia.

estado que recuerda el efecto de estas operaciones. Ivar Jacobson x

Un objeto tiene un estado, comportamiento e identidad; la

estructura y comportamiento de objetos similares se definen en sus

2.2 Estructura de un objeto

clases comunes. Grady Booch x

En base a las características del objeto mencionadas anteriormente, todo obUn objeto es una entidad que tiene un estado (cuya represen-

jeto está formado por atributos o estructura encapsulada de los datos y por

tación está oculta) y un conjunto definido de operaciones que ope-

los métodos u operaciones permitidas por dicho objeto, ya sean visibles para

ran sobre ese estado. Ian Sommerville

el usuario o no.

x

Los métodos pueden clasificarse de la siguiente manera:

Un objeto es una identidad con unos límites bien definidos que

encapsulan estado y comportamiento. El estado se representa por atributos y relaciones, el comportamiento es representado por operaciones y métodos. Object Management Group Los términos objeto e instancia son usados indistintamente.

x

Modificador (setter): altera el estado de un objeto. Por ejem-

plo, setHora() x

Selector (getter): accede al estado de un objeto sin alterarlo.

Por ejemplo getHora(X) 12

13

MÓDULO 1

Unidad 1.2 Conceptos básicos

x

Iterador: permite acceder a todas los elementos de un objeto.

Solo disponible para colecciones de objetos. x

Constructor: crea un objeto e inicializa su estado. Por ejemplo

Reloj(). x

Destructor: limpia el estado de un objeto y lo destruye. Por

ejemplo ~Reloj(). No existe en Java. x

Propósito general: la lógica del programa. Por ejemplo, lim-

piarPantalla(), incrementarDia(). Gráficamente, se puede visualizar la estructura de un objeto de la siguiente manera:

Atributo: Es una característica fundamental de cada objeto y por lo tanto como veremos posteriormente de una clase. Todos los atributos tienen algún valor, siendo este una cantidad, una relación con otro objeto ... Si el valor del atributo es un valor fijo para todos los objetos, se dice que es un atributo estático

Método: Es una acción que se realiza sobre un objeto para consultar o modificar su estado.

x

2.3 El aspecto de los objetos. Ejemplo: Para el objeto unReloj mencionado anteriormente, la estructura

sería la siguiente:

Cuando se habla del aspecto de los objetos, no nos estamos refiriendo a los conceptos de buen o mal aspecto visual. Nos referimos a como el objeto se ve internamente o aspecto interno y como ven al objeto desde otros objetos también llamado aspecto exterior.

14

15

MÓDULO 1

Unidad 1.2 Conceptos básicos

3. Clase Hasta ahora hemos visto que define a un objeto. Una de las definiciones más sencillas es algo del mundo real, tangible o visible. Hemos visto que los objetos están formados por atributos y métodos. La definición de estructura y comportamiento de un objeto es a lo que se denomina clase. Es por tanto un patrón para la definición de atributos y métodos para un tipo particular de objetos. Todos los objetos de una clase dada son idénticos en estructura y comportamiento pero son únicos (aunque tengan los mismos valores en sus atributos). Este aspecto exterior, es llamado también interfaz, siendo la parte visible y

Instancia es el término utilizado para referirse a un objeto que pertenece a una cla-

accesible para el resto de objetos. Puede estar formado por uno o varios mé-

se concreta.

todos. También se le define como el protocolo de comunicación de un objeto. Una clase, por tanto es solamente la definición. Mientras que un objeto o instancia Es posible que exista algún método que solo pertenezca al aspecto interno pe-

es algo real con la estructura y comportamiento de la clase a la que pertenece.

ro no pertenezca al interfaz. En este caso, estos métodos no pueden ser llamados desde otros objetos, sino que solamente pueden ser llamados desde

La estructura de una clase, por tanto, viene determinada por un nombre, los atribu-

métodos del propio objeto.

tos que contiene y los métodos que realiza.

x

Ejemplo: Para el objeto unReloj, el interfaz estaría formado por los métodos

getHora, getDia, incrementarHora e incrementarDia. Los métodos

limpiarPan-

talla y traducirFrecuencia solamente pertenecen (conjuntamente con los que forman el interfaz) al aspecto interno. Así el método limpiarPantalla, es llamado por getHora y getDia antes de mostrar la información pedida en el método

x

Ejemplo: El objeto unReloj, pertenece a la clase Reloj, cuyo nombre es Re-

loj,

cuyos atributos son dia, hora, modelo y numSerie y cuyos métodos son

getHora, getDia, incrementarHora, incrementarDia, limpiarPantalla y traducir-

Interfaz: Aspecto exterior que es visible al resto de objetos. Puede estar formado por uno o varios métodos.

16

17

MÓDULO 1

Unidad 1.2 Conceptos básicos

Frecuencia

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 problemática, aparece el concepto de Clasificación. La clasificación es el medio por el que ordenamos el conocimiento, ya que fundamentalmente es un problema de búsqueda de similitudes. Al clasificar buscamos grupos de cosas que tengan una misma estructura o exhiban un comportamiento común. La clasificación dentro de la Orientación a Objetos, sobre todo en las fases de

Como se puede ver en la imagen anterior, en los diagramas UML, la definición de una clase, se realiza mediante un rectángulo, divido en tres partes y conteniendo

Análisis y Diseño, permite que los objetos con la misma estructura de datos y con el mismo comportamiento se agrupan para formar una clase.

en el siguiente orden: Nombre, Atributos y Métodos.

3.1 Clases versus Objetos. Es importante saber diferenciar que es una clase y que es un objeto y en que consiste cada una de ellas. Por ello, recapitulamos toda la información mostrada hasta el momento. Una clase es un patrón para la definición del estado y el comportamiento de un tipo particular de objetos. Todos los objetos de una clase dada son idénticos en estructura y comportamiento, pero tienen identidad única. Un objeto pertenece a una clase en particular. Los objetos son creados y destruidos en tiempo de ejecución. Residen en el espacio de memoria.

18

19

MÓDULO 1

Título de unidad didáctica

x Decidir cual es el concepto o conceptos (Clase, Objeto, Método, Atributo) que

apoya la Orientación a objetos:

cuadran con las siguientes definiciones. Pensar la solución antes de pasar al

-

Objeto.

siguiente cuadro:

-

Atributo.

-

Método.

-

Interfaz.

-

Clase

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 métodos: 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 métodos: 12. Yo puedo cambiar en ejecución:

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, método 4. Yo puedo tener muchos métodos: Clase, objeto 5. Yo represento el estado: Atributo 6. Yo represento el comportamiento: Método 7. Yo estoy en los objetos: Atributo, método 8. Yo vivo en memoria: Objeto 9. Yo soy usado para crear instancias: Clase 10.Mi estado puede cambiar: Objeto 11.Yo declaro métodos: Clase 12.Yo puedo cambiar en ejecución: Objeto, atributo

20

En esta Unidad hemos visto los conceptos básicos en los que se

MÓDULO A

Paradigmas de la OO

Tema 1.3

Índice de la unidad:

1. Paradigmas de la Orientación a Objetos 2. Abstracción 3. Encapsulación y ocultamiento 4. Relaciones 5. Polimorfismo

Unidad 1.3 Paradigmas de la Orientación a Objetos

En esta unidad veremos cuales son los paradigmas en los que se apoya la Orientación a Objetos, tanto a nivel de Análisis y Diseño, como en la Programación.

1. Paradigmas de la Orientación a Objetos. Como se ha comentado en la Unidad 1.1, los lenguajes de programación Orientados a Objetos, se caracterizan por tener su nivel de abstracción basado en el mundo real. Así, el énfasis está en la abstracción 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. El paradigma de la Orientación a Objeto es una disciplina de ingeniería de desarrollo y modelado de Software que permite construir más fácilmente sistemas complejos a partir de los componentes individuales vistos en la Unidad 1.2, tales como objetos, clases, atributos, métodos e interfaces, todos ellos utilizados para construir un programa. Esta disciplina y por tanto cualquier lenguaje de Orientación a Objetos que pertenezca a ella, debe de cumplir con los siguientes paradigmas (aunque cada lenguaje tenga sus propias peculiaridades al respecto): x

Abstracción

x

Encapsulación y Ocultamiento

x

Herencia

x

Polimorfismo

A continuación veremos en más detalle cada uno de estos paradigmas.

2. Abstracción Consiste en la generalización conceptual de los atributos y comportamiento de un determinado conjunto de objetos.

25

MÓDULO 1

Unidad 1.3 Paradigmas de la Orientación a Objetos

La clave de la programación Orientada a Objetos está en abstraer los métodos y los

que es inaccesible para los demás. Permite tratar a un objeto como una caja ne-

datos comunes a un conjunto de objetos y almacenarlos en una clase. Así todos los

gra, la cual solo es tratada por el resto de objetos por su el interfaz.

objetos de una clase, se diferenciaran solamente en el estado, teniendo todos ellos el mismo comportamiento.

Permite, por tanto que se modifique la implementación interna de un objeto sin afectar a los clientes que lo utilizan. De esta manera, mientras el interfaz no varíe,

Primeramente hay que centrarse en lo que es y lo que hace un objeto (atributos y

se puede modificar la implementación o el aspecto interno, sin que los objetos con

comportamiento), antes de decidir cómo debería ser implementado. Nos centramos

los que interrelaciona se vean afectados.

por tanto en la definición, en lugar de la implementación. x

Ejemplo de abstracción: En nuestro mundo real, tenemos los siguientes

objetos, miGato, miPerro, miLeon, miTigre y miLobo. Si abstraemos los atribu-

4. Relaciones

tos comunes que queremos tener contemplados en el ámbito de nuestra solución, encontramos que en todos ellos, queremos tener una foto, que tipo de ali-

Las clases no existen de forma aislada sino que muchas veces tienen dependencias

mentación, donde habitan y su tamaño, y como comportamiento, queremos sa-

entre ellas. Estas dependencias es a lo que se llama relación y existen distintos ti-

ber como hacen ruido, como comen, como duermen y como rugen. Así de una

pos o grados, que se enumeran a continuación:

realidad, hemos abstraído estado y comportamiento y hemos definido la clase Animal.

x

Asociación: Relación simple.

x

Agregación: Contenido en ...

x

Composición: Obligatoriedad. Uno no puede existir sin el otro.

x

Herencia: Relación Jerárquica. Son del tipo de

x

Relaciones dinámicas: Mensajes.

4.1 Relación de Asociación Representa la dependencia más general entre clases, siendo una dependencia de tipo semántico. Por defecto es bidireccional, aunque se puede restringir a

3. Encapsulación y Ocultamiento Se tratan los dos paradigmas de forma conjunta, puesto que se utilizan normalmente de forma simultánea.

una sola dirección. Esta relación tiene multiplicidad (propiedad que expresa el número de instancias de cada clase que participa en la relación): x

0..1 : cero o uno

necientes a una misma entidad, al mismo nivel de abstracción.

x

1 : uno y solo uno

Ocultamiento, consiste en separar el aspecto externo del objeto o interfaz, al cual

x

0..* o * : cero o muchos

Encapsular, significa reunir a todos los elementos que pueden considerarse perte-

pueden acceder otros objetos, del aspecto interno e implementación del mismo, 26

27

MÓDULO 1

Unidad 1.3 Paradigmas de la Orientación a Objetos

x

Por tanto, un objeto que representa el ‘todo’, está asociado con un conjunto

1..* : uno o muchos

de objetos que representan sus componentes. En los diagramas UML, la linea recta

se utiliza para

representar la asociación bidireccional y la flecha (linea discontinua o conticuando es unidireccional.

nua) x

Ejemplo de asociación unidireccional: Un pedido puedo acceder

En los diagramas UML, el rombo blanco se utiliza

para repre-

sentar la agregación. x

a un

producto, pero desde un producto no puedo acceder a un pedido. Otro ejemplo,

Ejemplo de agregación: Una centralita puede contener llamadas. Pero

puede existir sin ellas.

sería miPrograma puede acceder a un producto, pero un producto no puede acceder a miPrograma. x

Ejemplo de asociación bidireccional: Un cliente puede acceder a un pedi-

do, y un pedido puede acceder a un cliente.

4.3 Relación de Composición Se trata de una relación de agregación fuerte. Un objeto no puede existir si no existen los objetos de los que está compuesto. En los diagramas UML, el rombo negro se utiliza

para repre-

sentar la composición. x

Ejemplo de composición: Un coche no puede existir, sin las partes que le

componen, en este caso, las ruedas, la carrocería y el motor.

4.2 Relación de Agregación Es una forma particular de asociación que expresa un acoplamiento mas fuerte entre objetos. Indica que los objetos de una clase contienen o están formados por objetos de otras clases, aunque no siempre precisa una contención física, sino al menos lógica.

28

29

MÓDULO 1

Unidad 1.3 Paradigmas de la Orientación a Objetos

4.5 Relación dinámica: Mensaje 4.4 Relación de Herencia Un mensaje es un comando o petición que se le envía a otro objeto, para que Se basa en la existencia de relaciones de generalización/especialización entre

realice una operación.

clases. El objeto llamante requiere el conocimiento previo del interfaz del objeto reLas clases se disponen en una jerarquía, donde una clase hereda los atributos

ceptor, porque sino no tiene manera de saber que peticiones tiene disponibles

y operaciones de las clases superiores en la jerarquía.

y los formatos del mensaje a enviar.

Una clase puede tener sus propios atributos y operaciones adicionales a los

Esta relación se indica que es dinámica ya que se observa en ejecución, no en

heredados y puede modificar los atributos y operaciones heredadas si necesita

el diseño (en diseño solo se observan las interfaces y las relaciones). En una

cambiar su implementación.

clase, por tanto no se define, ningún tipo de mensaje. Es en ejecución, donde se aprecia los mensajes que un objeto llamante envía a uno receptor para que

En los diagramas UML, la flecha cerrada blanca se utiliza

para represen-

tar la herencia. x

Ejemplo de herencia: En nuestro mundo real, estamos modelizando a los

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 operación de dormir de la misma manera que se ha de-

modifique su estado o cambie su comportamiento. x

Ejemplo de mensaje: El mensaje en este ejemplo es la llamada desde una-

Persona al objeto unReloj, para que le de la hora mediante el método getHora. Para ello, el objeto unaPersona tiene que conocer el interfaz de unReloj, para saber que método es el que tiene que llamar, si tiene que pasarle parámetros, de que tipos y si le va a devolver alguna información y una vez más, de que tipo.

terminado en la clase Animal.

30

31

MÓDULO 1

Unidad 1.3 Paradigmas de la Orientación a Objetos

5. Polimorfismo Permite implementar múltiples formas de un mismo método, dependiendo cada una de ellas de la clase sobre la que se realice la implementación. Esta basado en el concepto especialización de la herencia, donde cada clase hija, sabe implementar mejor que el padre alguno o todos sus métodos. Esto posibilita desencadenar implementaciones de operaciones diferentes como

Construir un Diagrama de Clases UML a partir de las siguientes observaciones: x x x x x

respuesta a un mismo mensaje, en función 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 envío de mensaje independientemente del tipo de objeto específico o clase hija; solamente debe de

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 pétalo es una parte de ambos tipos de flores. Los pájaros se comen a ciertas plagas como los pulgones, que pueden infectar a ciertos tipos de flores.

ser consciente del interfaz del mismo, mediante la clase padre. Es en ejecución, cuando dependiendo realmente del tipo de objeto real, se ejecutará la implementación concreta de cada objeto. x

Del enunciado de la práctica, se pueden determinar distintas relaciones: x

en el mundo real existen flores sin pétalos (sería una relación de agrega-

Ejemplo de polimormismo: En el ejemplo, el Matemático, solo va a tener

ción) en el ámbito de nuestro problema, solo contemplamos flores con ellos.

relación 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 métodos de una manera mas especializada que el padre

32

Existe una clase Flor que contiene Pétalos: Relación de composición. Aunque

x

Las clases Rosa y Margarita tienen son Flores, por lo que tienen una relación de herencia con Flor. 33

MÓDULO 1

x

Unidad 1.3 Paradigmas de la Orientación a Objetos

Como solución también válida, se podría tener una relación de herencia con Rosa, las clases RosaAmarilla y RosaRoja, pero de esta manera, teniendo un atributo color permite una mejor reutilización en el caso de que pueda aparecer otra rosa de otro color.

x

A su vez, como tipos de Plaga que pueden asolar a nuestras Flores son los Pulgones , por lo que tiene una relación de herencia entre Plaga y Pulgon y

En esta Unidad hemos estudiado los diferentes paradigmas de la programación

una relación de asociación entre Plaga y Flor. La Flor conoce a la Plaga pero

Orientada a Objetos. Estos son:

no a la inversa. x

Como los Pajaros se comen a las plagas, tienen relación de asociación con

x x x

Abstracción Encapsulación y Ocultamiento Relaciones

ellas, con cualquier tipo, ya sea un Pulgon o en un futuro una ArañaRoja.

x

34

-

asociación

-

agregación

-

composición

-

herencia

-

mensaje

Polimorfismo

35

MÓDULO B

UNIDADES DIDÁCTICAS:

1. Introducción a Java. Características del lenguaje 2. Entorno de desarrollo 3. Sintáxis. 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

MÓDULO B

Introducción a Java. Características del lenguaje

Tema 2.1

Índice de la unidad:

1. Introducción 2. Características del lenguaje 3. La plataforma Java

Unidad 2.1 Introducción a Java. Características del lenguaje

En esta unidad veremos el origen del lenguaje de programación Java y cuales son sus principales características.

1. Introducción Fue creado por Sun Microsystems en el año 1991 e inicialmente se denómino OAK y se desarrolló principalmente orientándolo a la programación de microsistemas y componentes electrónicos. Tras el cambio de nombre y modificaciones de diseño, el lenguaje Java fue presentado en sociedad en Enero de 1995 con una nueva orientación: 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 manipulación directa de punteros o memoria. Entre noviembre de 2006 y mayo de 2007, Sun Microsystems cedió la mayor parte de sus tecnologías Java a GNU GPL, de tal forma que prácticamente 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 versión inicial, JDK (Java Depelopment Kit o entorno de desarrollo) 1.0, así como un aumento increíble en el número de clases y paquetes que componen la biblioteca estándar. Esta biblioteca estándar se ha visto ampliada por numerosas bibliotecas de carácter específico, como pueden ser las bibliotecas visuales, comunicaciones, etc.

43

MÓDULO 2

Unidad 2.1 Introducción a Java. Características del lenguaje

2. Características del lenguaje

x

No permite la sobrecarga de operadores.

A continuación enumeramos todas las características de este lenguaje de progra-

x

No soporta la herencia múltiple.

x

No soporta destructores.

x

Posee una clase String, en vez del array de tipo char[] finali-

mación Orientado a Objetos, que además de cumplir con los paradigmas de esta disciplina de programación (Abstracción, Encapsulación y Ocultamiento, Herencia, Polimorfismo y Reutilización), posee las siguientes propiedades: x

Sencillo

x

Distribuido

x

Interpretado

x

Robusto

x

Seguro

x

Arquitectura neutra y portabilidad

x

Altas prestaciones

x

Multithread

x

Dinámico

zado con nulo. x

Cuenta con un sistema automático para asignar y liberar

memoria: el Garbage Collector. Uno de los grandes problemas de C++ es la reserva y liberación de la memoria de forma programática, 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

A continuación veremos en más detalle cada una de las características mencio-

protocolos de comunicaciones TCP/IP: HTTP, FTP… abriendo sockets, estableciendo y aceptando conexiones con servidores o clientes remotos. Permite manipular con gran facilidad recursos vía URL.

nadas.

2.3 Interpretado 2.1 Sencillo

Para que un programa Java puede ejecutarse, tiene que ser compilado pre-

Los creadores de Java se basaron en el lenguaje de programación C++, pero eliminaron la mayoría de sus complejidades, para facilitar su aprendizaje, su lectura y el mantenimiento de los programas. A continuación se listan algunas de las complejidades que se eliminaron:

44

x

No soporta tipos de datos: struct, union, y puntero

x

No soporta typedef ni #define

viamente mediante un compilador. Es la principal diferencia con el resto de lenguajes interpretados. Necesita ser válidado y compilado en un paso previo al de su ejecución. El compilador de Java traduce el código fuente o programa java a un código intermedio (bytecode) o código máquina similar a las instrucciones de ensamblador pero independiente de la máquina física en la que se ejecuta.

45

MÓDULO 2

Los bytecodes son interpretados (ejecutados) en cualquier entorno donde

Unidad 2.1 Introducción a Java. Características del lenguaje

2.4 Robusto

exista un intérprete de Java generando código máquina. El intérprete de Java se llama Máquina Virtual Java o Java Virtual Machine (JVM) y este si que es

Un software robusto es aquel que no se ‘interrumpe’ fácilmente a consecuen-

dependiente de la plataforma en la que se ejecuta, existiendo un instalable

cia de fallos. Al ser previamente compilado, todos los errores sintácticos son

para la mayoría de sistemas operativos y arquitecturas como veremos en la

detectados en este fase y obligatoriamente tienen que ser eliminados.

Unidad 2.2. Un lenguaje de estas características suele tener más restricciones a la hora de A continuación se muestra cual sería el procedimiento a seguir, para poder

programar y realiza numerosas comprobaciones tanto en compilación como

ejecutar un programa java.

en ejecución. Facilita el manejo de excepciones, para poder tratar los fallos en ejecución (se verán en más detalle en la Unidad 3.5). El tratamiento automático de la memoria impide poder sobrescribirla y corromper o modificar otros datos mediante punteros.

2.5 Seguro

Esta característica es la que posibilita el propósito inicial de Write Once, Run Everywhere.

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 crítico. A nadie le gustaría ejecutar en su propio ordenador programas que tuvieran total acceso a su sistema, donde por ejemplo, pudieran coger información confidencial, tales como passwords o cuentas bancarias o incluso poder formatear el ordenador personal. Todos los navegadores poseen una ‘sand box’ o entorno de ejecución controlado donde no se permite realizar ninguna ejecución fuera de ella (como puede ser acceso al sistema de ficheros) a menos que se indiquen explícitamente excepciones por parte del usuario que lo ejecuta. Estas excepciones pueden venir determinadas por tecnologías de firma digital para confiar en un determinado código Java y/o mediante políticas de seguridad para controlar de una manera más precisa que puede o no puede hacer (por ejemplo leer ciertos ficheros, poder abrir sockets ...).

2.6 Arquitectura neutra y portabilidad Los bytecodes, resultados de la compilación de los programas java, son interpretados en cualquier plataforma donde exista una JVM, ya sea por ejemplo, una plataforma Windows, Unix, Mac, entre otras.

46

47

MÓDULO 2

Unidad 2.1 Introducción a Java. Características del lenguaje

Son independientes de que su ejecución se realicen en estaciones de trabajo,

A pesar de todo, existe algún compilador ‘real’ de Java (perdemos la portabili-

o en servidores, o en arquitecturas físicas con el mismo sistema operativo o

dad y ganamos en rendimiento). Es decir, que se compila antes de su ejecu-

sistemas hetereogéneos.

ción, generando un ejecutable (no código interpretable) atado a dicha plataforma. Este tipo de compilador se encuentran en desuso.

Por tanto, el código bytecode es independiente no solo de la plataforma Software en la que se ejecuta, sino también de la plataforma Hardware.

2.8 Multithread

La portabilidad entre las plataformas, se consigue, debido a que la JVM espe-

El término multithread o multihilo en castellano, se refiere a la ejecución de

cifica el tamaño de sus tipos básicos, el comportamiento de los operadores

varias tareas a la vez en un mismo proceso, limitadas estrictamente en tiem-

aritméticos y el uso de estándares como UNICODE, IEEE 754 etc… que per-

po real por el número de procesadores.

miten representar cualquier carácter mediante 2 bytes en lugar de uno solo, como ocurre con el ASCII.

x

Ejemplo: Mientras que un thread se encarga de interactuar con el

usuario, y otro thread realiza ciertos cálculos. Por ejemplo, es bastante frecuente la existencia de un thread que espera que un usuario lance una petición de operación y en el momento de la llegada se abra otro thread para ejecutar dicha operación, mientras el thread de comunicación con el usuario queda a la espera de nuevas peticiones. Así, si tres usuarios realicen tres peticiones al mismo tiempo el número total de threads serían 4, uno por cada operación ejecutándose más el thread que sigue quedando a la espera de nuevas comunicaciones. Cuando la ejecución de cada operación termine, el thread correspondiente terminará y desaparecerá.

Para poder realizar esta ejecución simultanea de varias tareas, Java posee una serie de clases que facilitan su utilización.

2.9 Dinámico El código C++, a menudo requiere una recompilación y lincado completa si cambia una clase. Java utiliza una fase de linkado o utilización de clases en tiempo de ejecución en modo dinámico. Así las clases solo son utilizadas cuando son necesitadas.

2.7 Altas prestaciones

Permite utilizar nuevas clases bajo demanda, procedentes de fuentes diversas, inclusive internet.

Existen intérpretes JIT (Just-in-time) que interpretan el código en el momento de la ejecución, generando código máquina una sola vez y en las sucesivas

Para conseguir esto, Java emplea un método de interfaces para evitar estas

ejecuciones reutiliza dicho código máquina en lugar de volver a generar cada

dependencias y recompilaciones.

vez que pasa la ejecución por ahí. Además, Java permite la indirección. Es decir, en lugar de indicarle de forma A partir de la JVM 1.2.2 se introdujo un nuevo JIT llamado HotSpot. 48

directa que utilice la clase X, se le puede indicar que busque entre todas las 49

MÓDULO 2

Unidad 2.1 Introducción a Java. Características del lenguaje

clases vía programática, una clase denominada X, y una vez encontrada que

x

la ejecute. Este acceso se puede realizar tanto a nivel de clase, como a nivel

sos limitados como teléfonos móviles, PDAs,

de método y atributo.

x

Java ME: Java Micro Edition. Orientado a entornos con recur-

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.

3. La plataforma Java

x

Como hemos mencionado anteriormente, una plataforma es tanto el entorno hard-

presariales distribuidos o Internet.

Java EE: Java Enterprise Edition. Orientados a entornos em-

ware y/o software donde se ejecuta un programa. x

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: x

La máquina virtual Java (JVM) o intérprete de Java.

x

La Interfaz de Programación 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)

Existen distintas ediciones de la plataforma Java:

50

51

MÓDULO B

MÓDULO 2 PROGRAMACIÓN JAVA

En esta unidad se ha visto el origen del lenguaje de programación Java y las características que lo conforman: -

Orientado a Objetos

-

Seguro

-

Distribuido

-

Interpretado

-

Robusto

-

Seguro

-

Arquitectura neutra y portabilidad

-

Altas prestaciones

-

Multithread

-

Dinámico

Además se han categorizado los distintos tipos de plataformas Java:

-

Java ME

-

Java SE

-

Java EE

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

Unidad 2.2 Entorno de Desarrollo

En esta unidad veremos el entorno de desarrollo de Java, denominado JDK (Java Development Kit) y sus principales características.

1. Java Development Kit Es el entorno de desarrollo de referencia para programas desarrollados del lenguaje de programación Java. El JDK como tál, es un conjunto de especificaciones que son implementadas por distintos proveedores, tales como: x

Sun, que tiene una JDK para las siguientes plataformas: Win-

dows en sus distintas versiones, Linux y Solaris (Sun). Descargable de

forma

gratuita

de

la

siguiente

URL

http://java.sun.com/javase/downloads x

IBM, que tiene una JDK para las siguientes plataformas: Win-

dows en sus distintas versiones, Linux, AIX, OS/2, OS/400 y z/OS. x

Apple, que tiene una JDK para las siguientes plataformas: Ma-

cintosh .

1. 1 Historia La primera versión del JDK fué el JDK 1.0.0 que se retiró de circulación con la aparición 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. También ha ido cambiando el sistema de numeración, cambiando a 5.0 en lugar de 1.5. A su vez, y a partir de la versión 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

MÓDULO 2

Unidad 2.2 Entorno de Desarrollo

A partir de la versión 5 se ha quitado el 2 del nombre, quedando la nomencla-

x

tura Java SE, Java EE y Java ME respectivamente

AWT (Abstract Windowing Toolkit).

Cada una de estas plataformas, contienen tanto una JDK (o entorno de desa-

x

rrollo y ejecución) como un JRE (o Java Runtime Environment, solamente uti-

Database Connectivity) para la integración con bases de

lizado en ejecución), también llamado JVM. En este curso, solamente nos cen-

datos, RMI (Remote Method Invocation)

traremos en el JDK del Java SE.

x

Una reestructuración amplia del modelo de eventos

Clases internas (inner clases), JavaBeans, JDBC (Java

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 denominación Java 2. Otras mejoras añadidas incluían: x

La palabra reservada (o keyword) strictfp,

x

Reflexión en la programación (Reflection API)

x

La API gráfica, Swing, fue integrada en las clases bási-

cas x

La máquina virtual (JVM) de Sun fue equipada con un

compilador JIT (Just in Time) por primera vez x

El Java Plug-in para ejecución de Java en los navegado-

res. x

Java IDL, una implementación de IDL (Lenguaje de

Descripción de Interfaz) para la interoperabilidad con Desde la versión 1.4 de J2SE, la evolución del lenguaje de programación Java

CORBA

ha sido regulada por el JCP (Java Community Process), que utiliza Java Speci-

x

fication 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 Especificación del Lenguaje Java. Los cambios en los JLS son gestio-

x

nados en JSR 901.

Kestrel. Los cambios más notables fueron:

SDK 1.3: Aparece el 8 de mayo de 2000 con el nombre clave

Veamos a continuación un breve resumen de las versiones y los cambios im-

x

portantes que hubo en cada una de ellas:

JVM de HotSpot fue lanzada inicialmente en abril de 1999,

La inclusión de la máquina virtual de HotSpot JVM (la

para la JVM de J2SE 1.2)

x

JDK 1.0: Aparece el 23 de Enero de 1996.

x

JDK 1.1: Aparece el 19 de Febrero de 1997. Los cambios que

incluye son: 56

Colecciones (Collections)

x

RMI fue cambiado para que se basara en CORBA

x

JavaSound API 57

MÓDULO 2

Unidad 2.2 Entorno de Desarrollo

x

nes y elimina la necesidad de la mayoría de conversion de tipos (type casting).

mente disponible como una extensión)

x

x x

Se incluyó el Java Naming and Directory Interface

(JNDI) en el paquete de bibliotecas principales (anterior-

ser etiquetados con datos adicionales, que puedan ser SDK 1.4: Aparece el 6 de febrero de 2002 con el nombre en

procesados posteriormente por utilidades de proceso de

clave Merlin. Este fue el primer lanzamiento de la plataforma Java

metadatos.

desarrollado bajo el JCP como JSR 59. Los cambios más notables

x

fueron:

Autoboxing/unboxing o conversiones automáticas entre

tipos primitivos (como los int) y clases de wrapper para

x

Palabra reservada o keyworkd assert

tipos primitivos (como los Integer).

x

Expresiones regulares modeladas al estilo de las expre-

x

Enumeraciones; la palabra reservada enum crea una

siones regulares Perl

typesafe, lista ordenada de valores (como Dia.LUNES,

x

Dia.MARTES, etc.). Anteriormente, esto solo podía ser lle-

Encadenación de excepciones Permite a una excepción

vado a cabo por constantes enteras o clases construidas

encapsular la excepción de bajo nivel original. x

manualmente. x

Non-blocking NIO (New Input/Output)

x

Logging API

x

API I/O para la lectura y escritura de imágenes en for-

Varargs o número de argumentos variable. El último

parámetro de un método puede ser declarado con el nombre del tipo seguido por tres puntos (por ejemplo: void drawtext(String... lines)). En la llamada al método, puede

matos como JPEG o PNG

usarse cualquier número de parámetros de ese tipo, que

x

serán almacenados en un array para pasarlos al método. Parser XML integrado y procesador XSLT (JAXP)

x

x

Seguridad integrada y extensiones criptográficas (JCE,

extendido con una sintaxis especial para iterar sobre cada

Bucle for mejorado. La sintaxis para el bucle for se ha

JSSE, JAAS)

miembro de un array o sobre cualquier clase que imple-

x

mente el interfaz Iterable, como la clase estándar CollecJava Web Start incluido (El primer lanzamiento ocurrió

en marzo de 2001 para J2SE 1.3) x

Metadatos, también llamados anotaciones, permite a

estructuras del lenguaje como las clases o los métodos,

Java Platform Debugger Architecture (JPDA)

JDK 5.0: Aparece el 30 de septiembre de 2004 con el nombre

clave Tiger. Los cambios más notables fueron: x

Plantillas (generics) que proporcionan conversion de ti-

pos (type safety) en tiempo de compilación para coleccio-

tion x

JDK 6.0: Aparece el 11 de diciembre de 2006 con el nombre

clave Mustang. Los cambios más importantes introducidos en esta versión son: x

Incluye un nuevo marco de trabajo y APIs que hacen

posible la combinación de Java con lenguajes dinámicos como PHP, Python, Ruby y JavaScript.

58

59

MÓDULO 2

Unidad 2.2 Entorno de Desarrollo

x

Incluye el motor Rhino, de Mozilla, una implementación

de Javascript en Java. x

Incluye un cliente completo de Servicios Web y soporta

las últimas especificaciones para Servicios Web, como JAX-WS 2.0, JAXB 2.0, STAX y JAXP.

x

/bin: las herramientas y utilidades del JDK (ejecutables).

x

/db: gestor de base de datos (nuevo de la versión 6.0).

x

/lib:las librerías del JDK, utilidadas por él mismo.

x

/include: los archivos C/C++ utilizados para construir la JVM.

x

Mejoras en la interfaz gráfica y en el rendimiento.

x

x

/demo: una variedad de ejemplos escritos en Java.

Incluye JavaDB (el conocido Derby de Apache).

x

/jre: la JVM sin herramientas de desarrollo

x

/src.zip: el código fuente de las APIs Java.

2.Contenido y componentes del JDK Antes de empezar a trabajar con un IDE (o Entorno Integrado de Desarrollo) que

2.2 Componentes

facilita el desarrollo y ejecución de los programas Java, vamos a trabajar con el JDK directamente, para poder afianzar ciertos conceptos imprescindibles.

A continuación se muestran los componentes que conforman el JDK.

Ver la Unidad Instalación del JDK y Eclipse para los detalles de la instalación.

x

javac.exe: Compilador de Java.

Hay dos variables de entorno de gran relevancia para el JDK, PATH y CLASSPATH:

x

java.exe: Intérprete de Java (JVM).

x

appletviewer.exe: Intérprete de applets Java.

x

jdb.exe: Depurador de Java.

x

javadoc.exe: Generador de documentación.

x

javah.exe: Integrador de C y C++ (JNI).

x

javap.exe: Desensamblador.

x

PATH: Variable de entorno del Sistema Operativo en la que se

listan los directorios donde se encuentran los ejecutables de los programas instalados en una máquina. En el caso del JDK, se encuentran en el directorio bin de la instalación. x

CLASSPATH: Variable de entorno del Sistema Operativo en la

que se le indican donde se van a encontrar las clases Java para la compilación y ejecución de los programas. Esta variable solo será necesaria en la ejecución de los programas Java. Desde el JDK 1.4.0 si no hay variable CLASSPATH definida, el JDK asume el . (punto), es

Existe

decir, el directorio desde donde ejecutemos las herramientas como

http://java.sun.com/javase/6/docs/api/index.html

documentación

online

acerca

del

JDK

en

la

siguiente

URL

punto de partida para buscar.

60

2.1 Contenido

3. IDEs o Entorno Integrado de Desarrollo

A continuación se muestran que directorios contiene el JDK y para que se utili-

En el capítulo anterior, hemos estado viendo el JDK no visual. Pero existen herra-

zan:

mientas gráficas que simplifican el desarrollo, compilación y ejecución de los pro61

MÓDULO 2

Unidad 2.2 Entorno de Desarrollo

gramas Java (al menos en entornos de desarrollo). Mencionamos a continuación las mas importantes y las URLs de referencia: x

Eclipse: Es Open Source. Es la herramienta gráfica que utiliza-

remos durante el curso. http://www.eclipse.org (ver la Unidad Instalación del JDK y Eclipse para su instalación) x

Rational

Application

Developer:

Es

de

IBM

http://www.ibm.com/software/awdtools/developer/application y está construido sobre Eclipse. x

NetBeans IDE: Es Open Source. http://www.netbeans.org

x

Sun Java Studio Creator: Es de Sun

y javac.exe

http://developers.sun.com/jscreator x

JBuilder: Es de Borland

http://www.codegear.com/products/jbuilder

x

IntelliJ IDEA: Es de jetBrains http://www.jetbrains.com/idea

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. PRÁCTICA A: Requiere instalar el JDK. Desde una sesión de DOS, ir a un directorio distinto del de la instalación del JDK y ejecutar los comandos java.exe -version PRÁCTICA B: Requiere instalar el JDK. Desarrollar un programa Java que muestre por pantalla el texto “¡Hola Mundo!” con el JDK de Sun.

62

63

MÓDULO 2

Unidad 2.2 Entorno de Desarrollo

En el caso de que no esté puesta la variable de entorno PATH, abrir una sesión 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 añadimos %PATH%.

Ahora arrancamos un editor de texto (por ejemplo Notepad) para escribir el código fuente de nuestro programa que guardaremos en el fichero Practica1.java; el nombre del fichero debe ser exactamente igual (incluyendo mayúsculas y minúsculas) al de la clase Java que vamos a desarrollar. Creamos un directorio de trabajo donde guardar el programa Java.

Y aceptamos la creación de un fichero nuevo. Ajustar la variable CLASSPATH para que las herramientas del JDK sepan encontrar nuestras clases Java. Tenemos dos opciones, o añadir el . (punto) y siempre ejecutar las herramientas en el directorio donde se encuentre el código, o añadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para respetar el valor que ya tuviese la variable CLASSPATH le añadimos %CLASSPATH%.

64

65

MÓDULO 2

Unidad 2.2 Entorno de Desarrollo

Si no sale ningún mensaje significa que todo ha ido bien y que ha creado el bytecode, es decir, Practica1.class

Escribimos el código y salvamos los cambios. Cerramos el Notepad.

Por último, ejecutamos el programa Java con la JVM “java”. A la JVM hay que darle el nombre del fichero del bytecode sin la extensión.

Compilamos el programa Java con el compilador “javac”. Al compilador hay que darle el nombre del fichero incluyendo su extensión. 66

67

MÓDULO 2

Unidad 2.2 Entorno de Desarrollo

PRÁCTICA 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 ubicación 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

MÓDULO 2

Unidad 2.2 Entorno de Desarrollo

Verificar que la perspectiva Java está abierta, y sino cambiar a ella

Crear un proyecto nuevo de nombre Practica2.

Darle el nombre y seleccionar Finish.

Crear una clase Java nueva llamada Practica2 con el método main.

70

71

MÓDULO 2

Unidad 2.2 Entorno de Desarrollo

Por defecto, en eclipse, al salvar los cambios realizados en un fichero, se realiza la compilación de las clases que están en el worskpace. En el caso de producirse algún error de compilación, se pueden ver en la vista Problems

Seleccionar Finish Escribir el código dentro del método main y salvar con Ctrl + S o File -> Save Seleccionando la clase Java, con el botón derecho del ratón ejecutarla como Java Application

72

73

MÓDULO 2

Título de unidad didáctica

En este unidad hemos visto la historia del JDK desde su comienzo hasta el momento actual, viendo las distintas posiblidades de desarrollo, vía el JDK directamente (entorno no gráfico) o vía los entornos gráficos o IDEs, tales como Eclipse, Rational Application Development ...

Se han visto también 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.

Y veremos como se abre una consola con el resultado.

74

MÓDULO B

Sintáxis 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.

Unidad 2.3 Sintaxis

En esta unidad trataremos en detalle la sintaxis del lenguaje de programación 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 compilación, por lo que la sintaxis del programa debe ser 100% correcta.

1. Comentarios Los comentarios son líneas de código que no son ejecutadas en tiempo de ejecución, ni siquiera son incluidas en el byte code compilado. Estos comentarios, permiten incluir explicaciones acerca de qué es lo que está haciendo nuestro código, documentación, inhabilitar líneas de código que ya no son necesarias en runtime, etc. Existen tres formas distintas de escribir los comentarios: x

// comentario de una sola línea. Abarca desde el comienzo del

comentario // hasta el final de línea. x

/*

*/ Comentario de una o más líneas. Abarca desde el co-

mienzo del comentario /* hasta el final del mismo */ x

/**

*/ Comentario de documentación, utilizado por la

herramienta javadoc.exe. Abarca desde el comienzo del comentario /** hasta el final del mismo */. x

Ejemplo: A continuación se muestra un ejemplo con los distintos ti-

pos de comentarios mencionados anteriormente.

79

MÓDULO 2

Unidad 2.3 Sintaxis

Otro concepto importante a tener en cuenta en Java es el de bloque de código. 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 también pueden utilizarse, por ejemplo, para minimizar el ámbito de ciertas variables, como son las variables de bloque (ver punto 4.2). x

Ejemplo: A continuación se muestra un ejemplo de bloques de códi-

go con una o varias sentencias y anidamientos de bloques

2. Puntos y coma, bloques y espacios en blanco Uno de los caracteres más importantes a tener en cuenta en Java es el punto y coma o ;.

El punto y coma define una sentencia Java o lo que es lo mismo una línea simple de código terminada en un punto y coma. La línea simple de código puede o no estar físicamente formada en una línea física. x

Ejemplo: A continuación se muestra un ejemplo con los distintos ti-

pos de líneas simples de código mencionados anteriormente.

Java permite los espacios en blanco entre elementos de código fuente. Son utilizados principalmente para separar cada uno de los elementos de la sintaxis Java (al menos un espacio en blanco como mínimo) y mejorar el entendimiento del código (el número de espacios utilizado para este propósito es irrelevante). x

Ejemplo: A continuación 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 código:

80

81

MÓDULO 2

Unidad 2.3 Sintaxis

3. Identificadores Son los nombres unívocos que se le dan a las clases, métodos y variables. Hay que

x

x

tener presente las siguientes reglas: x

El identificador debe empezar por una letra, subrayado (_) o

Ejemplo: Los siguientes identificadores son válidos: variable,

$va-

riable2, CONSTANTE, nombre_usuario, nombreUsuario, _variable_sistema Ejemplo: Los siguientes identificadores no son válidos: 1variable,

int, #variable, variable%Final

4. Variables

dólar ($). Una variable es un contenedor de datos identificado mediante un identificador o

x

Después del primer carácter se pueden usar números.

x

Java distingue entre mayúsculas y minúsculas (es “case sensi-

tive”). Los identificadores VARIABLE y variable son dos identificado-

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:

res distintos. x

Nunca pueden coincidir con una ‘keyword’ o palabra reservada

del lenguaje. A continuación se muestra un listado de las keyword mas utilizadas en Java y que por tanto tienen un significado especial para el lenguaje

x

Un tipo

x

Un identificador

x

Un dato o valor.

4. 1 Declaración de variables

82

83

MÓDULO 2

Unidad 2.3 Sintaxis

La declaración es la sentencia mediante la cual se define una variable, asignándola un tipo y un identificador. El formato es tipo identificador; x

Ejemplo: int contador; // tendrá el valor por defecto 0

Adicionalmente se le puede asignar un valor inicial mediante una asignación. El formato es tipo identificador = valor; x

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).

4. 2 Ámbito de las variables El ámbito de una variable es la zona de código donde se puede referenciar di-

En el caso de que se declaren variables con el mismo identificador en ámbitos

cha variable a través de su identificador.

distintos (en el mismo no se puede), tienen preferencia las del ámbito más interno. Las variables de bloque tienen preferencia frente a las locales; estas tie-

El lugar de declaración de una variable establece su ámbito. Los distintos ám-

nen preferencia frente a los parámetros y por último las de menor preferencia

bitos existentes son:

son los atributos.

x

Atributos (o variables miembro de una clase). Se pueden utili-

zar solamente asociados a la clase a la que pertenecen. x

x

Ejemplo: El siguiente ejemplo muestra el error de compilación al in-

tentar referenciar una variable fuera de su ámbito.

Parámetros de método. Se pueden utilizar solamente en el

método del cual son parámetros. x

Variables locales: (o de método) siempre hay que inicializar-

las. Solamente puede accederse a ellas, dentro del método donde han sido declaradas. x

Variables de bloque: siempre hay que inicializarlas. Solamente

puede accederse a ellas, dentro del bloque donde han sido declaradas.

84

85

MÓDULO 2

Unidad 2.3 Sintaxis

5. Tipos de datos. En Java existen dos tipos de datos genéricos: x

Tipos Primitivos. Existen ocho tipos de datos primitivos clasifi-

cados en cuatro grupos diferentes: x

x

x

x

x

Lógico: boolean. Carácter: char. Números enteros: byte, short, int y long. Números reales: double y float.

Tipos Complejos o clases. Existe un caso especial que es el de

enumeración: enum que aparece en Java JSE 5.0

5.1 Tipo de dato lógico La ‘keyword’ utilizada para definir un tipo de dato lógico es boolean. Sus posibles valores son: x

Ejemplo: El siguiente ejemplo muestra cual es la variable utilizada,

según el ámbito en el que está declarada.

x

x

true: o verdadero

x

false: o falso. Es el valor por defecto.

Ejemplos: boolean switch1 = true; boolean switch2; // Su valor es false.

Se suelen utilizar en las sentencias de control de flujo del tipo bifurcaciones del tipo if-then-else (ver punto 8).

5.2 Tipo de dato carácter La ‘keyword’ utilizada para definir un tipo de dato carácter es char y representa un carácter UNICODE, siendo su tamaño de: 16 bits (2 bytes). Desde la versión 5.0 Java soporta UNICODE 4.0 que define algunos caracteres que no caben en 16 bits por lo que se necesita un int para representarlos (o dos char dentro de un String). Sus posibles valores son: x 86

Un carácter entre comillas simples: ‘a’. 87

MÓDULO 2

Unidad 2.3 Sintaxis

x

Un carácter especial con \ por delante: ‘\n’, ‘\t’, etc.

x

Un código UNICODE: ‘\uxxxx’ (donde xxxx es un valor en

Un valor octal: 077 (comenzando por cero).

x

Un valor hexadecimal: 0xBAAC

cio en blanco.

x

El valor por defecto es 0.

Ejemplos: char letra1 = ‘a’;

x

Ejemplos: byte unByte = 12;

x

El valor por defecto es ‘\u0000’ -> null. Nota: No es un espa-

char letra2 = ‘\n’;

short unShort; // tiene el valor 0

char letra3 = ‘\u0041’;

short unShort; // tiene el valor 0

char letra4; // su valor es null

int unInt = -199;

Para las cadenas de caracteres existe un tipo complejo: la clase String que se

int otroInt = 065;

verá en más detalle en la Unidad 2.6 Clases básicas.

long unLong = 2; (o long unLong = 2L;)

Se suelen utilizar para el tratamiento de caracteres, ya sea como caracteres individuales dentro de un String, caracteres contenidos en un fichero, etc.

5.3 Tipo de datos enteros Las ‘keyword’ utilizadas para definir un tipo de dato entero son byte, short, int y long. Sus tamaños son: x

byte: 8 bits (1 byte), por tanto el rango de valores es de -128

x

short: 16 bits (2 bytes), por tanto el rango de valores es de -

32768 a 32767 x

int: 32 bits (4 bytes), por tanto el rango de valores es de -

2147483468 a 2147483467 x

long otroLong = 0xABCD;

Se suelen utilizar en operaciones ariméticas, en sentencias de control de tipo bucle (en concreto la sentencia for y el tipo int), etc.

5.4 Tipo de datos reales Las ‘keyword’ utilizadas para definir un tipo de dato real son float y double. Sus tamaños son: x

a 127.

long: 64 bits (8 bytes), por tanto el rango de valores es de -

enorme a enorme Sus posibles valores son:

88

Un valor decimal entero: 2 (por defecto para tipo int) o 2L

(para tipo long). x

hexadecimal).

x

x

float: 32 bits (4 bytes). Su precisión varía según la platafor-

ma. x

double: 64 bits (8 bytes). Su precisión también varía según la

plataforma. Sus posibles valores son: x

Un valor decimal entero: 2 (por defecto para tipo int).

x

Un valor decimal real: 0.17 o 6.02E23 (por defecto double).

x

Un valor decimal real: 0.17F o 0.17D (redundante).

89

MÓDULO 2

Unidad 2.3 Sintaxis

x

El valor por defecto es 0.0 (cero).

x

Ejemplos: float unFloat = 0.17F; double unDouble; // su valor es 0.0 double otroDouble = -12.01E30;

Se suelen utilizar en operaciones ariméticas, etc.

5.5 Tipo de dato complejo Las ‘keyword’ es el nombre de la clase del objeto que va a contener la variable. Sus posibles valores son: x

Referencias a objetos (o instancias) en memoria.

x

El valor por defecto es null

x

Ejemplos: String unString = new String(“Hola”);

El siguiente ejemplo muestra el valor de variables de distintos tipos con sus valores asignados en la declaración

String otroString; // su valor es null

Se suelen utilizar para contener objetos de nuestro mundo real.

5.6 Tipo de dato enumeración La ‘keyword’ utilizada para definir un tipo de dato enumeración es enum. Se trata de un tipo de dato complejo algo especial que surge con la versión 5.0 de Java. Implementa una clase que tiene un atributo que puede tomar varios valores y solo esos. x

Ejemplo: enum Semaforo { VERDE, AMBAR, ROJO }

Se suelen utilizar para tener una lista de posibles valores asociados a una variable y solamente dichos valores.

5.7 Ejemplos de variables con distintos tipos de datos El siguiente ejemplo muestra el valor de variables de distintos tipos con sus valores por defecto. 90

5.8 Conversiones entre tipos 91

MÓDULO 2

Unidad 2.3 Sintaxis

Un tipo de dato númerico puede llegar a convertirse a otro tipo. Existen cuatro entornos de conversión en Java: x

Promoción aritmética. Por ejemplo: de short a int y este a

float. x

Asignación. Por ejemplo: long l = 42; // un int se convierte en

long x

7. Operadores Llamada a métodos con parámetros. Por ejemplo: f(long p) ->

f(5) //se llama a un método con un int y se convierte a un long

Los operadores realizan funciones sobre uno, dos o tres operandos (op). Por tanto,

x

una primera clasificación puede ser esta: Casting. Por ejemplo: int i = (int)42L //un long se convierte en

int. Ver la explicación de downcasting.

x

Operadores unarios: pueden ser de tipo prefijos o postfijos.

op operador u operador op. Las conversiones implícitas se resuelven en tiempo de compilación. El upcasting (de un tipo más pequeño convertirlo a uno más grande) se realiza implícitamente. El downcasting (de un tipo más grande convertirlo a uno más pequeño) se realizan explícitamente (hay que indicar a que tipo se quiere convertir) y se resuelve en tiempo de ejecución. Nota: puede perderse información, por lo que se obliga a que sean realizados explícitamente.

6. Variables primitivas versus complejas Una variable de tipo primitivo contiene el dato directamen-

x

Ejemplo: contador++; // operador postfijo de sumar 1 a la propia

variable contador. La variable se queda con el valor sumado

x

Operadores binarios: operador op operador

x

Ejemplo: contador + 2; // operador de sumar un número a una va-

riable. La variable en si misma no se queda con la suma.

x

Operadores ternarios: op ? op : op

x

Ejemplo: contador > 2 ? true : false; // es similar a un if-then-else

de la siguiente manera if ? Then : else ;

Los operadores siempre devuelven un valor que depende del operador y del tipo de los operandos. Otra posible clasificación es por la naturaleza del operador:

te:

Una variable de tipo complejo contiene una referencia (puntero) a la zona de memoria donde está el objeto:

92

x

Aritméticos

x

Relacionales

x

Condicionales

x

De desplazamiento 93

MÓDULO 2

Unidad 2.3 Sintaxis

x

x

Lógicos

x

De asignación

-op: cambia el signo al operando.

x

x

Otros

x

++op: incrementa al operando en 1 (evaluando el operando

7.1 Operadores aritméticos A similitud con el mundo mátematico, existen los siguientes operadores aritméticos binarios: x

+: suma dos operandos op1 + op2. Hay que tener cuidado

con las variables de tipo String, porque en este caso concatena los

+op: convierten al operando en int en caso de que fuese byte,

short o char.

después de incrementarse). x

op++: incrementa el operando en 1 (evaluando el operando

antes de incrementarse). x

--op: decrementa el operando en 1 (evaluando el operando

después de decrementarse).

valores.

x

x

- : resta dos operandos op1 – op2

antes de decrementarse).

x

* : multiplica dos operandos op1 * op2

x

/ : divide dos operandos op1 / op2

x

% : calcula el resto de la división op1 % op2

x

op--: decrementa el operando en 1 (evaluando el operando

Ejemplo: En el ejemplo siguiente se muestran los operadores autoin-

crementales, diferenciando si se evalúa el valor de la variable antes o después del incremento.

Los valores que devuelven estos operadores depende de los tipos de los operandos: x

int: cuando ninguno de los operandos es float, double o long.

En el caso del operador % siempre devuelve un int. x

long: cuando ninguno de los operandos es float o double y hay

al menos uno que es long. x

float: cuando ninguno de los operandos es double y hay al

menos uno que es float. x

double: cuando al menos hay uno de los operandos es double.

También existen operadores aritméticos unarios (actúan solo sobre un operando):

7.2 Operadores relacionales Java tiene los siguientes operadores relacionales:

94

95

MÓDULO 2

Unidad 2.3 Sintaxis

x

>: compara si un operando es mayor que otro op1 > op2

x

>: desplaza los bits del primer operando hacia la derecha

tantas veces como indique el segundo operando op1 >> op2. Realiza la misma función que multiplicar por 2, tantas veces se desplace. x

>: desplaza los bits del primer operando hacia la derecha

>= op2

>>> op2. Realiza la misma función que multiplicar por 2, tantas ve-

x

ces se desplace, pero sin tener en cuenta la posición de signo. >=: Similar al anterior,

para cada uno de los operadores indicados.

7.7 Otros operadores Existen otros operadores en Java como son: x

x

x

De ruptura: break, continue, label: y return.

8.1 Sentencias while y do-while La sentencia while se utiliza para ejecutar continuamente un bloque de código mientras que la condición del while sea cumpla (es decir la evaluación de la

?: : se trata de una abreviatura de la estructura if-then-else (if

condición sea true o verdadera).

op1? then op2 : else op3) op1?op2:op3 x

[] : utilizado para declarar, crear y acceder a arrays (se verán

en la Unidad 3.1). x

. : utilizado para acceder a los atributos y métodos de los ob-

jetos (se verán en la Unidad 2.4). x

(parámetros) : utilizado para pasar parámetros a un método.

x

(tipo) : utilizado para realizar castings (conversiones de tipo).

x

new : utilizado para crear objetos nuevos (se verá en la Uni-

dad 2.4). x

instanceof : utilizado para chequear si el primer operando es

una instancia del tipo indicado en el segundo operando.

while(expresión) { sentencias; } La sentencia do-while es parecida a la sentencia while pero asegura que como mínimo el bloque de código se ejecuta una vez.

do { sentencias; } while(expresión);

8.2 Sentencia for La sentencia for facilita la ejecución de un bloque de código un número determinado de veces, mientras la evaluación de la expresión de terminación se cumpla o sea true.

8. Sentencias de control de flujo

for(inicialización; terminación; incremento) { sentencias; }

Sin las sentencias de control de flujo, el código Java se ejecutaría linealmente desde la primera línea hasta la última. Existen cuatro tipos de sentencias de control de flujo: x

100

Bucles: while, do-while, for y for/in

Las variables definidas en la sentencia de inicialización son locales al bloque. Por tanto dejan de existir una vez se haya terminado el bucle. x

Ejemplo: se muestra un ejemplo de las sentencias de control de tipo

bucles vistas hasta el momento

101

MÓDULO 2

Unidad 2.3 Sintaxis

public void listar(int[] param) { int i = 0; for(int j=0; j=5 && param < 10){ //ejecutamos algo } else { //ejecutamos algo } }

8.6 Sentencia de ruptura Java proporciona las siguientes sentencias de ruptura de ejecución: x

break: sirve para detener la ejecución tanto de los bucles co-

mo de la sentencia switch. Por tanto, salta a la siguiente línea de código después del bucle o switch.

8.5 Sentencia switch

x

continue: sirve para detener la ejecución del bloque de código

de un bucle y volver a evaluar la condición de este. La sentencia switch es un caso particular de la sentencia if-then-else if-else. Evalúa una expresión del tipo int o que pueda ser convertida a int de forma im-

x

plícita (como puede ser un char).

ver un valor en el caso de ser necesario).

return: sirve para finalizar la ejecución de un método (y devol-

Así se evalúa la expresión intExpresión y va comparando cada uno de los case a ver si cumple la condición. En el caso de que la comparación sea true, se ejecu-

Nota: Las guías de programación estructurada prohiben el uso de estas senten-

tan las sentencias siguientes hasta que se encuentre la siguiente sentencia

cias o aconsejan un uso muy límitado para facilitar la legibilidad y mantenimien-

break o llegue al final de la sentencia switch.

to del código

En el caso de que todas las comparaciones sean false se ejecutará las sentencias del default (en el caso de existir, puesto que es optativo).

switch(intExpresión) { case intExpresión: sentencias; break; …… …… default: // es optativo sentencias; } x

Ejemplo: se muestra un ejemplo de la sentencia de control switch public void listar(int param) { switch(param){ case 1: // ejecutar algo break; case 2: // ejecutar algo break; default: // ejecutar algo break; }

104

105

MÓDULO 2

Unidad 2.3 Sintaxis

while(x3) { System.out.println("Hola"); } } } } PRÁCTICA A: Identificar que sentencias son correctas y cuáles no (se irán utilizando las variables según 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;

Solución: 1. int x = 34.5; -> int x = (int)34.5; // Posible con downcasting 2. boolean boo = x; -> No hay solución 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;

PRÁCTICA B: Identificar si este código compila bien. Si no compila solucionarlo. Si compila decir cuál sería la salida. public class Temp { public static void main(String[] args) { int x = 1; 106

Solución: El código compila bien. Pero entra en un bucle infinito. Habría que modificarlo con la línea roja y saldría la palabra “Hola” siete veces por pantalla. public class Temp { public static void main(String[] args) { int x = 1; while(x3) { System.out.println("Hola"); } } } }

PRÁCTICA C: Identificar si este código compila bien. Si no compila solucionarlo. Si compila decir cuál sería la salida. public class Temp { public static void main(String[] args) { int x = 5; while(x>1) { x = x - 1; if(x Save

Crear una clase Java nueva llamada Punto sin el método main

180

181

MÓDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Continuación de la implementación de la clase Triangulo

Hacer lo mismo para las clases Circulo y Triangulo.

Crear una clase Java nueva llamada PracticaE con el método main.

182

183

MÓDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Seleccionando la clase Java PracticaE, con el botón derecho del ratón ejecutarla como Java Application

Y veremos como se abre una consola con el resultado.

184

185

MÓDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

En esta unidad hemos visto los cuatro paradigmas básicos en los que se apoya los lenguajes orientados a objetos y por tanto el lenguaje de programación Java. x

Clases, donde su implementación consta normalmente de una serie de atributos y métodos. -

Existen ciertos métodos especiales llamados Cons-

-

Se pueden sobrecargar los métodos, teniendo el

tructores, que permiten crear objetos.

mismo nombre de método y distintos parámetros. x

Objetos, que son instancias de una clase determinada. Para poder acceder a sus atributos y métodos se utiliza el operador punto. -

El método main se utiliza directamente sin la creación de un objeto, para empezar la ejecución de un programa Java.

x

La eliminación de los objetos en memoria se utiliza via el Garbage Collector.

La relación de herencia, se basa en la existencia de relaciones de generalización/especialización entre clases.

-

Todas las clases por defecto heredan de la clase

-

Se puede generalizar o especializar entre las su-

-

Se pueden reimplementar métodos heredados me-

Object

perclases y subclases mediante los casting.

diante la sobrescritura de métodos. x

La relación 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. -

Utilización de clases abstractas, o genéricas que

-

Si se utilizan métodos abstractos, la clase debe

no pueden ser instanciadas.

ser identificada como abstracta, y alguna de las subclases tiene que implementar dichos métodos. x

Los Interfaces, que proporcionan el API que cualquier clase que implemente dicho interface debe de desarrollar.

186

PA-

MÓDULO B

Otros conceptos Tema 2.5

Índice de la unidad:

1. Paquetes 2. Modificadores de acceso 3. Métodos estáticos 4. final 5. Paso por valor o por referencia 6. Cosas que ocurren por defecto 7. Instanceof

Unidad 2.5 Otros conceptos

En las unidades anteriores se ha visto la sintaxis de Java, y paradigmas básicos de la programación 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 característica más del lenguaje que nos permite organizar el código 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 propósito 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 declaración de un paquete es la siguiente: package nombre_del_paquete; x

Ejemplo: es.java.aula.mentor.figuras;

El nombre de una clase no se limita solamente al identificador utilizado en la definición, sino a la suma del paquete al que pertenece más el del identificador: Nombre de paquete + Identificador de la Clase x

Ejemplo: La clase Circulo del paquete es.java.aula.mentor.figuras es la clase

es.java.aula.mentor.figuras.Circulo. La clase Circulo del paquete es.figuras es la clase es.figuras.Circulo

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 raíz sin nombre o nada, pero no está recomendado su uso). En el caso de especificarlo, la sentencia package tiene que ser la primera línea del fichero con el código fuente de la clase.

191

MÓDULO 2

Unidad 2.5 Otros conceptos

Existe una convención aceptada por todos los desarrolladores en cuanto a la no-

por

menclatura de los paquetes Java:

es.java.aula.mentor.figuras.Circulo

x

x

Todas las palabras que componen el nombre del paquete van

debajo

de

este,

es

el

caso

de

la

clase

Por tanto para utilizar una clase tenemos tres alternativas:

en minúsculas.

x

x

mediante el punto)

Se suele utilizar el nombre de dominio de la empresa,

Utilizar su

organización o institución invertido para intentar asegurar nombres

x

unívocos y evitar colisiones.

punto) x

Ejemplos: com.ibm.test

nombre completo: paquete + clase (unidos

Importar la clase: import paquete + clase (unidos mediante el

Importar el paquete completo: import paquete + * (unidos

mediante el punto)

es.miempresa.utilidades es.practicas.tema1

como

Un import no implica la inclusión de código como ocurre en un #include de C++. Simplemente son vías de acceso para buscar el código. El código se va cargando

Para poder utilizar una clase en nuestro código tenemos que escribir su nombre

según se necesita.

completo cada vez que la utilicemos: paquete + clase. Para mejorar la legibilidad del código, existe otro mecanismo para facilitar la codificación y facilitar la vida al

Al igual que las clases Java tienen un reflejo en el Sistema de Archivos (una clase

desarrollador que es el uso de la keyword: import. La sintaxis de la declaración de

Java equivale a un fichero texto de extensión *.java), lo mismo ocurre con los pa-

la sentencia es la siguiente:

quetes Java.

import nombre_del_paquete.nombre_de_la_clase; import nombre_del_paquete.*; x

Ejemplos: es.java.aula.mentor.figuras.Circulo;

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. x

Ejemplo: package es.java.aula.mentor.figuras; public class Circulo {...}

es.java.aula.mentor.figuras.*;

Las sentencias import se ubican entre la sentencia package y la definición de la clase. Las clases importadas de esta manera pueden ser referenciadas en el código directamente por su nombre de clase sin necesidad de escribir el paquete al que pertenecen. Un import genérico (es decir, con el *) importa solo las clases de ese paquete, pero no de los subpaquetes. x

Ejemplo: Si se utiliza el import es.java.aula.* importará las clases del pa-

Para compilar una clase que pertenece a un paquete tenemos distintas opciones: x

Desde

c:\trabajo

ejecutamos:

javac

es\java\aula\mentor\figuras\Circulo.java

quete es.java.aula pero no las clases de paquetes que estén en nomenclatura

192

193

MÓDULO 2

Unidad 2.5 Otros conceptos

x

Desde

c:\trabajo\es\java\aula\mentor\figuras

ejecutamos:

javac Circulo.java Para ejecutar una clase solo tenemos una opción posible: x

Desde

cualquier

punto

del

sistema

es.java.aula.mentor.figuras.Circulo.java.

Nota:

ejecutamos: el

java

directorio

c:\trabajo debe estar en el CLASSPATH (o si estamos en el directorio c:\trabajo, con que estuviera el . en el CLASSPATH también sería suficiente) A continuación mostramos distintos ejemplos de utilización de clases teniendo en cuenta los paquetes a los que pertenecen: x

Ejemplo: Ambas clases están en el paquete por defecto y por tanto se en-

cuentran.

x

Ejemplo: Las clases están en paquetes distintos y se utilizan las clases con el

nombre completo

x

Ejemplo: Las clases están en paquetes distintos y no se utilizan las clases

con el nombre completo ni con la sentencia import

194

195

MÓDULO 2

Unidad 2.5 Otros conceptos

x

Ejemplo: Las clases están en paquetes distintos y se utilizan las clases con la

sentencia import

x

x

Ejemplo: Las clases están en el mismo paquete

Ejemplo: Las clases están en paquetes distintos y se utilizan las clases con la

sentencia import genérica

1. 1 Características de los Paquetes Java 196

197

MÓDULO 2

Unidad 2.5 Otros conceptos

Las clases básicas System, String, Math, etc… pertenecen al paquete java.lang.*. (las veremos con más detalle en la Unidad 2.6).

x

Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que están en

paquetes distintos. Utilizamos la sentencia import genérico y en la clase conflictiva utilizamos el nombre completo.

¿Cómo compilaban todas nuestras prácticas si no conocíamos los paquetes Java (y por tanto la keyword import)? La respuestas es porque el compilador, por defecto, siempre añade la siguiente línea a nuestro código: import java.lang.*; Aunque no es frecuente, es posible que provoquemos ambigüedades en el uso de los imports, y por tanto errores de compilación. ¿Qué ocurre al usar una clase cuyo nombre existe a la vez en dos paquetes que hemos importado? ¿Cuál 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. x

Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que están en

paquetes distintos. Utilizamos solamente la sentencia import genérico

x

Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que están en

paquetes distintos. Utilizamos la sentencia import genérico e import específico.

198

199

MÓDULO 2

Unidad 2.5 Otros conceptos

Hemos visto que existe el llamado ‘paquete por defecto’ al que pertenecen todas aquellas clases que no indican de forma explícita un paquete determinado en su código. Desde la versión 1.4.x, el compilador no permite importar desde una clase que pertenece a un paquete explícito, una clase que pertenece al ‘paquete por defecto’. Esto no tendría que ser un problema en la mayoría de los casos porque siempre deberíamos ubicar las clase en paquetes Java de forma explícita. Cuando consultamos el API, por ejemplo, via online en la documentación de SUN http://java.sun.com/javase/6/docs/api/index.html, podemos apreciar la categorización de los paquetes y las clases que pertenecen a cada uno de ellos.

x

Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que están en

paquetes distintos. Utilizamos la sentencia import específico.

2. Modificadores de acceso Hasta ahora hemos visto que podemos utilizar cualquier clase, método y atributo desde cualquier punto de nuestro código sin ningún tipo de problema. Pero el lenguaje de programación Java, nos permite poder delimitar quién o desde donde se puede acceder a una clase, a un método o a un atributo. Existen cuatro tipos de modificadores de acceso y por tanto, cuatro keywords. Las hemos ordenados de menor a mayor restricción.

200

201

MÓDULO 2

Unidad 2.5 Otros conceptos

x

public -> Público

x

protected -> Protegido.

x x

-> Paquete, identificado por la ausencia de keyword. private

-> Privado.

La siguiente tabla muestra a qué se puede acceder desde una clase dada:

x

Ejemplo: Ejemplo de modificadores de acceso con métodos.

x

Ejemplo: Ejemplo del modificador de acceso paquete utilizado con

Los modificadores de acceso se utilizan en las definiciones de: x

Clases e interfaces: solo se puede utilizar public y package (o

paquete en castellano)

202

x

Atributos: se permiten cualquiera de los cuatro.

x

Métodos: se permiten cualquiera de los cuatro.

x

Ejemplo: Ejemplo de modificadores de acceso con atributos.

203

MÓDULO 2

Unidad 2.5 Otros conceptos

clases

La respuesta es no. Y para ello contamos en Java con los métodos estáticos. Están asociados a una clase solamente desde un punto de vista organizativo. Para definir un método estático utilizamos la keyword: static. La sintaxis de la declaración es la siguiente: modifi_acceso static tipo_retorno nombre([tipo parametro,..]) { } x

Ejemplo: public static void miMetodo() { }

Para ejecutar por tanto un método estático no hace falta instanciar un objeto de la clase. Se puede ejecutar el método directamente sobre la clase. x

Ejemplo: int a = Math.min(10,17); Mientras que los métodos 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’);

3. Métodos estáticos Existen casos en los que nos encontramos con clases cuyos métodos no dependen en absoluto de los atributo de la clase, y en todo caso de los parámetros de los

Una

clase

puede

perfectamente

mezclar

métodos

estáticos

con

métodos

convencionales. Un ejemplo clásico es el método main:

métodos. Por ejemplo, la clase java.lang.Math: x

public static void main(String[] args) { … } Su método round recibe un número decimal y lo devuelve

redondeado. x x

Su método sqrt recibe un número y devuelve su raiz cuadrada. Su método min recibe dos números y devuelve el menor.

Son métodos que parece no pertenecer a una entidad concreta. Son genéricos, globales, independientes de cualquier estado del objeto. ¿Tiene sentido instanciar un objeto para ejecutar algo que no depende de nada de dicho objeto?

204

Hay ciertas reglas que hay que tener en cuenta en el uso de métodos estáticos: x

Un método estático jamás puede acceder a un atributo de

instancia (no estático). x

Un método estático jamás puede acceder a un método de

instancia (no estático). x

Pero desde un método convencional si que se puede acceder a

atributos y métodos estáticos.

205

MÓDULO 2

Unidad 2.5 Otros conceptos

x

Ejemplo: Utilización de atributos desde un método estático

3.1 Atributos estáticos Los atributos estáticos (o variables estáticas) son atributos cuyo valor es compartido por todos los objetos de una clase. Para definir un atributo estático utilizamos la keyword: static. La sintaxis de la declaración es la siguiente: modifi_acceso static tipo nombre [= valor_inicial]; x

Ejemplo: public static int contador = 0;

Hay que tratarlos con cuidado puesto que son fuente de problemas difíciles de detectar. Como todos los objetos de una misma clase comparte el mismo atributo estático, 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 x

propios de cada objeto. Ejemplo: Utilización de métodos estáticos desde un método estático

Los atributos estáticos son cargados en memoria cuando se carga la clase. Siempre antes de que: x

Se pueda instanciar un objeto de dicha clase.

x

Se pueda ejecutar un método estático de dicha clase.

Para usar un atributo estático no hace falta instanciar un objeto de la clase. x

Ejemplo: System.out.println(“Hola”); // out es un atributo estático

de la clase java.lang.System. x

206

Ejemplo:

207

MÓDULO 2

Unidad 2.5 Otros conceptos

4. final 3.2 Bloques de código estáticos final es una keyword que modifica el funcionamiento de: Los bloques de código estático son trozos de código que se ejecutan al cargar una clase en memoria (no al instanciar objetos de esa clase).

x

Clases

Para definir un bloque de código estático utilizamos la keyword: static. La

x

Atributos

x

Métodos

sintaxis de la declaración es la siguiente: static { …. }

x

Ejemplo: static { System.out.println(“Hola”); }

x

Ejemplo:

4.1 Clases finales

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 declaración es la siguiente: 208

209

MÓDULO 2

Unidad 2.5 Otros conceptos

modificador_acceso final class nombre_clase { } x

Ejemplo: public final class MiClase { }

x

Ejemplo: Herencia de una clase final

4.2 Atributos finales Definiendo un atributo como final conseguimos constantes. Es decir, una vez inicializados no se puede cambiar su valor.

4.2 Métodos finales Definiendo un método como final conseguimos que ninguna otra clase pueda sobrescribirlo.

Para definir un atributo como final utilizamos la keyword: final. La sintaxis de la declaración es la siguiente: modificador_acceso final tipo nombre [= valor_inicial];

Para definir un método como final utilizamos la keyword: final. La sintaxis de

x

Ejemplo:

la declaración es la siguiente: protected final boolean sw = true; public final int i;

modif_acceso final tipo_retorno nombre([tipo param,..]) { } x

x

Ejemplo:

Ejemplo: public final int suma(int param1, int param2) { return param1 + param2; }

x

210

Ejemplo:

211

MÓDULO 2

Unidad 2.5 Otros conceptos

En ocasiones cuando se crea una clase solo con constantes, se suele hacer mediante un interface, debido a que no es necesario tener ningún método definido ni implementado.

4.4 Static imports Java SE 5.0 añadío una novedad al respecto, permitiendo la importación de atributos y métodos estáticos, de manera que no haya que nombrar a la clase para su acceso. La sintaxis de la declaración es la siguiente: import static nombredelpaquete.nombredelaclase.miembro; import static nombredelpaquete.nombredelaclase.*;

4.3 Definición de constantes

x

Ejemplo: import static java.lang.System.out;

x

Ejemplo:

Las constantes en Java se suelen definir mediante la combinación de las keyword: static y final. La sintaxis de la declaración es la siguiente: modificador_acceso static final tipo nombre = valor; x

Ejemplo: public static final double PI = 3.141592653589;

Por convención, a la hora de programar, las constantes se suelen llamar con todas las letras en mayúsculas. x

Ejemplo: Constantes ya existentes en las clases básicas: java.lang.Math.PI: el número PI. java.lang.Math.E: el número E. javax.swing.SwingConstants.CENTER: centrado. java.awt.event.KeyEvent.VK_ENTER: tecla de intro.

212

213

MÓDULO 2

Unidad 2.5 Otros conceptos

4. Paso por valor o por referencia En programación existen dos formas de pasar parámetros: x

Por valor (o copia): se realiza una copia del parámetro.

x

Por referencia: se pasa una referencia al parámetro.

En C se decidía mediante la gestión de punteros con los operadores: * y & En Java sin embargo no hay decisión posible: todo se pasa por valor. Si se modifica el valor de la variable recibida, no se modifica la variable original.. x

Ejemplo:

x

Ejemplo: Realmente no se cambian las referencias sino los atributos internos

de esas referencias.

x

214

Ejemplo:

215

MÓDULO 2

Unidad 2.5 Otros conceptos

x

Las clases que no definan ningún constructor contienen implí-

citamente uno sin parámetros: public MiClase() { super(); } x

Los constructores que no llamen a otro constructor de la mis-

ma clase o del padre, contienen una llamada implícita al del padre sin parámetros: public MiClase(int param) { super(); this.valor = param; } x

Siempre que se haga referencia un atributo o método de la

propia clase, implícitamente se añade this: this.miMetodo(); x

Todos los métodos de un interfaz son definidos como abstract

de forma implícita: public abstract int miMetodo();

5. Cosas que ocurren por defecto

x

Todos los atributos son inicializados a su valor por defecto si

no se inicializan de forma explícita. Cuidado, que no ocurre lo mismo El compilador realiza cosas por defecto de forma automática (sin que estén desarrolladas de forma explícita en nuestro código). Las enumeramos a continuación: x

Las clases que no importan explícitamente el paquete ja-

va.lang.* lo hacen de forma implícita: import java.lang.*; x

con las variables locales. x

Si no se especifica ningún package, la clase pertenece al pac-

kage por defecto. x

Si no se especifica ningún modificador de acceso al definir una

clase, atributo o método, se le aplica el modificador package.

Las clases que no heredan explícitamente de otra clase, here-

dan implícitamente de java.lang.Object: public class MiClase extends Object

216

217

MÓDULO 2

Unidad 2.5 Otros conceptos

6. Instanceof Se trata de un operador especial del lenguaje Java representado por la keyword: instanceof. La sintaxis de la declaración es la siguiente: objeto instanceof clase x

PRÁCTICA A: ¿Cuál de estos programas compila sin errores? 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 lógicas (condiciones). Básicamente lo que hace es comprobar si un casting concreto se puede realizar o no. x

Ejemplo:

Solución:

PRÁCTICA B: ¿Cuál de estos programas compila sin errores?

218

219

MÓDULO 2

Unidad 2.5 Otros conceptos

Solución: PRÁCTICA 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 métodos para todos ellos. Deberán 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 método 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 diseño lo mas genérico, reutilizable y fácil de mantener que se pueda. PRÁCTICA C: ¿Cuál de estos programas compila sin errores?

Solución con la JDK De Sun En el caso de que no esté puesta la variable de entorno PATH, abrir una sesión 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 añadimos %PATH%.

Solución:

220

221

MÓDULO 2

Creamos un directorio de trabajo donde guardar el programa Java.

Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan encontrar nuestras clases Java. Tenemos dos opciones, o añadir el . (punto) y siempre ejecutar las herramientas en el directorio donde se encuentre el código, o añadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para respetar el valor que ya tuviese la variable CLASSPATH le añadimos %CLASSPATH%

Unidad 2.5 Otros conceptos

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 código fuente de cada una de nuestras clases java; el nombre del fichero debe ser exactamente igual (incluyendo mayúsculas y minúsculas) al de la clase Java que vamos a desarrollar. Empezamos con Criatura.java

222

223

MÓDULO 2

Unidad 2.5 Otros conceptos

Y aceptamos la creación de un fichero nuevo.

Para la clase Enano.java

Escribimos el código y salvamos los cambios. Cerramos el Notepad. Hacemos el mismo proceso para la clase Troll.java

Y para la clase Elfo.java 224

225

MÓDULO 2

Desde el directorio es\java\aula\mentor\practicad\util, escribimos el interface Constantes.java

Unidad 2.5 Otros conceptos

Compilamos el programa Java con el compilador “javac”. Al compilador hay que darle el nombre del fichero incluyendo su extensión. Podemos hacerlo desde cada uno de los directorios donde están 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 continuación mostramos un posible orden de compilación:

Desde el directorio es\java\aula\mentor\practicad, escribimos la clase PracticaD.java que va a contener el método main.

226

Vemos como han quedado las clases compiladas en cada uno de los directorios

227

MÓDULO 2

Unidad 2.5 Otros conceptos

Aparecerá la pantalla para empezar a trabajar.

Ejecutamos la clase PracticaD y vemos lo que sale por la consola

Verificar que la perspectiva Java está abierta, y sino cambiar a ella

Ahora realizaremos la misma práctica con Eclipse Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe Seleccionar la ubicación del “workspace” (o área de trabajo).

228

229

MÓDULO 2

Unidad 2.5 Otros conceptos

Crear un proyecto nuevo de nombre PracticaD

Darle el nombre y seleccionar Finish.

Crear un interface Java nuevo llamado Criatura, especificando el paquete es.java.aula.mentor.practicad.criaturas.

230

231

MÓDULO 2

Unidad 2.5 Otros conceptos

Crear las siguientes clases Troll , Enano, Elfo (sin método main) dentro del mismo paquete. Para no tener que volver a escribir el nombre del paquete, podemos seleccionarlo vía el botón derecho del ratón y luego seleccionar el crear una nueva clase.

Seleccionar Finish Escribir el código dentro del bloque del interface y salvar con Ctrl + S o File -> Save

232

233

MÓDULO 2

Unidad 2.5 Otros conceptos

En Eclipse, cuando se salvan los cambios, se compila el código, por lo que no hace falta realizar este paso. Crear el interface Constantes en el paquete es.java.aula.mentor.practicad.util.

234

235

MÓDULO 2

Unidad 2.5 Otros conceptos

Seleccionando la clase Java PracticaD, con el botón derecho del ratón ejecutarla como Java Application

Por último, creamos la clase que va a contener el main PracticaD, en el paquete java es.java.aula.mentor.practicad Vemos la salida por la consola

236

237

MÓDULO 2

Unidad 2.5 Otros conceptos

En esta unidad hemos visto distintos conceptos que nos permiten organizar nuestro código y modificar el acceso a nuestras clases, métodos y atributos. x

Paquetes: son una característica del lenguaje que nos permite organizar el código en grupos. Físicamente, cada uno de los subgrupos del paquete se convierten en un directorio del sistema operativo.

x

Modificadores de acceso: son una característica del lenguaje que nos posibilita delimitar quién o desde donde se puede acceder a una clase, a un método 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 métodos x

Métodos estáticos: son métodos que son dependientes de la clase a la que pertenecen y no a una instancia de una clase.

x

Atributos estáticos: son atributos de clase y son compartidos por todas las instancias de la clase a la que pertenecen.

x

Bloques estáticos: son bloques de código que se ejecutan una sola vez cuando la clase es cargada en memoria.

x

238

Clases finales: son clases de la que nadie más puede heredar.

MÓDULO 2 PROGRAMACIÓN JAVA

x

x

Métodos finales: son métodos 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.

MÓDULO C

UNIDADES DIDÁCTICAS:

1. Clases básicas. String, StringBuffer, System, Math, Integer, …. 2. Estructuras de datos. Arrays y colecciones

MÓDULO C

Clases básicas 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

Unidad 3.1 Clases básicas

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: x

Mediante su constructor por defecto. x Ejemplo: String s = new String(); // Se inicializa a “” (y no a “ “).

x

Mediante su constructor con una cadena de caracteres. x Ejemplo: String s = new String(“Hola”);

x

Mediante la asignación de una cadena de caracteres. xEjemplo: String s = “Hola”; // Es la única excepción al uso del new.

x

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 posición de la cadena de caracteres es la cero (y no la uno). Implementa una serie de métodos muy útiles para el manejo de las cadenas de caracteres. Por ejemplo: x

public char charAt(int index); Devuelve el carácter que se

encuentra en la posición index. x

public String concat(String str); Devuelve la cadena con

str añadido al final del objeto String que realiza la llamada (es igual que con el operador +). x

public int indexOf(int ch); Devuelve la primera ocurrencia

de ch (devuelve -1 si no está). 245

MÓDULO 3

Unidad 3.1 Clases básicas

x

public int compareTo(String str); Compara la cadena con

str. Devuelve 0 si son iguales, < 1 si es menor o > 1 si es mayor (la comparación se realiza siguiendo el abecedario). x

public String replace(char oldChar, char newChar);

Cambia todas las ocurrencias de oldChar por newChar y devuelve el String cambiado. x

public int lastIndexOf(String str); Devuelve la última ocu-

rrencia de str (devuelve -1 si no se encuentra). x

public int length(); Devuelve la longitud de la cadena de ca-

racteres. x

public String substring(int beginIndex); Devuelve la ca-

dena desde la posición beginIndex hasta el final. x

public String substring(int beginIndex, int endIndex);

Devuelve la cadena desde la posición beginIndex hasta endIndex – La clase String, sobreescribe el método equals() de la clase java.lang.Object (re-

1. x

cordemos que método el equals de Object comparaba las posiciones de memoria, y public String toLowerCase(); Devuelve la cadena en minús-

culas. x

no el contenido de los objetos). De esta forma, podemos saber si dos objetos String distintos, representan la misma cadena de caracteres o no.

public String toUpperCase(); Devuelve la cadena en ma-

x

Ejemplo:

yúsculas. x

public String trim(); Devuelve la cadena sin espacios en

blanco ni por delante ni por detrás. x

public static String valueOf(double d); Devuelve la cadena

de caracteres que representa d. Este método está sobrecargado varias veces recibiendo como parámetro otros tipos primitivos (char, int, float, long…). x

Otros métodos:

http://java.sun.com/javase/6/docs/api/java/lang/String.html#metho d_detail x

246

Hay un concepto muy importante relacionado con el uso de Strings: son inmutables. Es decir, jamás se modifica el valor de un String si no que se crean nuevos objetos. En la ejecución del siguiente código String s = "0"; for(int i=1; i