Anda di halaman 1dari 172

Programacin en Java inicial

Nipo: 820-10-530-5
Autor:
Pilar Aranzazu Ocaa Diaz-Ufano y Jos
Miguel Ordax Cass
Edicin y maquetacin de contenidos:
Susana Prez Marn

Diseo grfico e ilustracin de portada:


Mara Guija Medina

AULA
MENTOR

educacion.es

MDULO A

Nipo: 820-10-530-5
UNIDADES DIDCTICAS:

1. Introduccin
2. Conceptos bsicos. Objeto, atributo, mtodo,

Autor:
Pilar Aranzazu Ocaa Diaz-Ufano y Jos
Miguel Ordax Cass
Edicin y maquetacin de contenidos:
Susana Prez Marn

interfaz, clase
3. Paradigmas de la Orientacin a Objetos:
Abstraccin, encapsulacin, ocultamiento,
herencia y polimorfismo.

Diseo grfico e ilustracin de portada:


Mara Guija Medina

MDULO A

Introduccin

Tema 1.1

ndice de la unidad:

1. Historia
2. Ventajas de la Orientacin a Objetos

Unidad 1.1 Introduccin

En esta unidad veremos el origen de la programacin Orientada a Objetos,

cuales son sus principales caractersticas.

1. Historia
Una de las caractersticas para poder clasificar los lenguajes de programacin es su
nivel de abstraccin. Este nivel puede ser expresado en base a la complejidad del
problema que se est intentando resolver. Por ejemplo, el lenguaje Ensamblador,
primer lenguaje de programacin, tiene un pequeo nivel de abstraccin
relacionado totalmente con la mquina en la que se est ejecutando, por lo que el
nivel de abstraccin que se aplicaba al mbito de la solucin era muy bajo.
Muchos de los lenguajes que siguieron al Ensamblador, llamados lenguajes
imperativos, como es el caso de Fortran, Basic y C, fueron abstracciones de este
primer lenguaje de programacin. El nivel de abstraccin de estos lenguajes es
mucho ms elevado que el del lenguaje original, pero siguen estando muy
relacionados con la estructura del ordenador en el que se ejecutan, en lugar de la
estructura del problema a resolver y del mundo real. Debido a esta relacin, los
programas desarrollados son difciles de escribir y bastante costosos de mantener.
As, acercando el modelo de abstraccin al problema a resolver y no a la mquina
fsica, aparecieron en los aos 60 los primeros lenguajes Orientados a Objetos,
tambin denominados O.O., tales como LISP (todos los problemas se reducen a
listas), APL (todos los problemas se reducen a algoritmos) y PROLOG (todos los
problemas se reducen a cadenas de decision).
El primer lenguaje considerado totalmente Orientado a Objetos y sobre el que se
basa Java, es Smalltalk. Este lenguaje recoge las cinco principales caractersticas
que tienen que tener estos lenguajes de programacin y que se vern ms en
profundidad en la Unidad 1.2:
x

Todo puede ser representado como un objeto, siendo capaz de

almacenar cierta informacin 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 envo de


mensajes.
x

Cada

objeto

esta

contruido

en

base

otros

objetos,

permitiendo alcanzar grados mayores de complejidad.


x

Cada objeto pertenece a un tipo, denominado clase.

Todos los objetos del mismo tipo pueden recibir los mismos

mensajes.
1

MDULO 1

A continuacin, se muestra la evolucin de los lenguajes Orientados a Objetos

Unidad 1.1 Introduccin

2. Ventajas de la Orientacin a Objetos

hasta la aparicin del lenguaje Java, objeto de nuestro estudio.


Habiendo visto la evolucin de los lenguajes de programacin en base a su nivel de
abstraccin, 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 Orientacin a Objetos aplica tambin al Anlisis y Diseo

Suministra modelos similares a los del mundo real.

Facilita el desarrollo de sistemas complejos.

Facilita la reutilizacin

Permite el desarrollo iterativo de aplicaciones.

Facilita la interoperabilidad de aplicaciones.

2.1 Similitud con el mundo real

de las soluciones. El mtodo ms utilizado a da de hoy es el UML (siglas de Unified


Modeling Language) sucesor de los mtodos de Anlisis y Diseo Orientado a

Mediante la abstraccin 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 cindonos al mbito de la solucin.

(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 mtodo visual, basado en diagramas, que permite modelar sistemas, en


base a Especificaciones, Arquitectura, Diseo y/o Implementacin.

relaciones jerrquicas, relaciones de interaccin.


x

Ejemplo: Tenemos que desarrollar un programa para una tienda de

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

MDULO 1

Unidad 1.1 Introduccin

Encapsulamiento. Permite ocultar que s lo que proporciona

una entidad, sin necesidad de conocer como lo proporciona.


x

Modularidad. Divisin de las soluciones en componentes ms

pequeos o mdulos independientes que se integran entre s. Una


solucin compleja desarrollada en un solo mdulo es imposible de
abarcar por un solo lector, debido al nmero de caminos de control,
variables ...
x

Herencia. Relacin de jerarqua entre las entidades, en cuanto

a funcionalidad.

2.3 Facilita la reutilizacin


2.2 Facilita el desarrollo de sistemas complejos.

La reutilizacin de cdigo es una de las grandes ventajas de los lenguajes


Orientados a Objetos. Cules son las caractersticas que permiten obtener

El sistema de abstraccin del mundo real, permite centrarnos por una parte
en cuales son las entidades del dominio, qu informacin 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 jerquicas de

entidades),

composicin

(creacin

de

entidades

en

base

otras)

parametrizacin (reutilizacin de operaciones en funcin de los parmetros


que se les pasan a dichas operaciones).

tengamos toda esta informacin, ver las interrelaciones entre todos ellos y su
convivencia.

La Orientacin a Objetos soporta la reutilizacin basada en la utilizacin de


libreras de componentes (agrupacin de entidades con un significado

Este tipo de abstraccin nos permite realizar un tipo de programacin BottonUp (de abajo a arriba), donde partiendo de piezas ms pequeas se va
conformando el todo.

relacionado),

patrones

de

diseo

(soluciones

dadas

problemas

ya

existentes) y arquitecturas software (tambin conocidas con el nombre de


framework).

Se puede llegar a comparar con el mecanismo de contruccin del Hardware,


que para la construccin de un todo, es necesario la utilizacin de piezas
pequeas que se van ensamblando para conformar las piezas ms 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 vern ms 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 aprobacin de lo desarrollado hasta el

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

MDULO 1

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

Unidad 1.1 Introduccin

2.5 Facilita la interoperabilidad

se le aaden 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 topologa en la que se ejecuta la solucin. De esta manera

tradicional. De esta manera se comprueba que la solucin dada al problema a

no nos tendremos que preocupar en que topologa se va a ejecutar nuestra

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

solucin, ni en el caso de que la solucin vaya a estar dividida en distintas

finalizacin del desarrollo, para verificar que la solucin final satisface el

partes, las plataformas de ejecucin de las mismas. De esta manera la

problema a resolver en su totalidad.

entidad oficina, con la definicin 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 utilizacin de Casos de

un Mainframe.

Uso, uno de los diagramas definidos por UML. Describen una visin 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 topologa se va a ejecutar.

cmo lo har.
A continuacin se muestra como sera el ciclo iterativo de desarrollo. Por cada
conjunto de casos de uso elegidos, se pasar por cada una de las fases,
permitiendo tener casos de usos finalizados mientras que otros estn
pendientes de iniciarse.

MDULO A

MDULO 1

Los lenguajes orientados a objetos, miden su nivel de abstraccin


con respecto a la definicin del mundo real.

Conceptos bsicos. Objeto, atributo,


mtodo, interfaz, clase

Las principales ventajas son:


-

Suministra modelos similares a los del mundo real.

Facilita el desarrollo de sistemas complejos.

Facilita la reutilizacin.

Permite el desarrollo iterativo de aplicaciones.

Facilita la interoperabilidad de aplicaciones.

Facilita el desarrollo de sistemas complejos.

Tema 1.2

ndice de la unidad:

1. Conceptos bsicos
2. Objeto
3. Clase

Unidad 1.2 Conceptos bsicos

En esta unidad veremos cuales son los conceptos bsicos en los que se apoya la
Orientacin a Objetos, tanto a nivel de Anlisis y Diseo, como en la Programacin.

1. Conceptos bsicos
Como se ha comentado en la Unidad 1.1, los lenguajes de programacin Orientados
a Objetos, se caracterizan por tener su nivel de abstraccin basado en el mundo
real. As, el nfasis est en la abstraccin de datos, y los problemas del mundo real
son representados por un conjunto de objetos de datos para los que se adjunta un
conjunto correspondiente de operaciones.
As, al igual que otros lenguajes de programacin, introducen un nuevo conjunto de
trminos, o conceptos bsicos que son esenciales comprender, para poder realizar
cualquier anlisis, diseo o desarrollo Orientado a Objetos:
x

Objeto

Atributo

Mtodo

Interfaz

Clase

A continuacin veremos en ms detalle cada uno de estos conceptos bsicos.

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 camin, un


perro, una cuenta bancaria ...

11

MDULO 1

Unidad 1.2 Conceptos bsicos

2.1 Caractersticas de un objeto


Todos los objetos, tienen intrnsecos las siguientes caractersticas, como se
han visto en alguna de definiciones del apartado anterior:
x

Algo que puede comprenderse intelectualmente. Por ejemplo,

Identidad. Es un identificador unvoco para cada uno de los

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

una proceso de ordenacin

mismos, es la nica manera de poder determinar cada uno de los objetos. As si tenemos dos cuentas corrientes con el mismo titular, y el
mismo importe, la nica forma de diferenciarlas es va dicha identidad.
x

Comportamiento. Conjunto de operaciones o mtodos 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 metodologas Orientadas a Objetos como pueden ser:

Ejemplo: Para un reloj determinado, la identidad o identificador podra ser

unReloj, con los atributos hora (horas, min, seg), dia (dia, mes, ao), modelo y

numSerie y cuyos mtodos u operaciones seran getHora, getDia, incrementar-

Un objeto se caracteriza por un nmero 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 caractersticas 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

tacin est oculta) y un conjunto definido de operaciones que ope-

los mtodos u operaciones permitidas por dicho objeto, ya sean visibles para

ran sobre ese estado. Ian Sommerville

el usuario o no.

Los mtodos pueden clasificarse de la siguiente manera:

Un objeto es una identidad con unos lmites bien definidos que

encapsulan estado y comportamiento. El estado se representa por


atributos y relaciones, el comportamiento es representado por operaciones y mtodos. Object Management Group
Los trminos objeto e instancia son usados indistintamente.

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

MDULO 1

Unidad 1.2 Conceptos bsicos

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

Propsito general: la lgica del programa. Por ejemplo, lim-

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

Atributo: Es una caracterstica fundamental de cada objeto y por lo tanto como veremos posteriormente de una clase. Todos los atributos tienen algn valor, siendo este una cantidad, una relacin con otro objeto
... Si el valor del atributo es un valor fijo para todos los objetos, se dice
que es un atributo esttico

Mtodo: Es una accin que se realiza sobre un objeto para consultar o


modificar su estado.

2.3 El aspecto de los objetos.


Ejemplo: Para el objeto unReloj mencionado anteriormente, la estructura

sera 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
tambin llamado aspecto exterior.

14

15

MDULO 1

Unidad 1.2 Conceptos bsicos

3. Clase
Hasta ahora hemos visto que define a un objeto. Una de las definiciones ms sencillas es algo del mundo real, tangible o visible.
Hemos visto que los objetos estn formados por atributos y mtodos. La definicin
de estructura y comportamiento de un objeto es a lo que se denomina clase. Es por
tanto un patrn para la definicin de atributos y mtodos para un tipo particular de
objetos.
Todos los objetos de una clase dada son idnticos en estructura y comportamiento
pero son nicos (aunque tengan los mismos valores en sus atributos).
Este aspecto exterior, es llamado tambin interfaz, siendo la parte visible y

Instancia es el trmino 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. Tambin se le define como el protocolo de comunicacin de un objeto.


Una clase, por tanto es solamente la definicin. Mientras que un objeto o instancia
Es posible que exista algn mtodo 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 mtodos 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-

mtodos del propio objeto.

tos que contiene y los mtodos que realiza.

Ejemplo: Para el objeto unReloj, el interfaz estara formado por los mtodos

getHora, getDia, incrementarHora e incrementarDia. Los mtodos

limpiarPan-

talla y traducirFrecuencia solamente pertenecen (conjuntamente con los que


forman el interfaz) al aspecto interno. As el mtodo limpiarPantalla, es llamado
por getHora y getDia antes de mostrar la informacin pedida en el mtodo

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

loj,

cuyos atributos son dia, hora, modelo y numSerie y cuyos mtodos 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 mtodos.

16

17

MDULO 1

Unidad 1.2 Conceptos bsicos

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 problemtica, aparece el concepto de Clasificacin. La clasificacin es el medio por el que ordenamos el conocimiento, ya que fundamentalmente es un problema de bsqueda de similitudes. Al clasificar buscamos grupos de cosas que tengan una misma estructura o exhiban un comportamiento comn.
La clasificacin dentro de la Orientacin a Objetos, sobre todo en las fases de

Como se puede ver en la imagen anterior, en los diagramas UML, la definicin de


una clase, se realiza mediante un rectngulo, divido en tres partes y conteniendo

Anlisis y Diseo, 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 Mtodos.

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 informacin mostrada hasta el momento.
Una clase es un patrn para la definicin del estado y el comportamiento de
un tipo particular de objetos.
Todos los objetos de una clase dada son idnticos 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 ejecucin. Residen en el
espacio de memoria.

18

19

MDULO 1

Ttulo de unidad didctica

x
Decidir cual es el concepto o conceptos (Clase, Objeto, Mtodo, Atributo) que

apoya la Orientacin a objetos:

cuadran con las siguientes definiciones. Pensar la solucin antes de pasar al

Objeto.

siguiente cuadro:

Atributo.

Mtodo.

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 mtodos:
5. Yo represento el estado:
6. Yo represento el comportamiento:
7. Yo estoy en los objetos:
8. Yo vivo en memoria:
9. Yo soy usado para crear instancias:
10. Mi estado puede cambiar:
11. Yo declaro mtodos:
12. Yo puedo cambiar en ejecucin:

Las soluciones a las preguntas anteriores son:


1. El valor de mis atributos puede ser distinto al de los de mi semejante: Objeto

2. Yo me comporto como una plantilla: Clase


3. A mi me gusta hacer cosas: Objeto, mtodo
4. Yo puedo tener muchos mtodos: Clase, objeto
5. Yo represento el estado: Atributo
6. Yo represento el comportamiento: Mtodo
7. Yo estoy en los objetos: Atributo, mtodo
8. Yo vivo en memoria: Objeto
9. Yo soy usado para crear instancias: Clase
10.Mi estado puede cambiar: Objeto
11.Yo declaro mtodos: Clase
12.Yo puedo cambiar en ejecucin: Objeto, atributo

20

En esta Unidad hemos visto los conceptos bsicos en los que se

MDULO A

Paradigmas de la OO

Tema 1.3

ndice de la unidad:

1. Paradigmas de la Orientacin a Objetos


2. Abstraccin
3. Encapsulacin y ocultamiento
4. Relaciones
5. Polimorfismo

Unidad 1.3 Paradigmas de la Orientacin a Objetos

En esta unidad veremos cuales son los paradigmas en los que se apoya la Orientacin a Objetos, tanto a nivel de Anlisis y Diseo, como en la Programacin.

1. Paradigmas de la Orientacin a Objetos.


Como se ha comentado en la Unidad 1.1, los lenguajes de programacin Orientados
a Objetos, se caracterizan por tener su nivel de abstraccin basado en el mundo
real. As, el nfasis est en la abstraccin de datos, y los problemas del mundo real
son representados por un conjunto de objetos de datos para los que se adjunta un
conjunto correspondiente de operaciones.
El paradigma de la Orientacin a Objeto es una disciplina de ingeniera de desarrollo y modelado de Software que permite construir ms fcilmente sistemas complejos a partir de los componentes individuales vistos en la Unidad 1.2, tales como objetos, clases, atributos, mtodos e interfaces, todos ellos utilizados para construir
un programa.
Esta disciplina y por tanto cualquier lenguaje de Orientacin a Objetos que pertenezca a ella, debe de cumplir con los siguientes paradigmas (aunque cada lenguaje
tenga sus propias peculiaridades al respecto):
x

Abstraccin

Encapsulacin y Ocultamiento

Herencia

Polimorfismo

A continuacin veremos en ms detalle cada uno de estos paradigmas.

2. Abstraccin
Consiste en la generalizacin conceptual de los atributos y comportamiento de un
determinado conjunto de objetos.

25

MDULO 1

Unidad 1.3 Paradigmas de la Orientacin a Objetos

La clave de la programacin Orientada a Objetos est en abstraer los mtodos y los

que es inaccesible para los dems. 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 implementacin interna de un objeto sin


afectar a los clientes que lo utilizan. De esta manera, mientras el interfaz no vare,

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

se puede modificar la implementacin o el aspecto interno, sin que los objetos con

comportamiento), antes de decidir cmo debera ser implementado. Nos centramos

los que interrelaciona se vean afectados.

por tanto en la definicin, en lugar de la implementacin.


x

Ejemplo de abstraccin: 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 solucin, 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

mentacin, donde habitan y su tamao, y como comportamiento, queremos sa-

entre ellas. Estas dependencias es a lo que se llama relacin 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 continuacin:

realidad, hemos abstrado estado y comportamiento y hemos definido la clase


Animal.

Asociacin: Relacin simple.

Agregacin: Contenido en ...

Composicin: Obligatoriedad. Uno no puede existir sin el otro.

Herencia: Relacin Jerrquica. Son del tipo de

Relaciones dinmicas: Mensajes.

4.1 Relacin de Asociacin


Representa la dependencia ms general entre clases, siendo una dependencia
de tipo semntico. Por defecto es bidireccional, aunque se puede restringir a

3. Encapsulacin y Ocultamiento
Se tratan los dos paradigmas de forma conjunta, puesto que se utilizan normalmente de forma simultnea.

una sola direccin.


Esta relacin tiene multiplicidad (propiedad que expresa el nmero de instancias de cada clase que participa en la relacin):
x

0..1 : cero o uno

necientes a una misma entidad, al mismo nivel de abstraccin.

1 : uno y solo uno

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

0..* o * : cero o muchos

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

pueden acceder otros objetos, del aspecto interno e implementacin del mismo,
26

27

MDULO 1

Unidad 1.3 Paradigmas de la Orientacin a Objetos

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 asociacin bidireccional y la flecha (linea discontinua o conticuando es unidireccional.

nua)
x

Ejemplo de asociacin unidireccional: Un pedido puedo acceder

En los diagramas UML, el rombo blanco se utiliza

para repre-

sentar la agregacin.
x

a un

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

Ejemplo de agregacin: Una centralita puede contener llamadas. Pero

puede existir sin ellas.

sera miPrograma puede acceder a un producto, pero un producto no puede acceder a miPrograma.
x

Ejemplo de asociacin bidireccional: Un cliente puede acceder a un pedi-

do, y un pedido puede acceder a un cliente.

4.3 Relacin de Composicin


Se trata de una relacin de agregacin 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 composicin.
x

Ejemplo de composicin: Un coche no puede existir, sin las partes que le

componen, en este caso, las ruedas, la carrocera y el motor.

4.2 Relacin de Agregacin


Es una forma particular de asociacin que expresa un acoplamiento mas fuerte entre objetos.
Indica que los objetos de una clase contienen o estn formados por objetos de
otras clases, aunque no siempre precisa una contencin fsica, sino al menos
lgica.

28

29

MDULO 1

Unidad 1.3 Paradigmas de la Orientacin a Objetos

4.5 Relacin dinmica: Mensaje


4.4 Relacin de Herencia
Un mensaje es un comando o peticin que se le enva a otro objeto, para que
Se basa en la existencia de relaciones de generalizacin/especializacin entre

realice una operacin.

clases.
El objeto llamante requiere el conocimiento previo del interfaz del objeto reLas clases se disponen en una jerarqua, 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 jerarqua.

y los formatos del mensaje a enviar.

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

Esta relacin se indica que es dinmica ya que se observa en ejecucin, no en

heredados y puede modificar los atributos y operaciones heredadas si necesita

el diseo (en diseo solo se observan las interfaces y las relaciones). En una

cambiar su implementacin.

clase, por tanto no se define, ningn tipo de mensaje. Es en ejecucin, donde


se aprecia los mensajes que un objeto llamante enva 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 operacin 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 mtodo getHora.


Para ello, el objeto unaPersona tiene que conocer el interfaz de unReloj, para
saber que mtodo es el que tiene que llamar, si tiene que pasarle parmetros,
de que tipos y si le va a devolver alguna informacin y una vez ms, de que tipo.

terminado en la clase Animal.

30

31

MDULO 1

Unidad 1.3 Paradigmas de la Orientacin a Objetos

5. Polimorfismo
Permite implementar mltiples formas de un mismo mtodo, dependiendo cada una
de ellas de la clase sobre la que se realice la implementacin. Esta basado en el
concepto especializacin de la herencia, donde cada clase hija, sabe implementar
mejor que el padre alguno o todos sus mtodos.
Esto posibilita desencadenar implementaciones de operaciones diferentes como

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


x
x
x
x
x

respuesta a un mismo mensaje, en funcin del objeto que lo reciba.


En el polimorfismo, una vez creados los objetos, se abstraen a la clase padre que
proporciona el interfaz, para que el objeto llamante generalice su envo de mensaje
independientemente del tipo de objeto especfico o clase hija; solamente debe de

Una margarita es un tipo de flor.


Una rosa es un tipo de flor.
Las rosas rojas y las rosas amarillas son tipos de rosas.
Un ptalo es una parte de ambos tipos de flores.
Los pjaros se comen a ciertas plagas como los pulgones, que pueden
infectar a ciertos tipos de flores.

ser consciente del interfaz del mismo, mediante la clase padre. Es en ejecucin,
cuando dependiendo realmente del tipo de objeto real, se ejecutar la implementacin concreta de cada objeto.
x

Del enunciado de la prctica, se pueden determinar distintas relaciones:


x

en el mundo real existen flores sin ptalos (sera una relacin de agrega-

Ejemplo de polimormismo: En el ejemplo, el Matemtico, solo va a tener

cin) en el mbito de nuestro problema, solo contemplamos flores con ellos.

relacin con Figura para calcularArea y calcularPerimetro. Pero realmente es cada una de las figuras, la que sabe como tiene que calcularArea o calcularPerimetro. Por eso, cada una de ellas, Cuadrado, Triangulo y Circulo van a implementar cada uno de los mtodos de una manera mas especializada que el padre

32

Existe una clase Flor que contiene Ptalos: Relacin de composicin. Aunque

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

MDULO 1

Unidad 1.3 Paradigmas de la Orientacin a Objetos

Como solucin tambin vlida, se podra tener una relacin de herencia con
Rosa, las clases RosaAmarilla y RosaRoja, pero de esta manera, teniendo un
atributo color permite una mejor reutilizacin en el caso de que pueda aparecer otra rosa de otro color.

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

En esta Unidad hemos estudiado los diferentes paradigmas de la programacin

una relacin de asociacin 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 relacin de asociacin con

x
x
x

Abstraccin
Encapsulacin y Ocultamiento
Relaciones

ellas, con cualquier tipo, ya sea un Pulgon o en un futuro una AraaRoja.

34

asociacin

agregacin

composicin

herencia

mensaje

Polimorfismo

35

MDULO B

UNIDADES DIDCTICAS:

1. Introduccin a Java. Caractersticas del lenguaje


2. Entorno de desarrollo
3. Sintxis. Identificadores, keywords, variables,
tipos de datos, operadores, tipos de sentencias
4. Clases, objetos, herencia, polimorfismo
5. Otros conceptos. Paquetes, modificadores de
acceso, static, final, constantes

MDULO B

Introduccin a Java. Caractersticas


del lenguaje

Tema 2.1

ndice de la unidad:

1. Introduccin
2. Caractersticas del lenguaje
3. La plataforma Java

Unidad 2.1 Introduccin a Java. Caractersticas del lenguaje

En esta unidad veremos el origen del lenguaje de programacin Java y cuales son
sus principales caractersticas.

1. Introduccin
Fue creado por Sun Microsystems en el ao 1991 e inicialmente se denmino OAK y
se desarroll principalmente orientndolo a la programacin de microsistemas y
componentes electrnicos.
Tras el cambio de nombre y modificaciones de diseo, el lenguaje Java fue presentado en sociedad en Enero de 1995 con una nueva orientacin: Internet. Fue presentado conjuntamente con un navegador Web denominado HotJava.
Tiene una sintaxis muy similar a la de C++, pero tiene un modelo de objetos mas
simple y elimina elementos de bajo nivel que suelen inducir a muchos errores, como pueden ser la manipulacin directa de punteros o memoria.
Entre noviembre de 2006 y mayo de 2007, Sun Microsystems cedi la mayor parte
de sus tecnologas Java a GNU GPL, de tal forma que prcticamente todo el Java de
Sun es ahora Software libre.
La idea inicial del lenguaje se bas en el paradigma de Write Once, Run Anywhere
(Escribe una vez, ejecuta en cualquier lugar), proporcionando un lenguaje independiente de la plataforma en la que se ejecute.
Java ha sufrido numerosos cambios desde la versin inicial, JDK (Java Depelopment
Kit o entorno de desarrollo) 1.0, as como un aumento increble en el nmero de
clases y paquetes que componen la biblioteca estndar. Esta biblioteca estndar se
ha visto ampliada por numerosas bibliotecas de carcter especfico, como pueden
ser las bibliotecas visuales, comunicaciones, etc.

43

MDULO 2

Unidad 2.1 Introduccin a Java. Caractersticas del lenguaje

2. Caractersticas del lenguaje

No permite la sobrecarga de operadores.

A continuacin enumeramos todas las caractersticas de este lenguaje de progra-

No soporta la herencia mltiple.

No soporta destructores.

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

macin Orientado a Objetos, que adems de cumplir con los paradigmas de esta
disciplina de programacin (Abstraccin, Encapsulacin y Ocultamiento, Herencia,
Polimorfismo y Reutilizacin), posee las siguientes propiedades:
x

Sencillo

Distribuido

Interpretado

Robusto

Seguro

Arquitectura neutra y portabilidad

Altas prestaciones

Multithread

Dinmico

zado con nulo.


x

Cuenta con un sistema automtico para asignar y liberar

memoria: el Garbage Collector. Uno de los grandes problemas de


C++ es la reserva y liberacin de la memoria de forma programtica,
provocando indeseados memory leaks.

2.2 Distribuido
Est concebido para trabajar en un entorno conectado en red.
Cuenta con una amplia biblioteca de clases para comunicarse mediante los

A continuacin veremos en ms detalle cada una de las caractersticas 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 va 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 programacin C++, pero


eliminaron la mayora de sus complejidades, para facilitar su aprendizaje, su lectura y el mantenimiento de los programas. A continuacin se listan algunas de
las complejidades que se eliminaron:

44

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

No soporta typedef ni #define

viamente mediante un compilador. Es la principal diferencia con el resto de


lenguajes interpretados. Necesita ser vlidado y compilado en un paso previo
al de su ejecucin.
El compilador de Java traduce el cdigo fuente o programa java a un cdigo
intermedio (bytecode) o cdigo mquina similar a las instrucciones de ensamblador pero independiente de la mquina fsica en la que se ejecuta.

45

MDULO 2

Los bytecodes son interpretados (ejecutados) en cualquier entorno donde

Unidad 2.1 Introduccin a Java. Caractersticas del lenguaje

2.4 Robusto

exista un intrprete de Java generando cdigo mquina. El intrprete de Java


se llama Mquina Virtual Java o Java Virtual Machine (JVM) y este si que es

Un software robusto es aquel que no se interrumpe fcilmente a consecuen-

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

cia de fallos. Al ser previamente compilado, todos los errores sintcticos son

para la mayora 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 caractersticas suele tener ms restricciones a la hora de
A continuacin se muestra cual sera el procedimiento a seguir, para poder

programar y realiza numerosas comprobaciones tanto en compilacin como

ejecutar un programa java.

en ejecucin. Facilita el manejo de excepciones, para poder tratar los fallos en


ejecucin (se vern en ms detalle en la Unidad 3.5).
El tratamiento automtico de la memoria impide poder sobrescribirla y corromper o modificar otros datos mediante punteros.

2.5 Seguro

Esta caracterstica es la que posibilita el propsito 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 crtico. A nadie le gustara ejecutar en su propio ordenador programas
que tuvieran total acceso a su sistema, donde por ejemplo, pudieran coger informacin confidencial, tales como passwords o cuentas bancarias o incluso
poder formatear el ordenador personal.
Todos los navegadores poseen una sand box o entorno de ejecucin controlado donde no se permite realizar ninguna ejecucin fuera de ella (como puede ser acceso al sistema de ficheros) a menos que se indiquen explcitamente
excepciones por parte del usuario que lo ejecuta.
Estas excepciones pueden venir determinadas por tecnologas de firma digital
para confiar en un determinado cdigo Java y/o mediante polticas de seguridad para controlar de una manera ms precisa que puede o no puede hacer
(por ejemplo leer ciertos ficheros, poder abrir sockets ...).

2.6 Arquitectura neutra y portabilidad


Los bytecodes, resultados de la compilacin 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

MDULO 2

Unidad 2.1 Introduccin a Java. Caractersticas del lenguaje

Son independientes de que su ejecucin se realicen en estaciones de trabajo,

A pesar de todo, existe algn compilador real de Java (perdemos la portabili-

o en servidores, o en arquitecturas fsicas con el mismo sistema operativo o

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

sistemas hetereogneos.

cin, generando un ejecutable (no cdigo interpretable) atado a dicha plataforma. Este tipo de compilador se encuentran en desuso.

Por tanto, el cdigo bytecode es independiente no solo de la plataforma Software en la que se ejecuta, sino tambin de la plataforma Hardware.

2.8 Multithread

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

El trmino multithread o multihilo en castellano, se refiere a la ejecucin de

cifica el tamao de sus tipos bsicos, el comportamiento de los operadores

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

aritmticos y el uso de estndares como UNICODE, IEEE 754 etc que per-

po real por el nmero de procesadores.

miten representar cualquier carcter mediante 2 bytes en lugar de uno solo,


como ocurre con el ASCII.

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

usuario, y otro thread realiza ciertos clculos. Por ejemplo, es bastante frecuente la existencia de un thread que espera que un usuario lance una peticin de
operacin y en el momento de la llegada se abra otro thread para ejecutar dicha
operacin, mientras el thread de comunicacin con el usuario queda a la espera
de nuevas peticiones. As, si tres usuarios realicen tres peticiones al mismo
tiempo el nmero total de threads seran 4, uno por cada operacin ejecutndose ms el thread que sigue quedando a la espera de nuevas comunicaciones.
Cuando la ejecucin de cada operacin termine, el thread correspondiente terminar y desaparecer.

Para poder realizar esta ejecucin simultanea de varias tareas, Java posee
una serie de clases que facilitan su utilizacin.

2.9 Dinmico
El cdigo C++, a menudo requiere una recompilacin y lincado completa si
cambia una clase.
Java utiliza una fase de linkado o utilizacin de clases en tiempo de ejecucin
en modo dinmico. As las clases solo son utilizadas cuando son necesitadas.

2.7 Altas prestaciones

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

Existen intrpretes JIT (Just-in-time) que interpretan el cdigo en el momento


de la ejecucin, generando cdigo mquina una sola vez y en las sucesivas

Para conseguir esto, Java emplea un mtodo de interfaces para evitar estas

ejecuciones reutiliza dicho cdigo mquina en lugar de volver a generar cada

dependencias y recompilaciones.

vez que pasa la ejecucin por ah.


Adems, Java permite la indireccin. 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

MDULO 2

Unidad 2.1 Introduccin a Java. Caractersticas del lenguaje

clases va programtica, una clase denominada X, y una vez encontrada que

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

sos limitados como telfonos mviles, PDAs,

de mtodo y atributo.

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

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 mquina virtual Java (JVM) o intrprete de Java.

La Interfaz de Programacin de Aplicaciones (API). El API Ja-

va es un conjunto de clases ya desarrolladas que ofrecen un gran


abanico de posibilidades al programador. El conjunto de las APIs son
controlados por el grupo JCP (Java Component Process)

Existen distintas ediciones de la plataforma Java:

50

51

MDULO B

MDULO 2 PROGRAMACIN JAVA

En esta unidad se ha visto el origen del lenguaje de programacin Java y las


caractersticas que lo conforman:
-

Orientado a Objetos

Seguro

Distribuido

Interpretado

Robusto

Seguro

Arquitectura neutra y portabilidad

Altas prestaciones

Multithread

Dinmico

Adems se han categorizado los distintos tipos de plataformas Java:

Java ME

Java SE

Java EE

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

1. Java Development Kit


Es el entorno de desarrollo de referencia para programas desarrollados del lenguaje
de programacin Java.
El JDK como tl, 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 versin del JDK fu el JDK 1.0.0 que se retir de circulacin con la
aparicin del JDK 1.1.0
El nombre ha ido cambiando entre JDK (Java Development Kit) y SDK (Software Development Kit), quedando de nuevo JDK como nombre actual. Tambin ha ido cambiando el sistema de numeracin, cambiando a 5.0 en lugar de
1.5.
A su vez, y a partir de la versin 1.2, el nombre "J2SE" (Java 2 Platform,
Standard Edition), reemplaz a JDK para distinguir la plataforma base de J2EE
(Java 2 Platform, Enterprise Edition) y J2ME (Java 2 Platform, Micro Edition).

55

MDULO 2

Unidad 2.2 Entorno de Desarrollo

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

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-

rrollo y ejecucin) como un JRE (o Java Runtime Environment, solamente uti-

Database Connectivity) para la integracin con bases de

lizado en ejecucin), tambin llamado JVM. En este curso, solamente nos cen-

datos, RMI (Remote Method Invocation)

traremos en el JDK del Java SE.

Una reestructuracin 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 denominacin Java 2. Otras mejoras aadidas incluan:
x

La palabra reservada (o keyword) strictfp,

Reflexin en la programacin (Reflection API)

La API grfica, Swing, fue integrada en las clases bsi-

cas
x

La mquina virtual (JVM) de Sun fue equipada con un

compilador JIT (Just in Time) por primera vez


x

El Java Plug-in para ejecucin de Java en los navegado-

res.
x

Java IDL, una implementacin de IDL (Lenguaje de

Descripcin de Interfaz) para la interoperabilidad con


Desde la versin 1.4 de J2SE, la evolucin del lenguaje de programacin Java

CORBA

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

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 Especificacin del Lenguaje Java. Los cambios en los JLS son gestio-

nados en JSR 901.

Kestrel. Los cambios ms notables fueron:

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

Veamos a continuacin un breve resumen de las versiones y los cambios im-

portantes que hubo en cada una de ellas:

JVM de HotSpot fue lanzada inicialmente en abril de 1999,

La inclusin de la mquina virtual de HotSpot JVM (la

para la JVM de J2SE 1.2)

JDK 1.0: Aparece el 23 de Enero de 1996.

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

incluye son:
56

Colecciones (Collections)

RMI fue cambiado para que se basara en CORBA

JavaSound API
57

MDULO 2

Unidad 2.2 Entorno de Desarrollo

nes y elimina la necesidad de la mayora de conversion de


tipos (type casting).

mente disponible como una extensin)

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 ms notables

fueron:

Autoboxing/unboxing o conversiones automticas entre

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

Palabra reservada o keyworkd assert

tipos primitivos (como los Integer).

Expresiones regulares modeladas al estilo de las expre-

Enumeraciones; la palabra reservada enum crea una

siones regulares Perl

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

Dia.MARTES, etc.). Anteriormente, esto solo poda ser lle-

Encadenacin de excepciones Permite a una excepcin

vado a cabo por constantes enteras o clases construidas

encapsular la excepcin de bajo nivel original.


x

manualmente.
x

Non-blocking NIO (New Input/Output)

Logging API

API I/O para la lectura y escritura de imgenes en for-

Varargs o nmero de argumentos variable. El ltimo

parmetro de un mtodo puede ser declarado con el nombre del tipo seguido por tres puntos (por ejemplo: void
drawtext(String... lines)). En la llamada al mtodo, puede

matos como JPEG o PNG

usarse cualquier nmero de parmetros de ese tipo, que

sern almacenados en un array para pasarlos al mtodo.


Parser XML integrado y procesador XSLT (JAXP)

Seguridad integrada y extensiones criptogrficas (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-

mente el interfaz Iterable, como la clase estndar CollecJava Web Start incluido (El primer lanzamiento ocurri

en marzo de 2001 para J2SE 1.3)


x

Metadatos, tambin llamados anotaciones, permite a

estructuras del lenguaje como las clases o los mtodos,

Java Platform Debugger Architecture (JPDA)

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

clave Tiger. Los cambios ms notables fueron:


x

Plantillas (generics) que proporcionan conversion de ti-

pos (type safety) en tiempo de compilacin para coleccio-

tion
x

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

clave Mustang. Los cambios ms importantes introducidos en esta


versin son:
x

Incluye un nuevo marco de trabajo y APIs que hacen

posible la combinacin de Java con lenguajes dinmicos


como PHP, Python, Ruby y JavaScript.

58

59

MDULO 2

Unidad 2.2 Entorno de Desarrollo

Incluye el motor Rhino, de Mozilla, una implementacin

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.

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

/db: gestor de base de datos (nuevo de la versin 6.0).

/lib:las libreras del JDK, utilidadas por l mismo.

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

Mejoras en la interfaz grfica y en el rendimiento.

/demo: una variedad de ejemplos escritos en Java.

Incluye JavaDB (el conocido Derby de Apache).

/jre: la JVM sin herramientas de desarrollo

/src.zip: el cdigo 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 ejecucin de los programas Java, vamos a trabajar con el JDK
directamente, para poder afianzar ciertos conceptos imprescindibles.

A continuacin se muestran los componentes que conforman el JDK.

Ver la Unidad Instalacin del JDK y Eclipse para los detalles de la instalacin.

javac.exe: Compilador de Java.

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

java.exe: Intrprete de Java (JVM).

appletviewer.exe: Intrprete de applets Java.

jdb.exe: Depurador de Java.

javadoc.exe: Generador de documentacin.

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

javap.exe: Desensamblador.

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 mquina. En el caso del JDK, se encuentran en el directorio bin de la instalacin.
x

CLASSPATH: Variable de entorno del Sistema Operativo en la

que se le indican donde se van a encontrar las clases Java para la


compilacin y ejecucin de los programas. Esta variable solo ser necesaria en la ejecucin de los programas Java. Desde el JDK 1.4.0 si
no hay variable CLASSPATH definida, el JDK asume el . (punto), es

Existe

decir, el directorio desde donde ejecutemos las herramientas como

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

documentacin

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 continuacin se muestran que directorios contiene el JDK y para que se utili-

En el captulo anterior, hemos estado viendo el JDK no visual. Pero existen herra-

zan:

mientas grficas que simplifican el desarrollo, compilacin y ejecucin de los pro61

MDULO 2

Unidad 2.2 Entorno de Desarrollo

gramas Java (al menos en entornos de desarrollo). Mencionamos a continuacin las


mas importantes y las URLs de referencia:
x

Eclipse: Es Open Source. Es la herramienta grfica que utiliza-

remos durante el curso. http://www.eclipse.org (ver la Unidad Instalacin del JDK y Eclipse para su instalacin)
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

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

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.
PRCTICA A: Requiere instalar el JDK. Desde una sesin de DOS, ir a un directorio
distinto del de la instalacin del JDK y ejecutar los comandos java.exe -version
PRCTICA B: Requiere instalar el JDK. Desarrollar un programa Java que muestre
por pantalla el texto Hola Mundo! con el JDK de Sun.

62

63

MDULO 2

Unidad 2.2 Entorno de Desarrollo

En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS
y ajustar la variable PATH para que el Sistema Operativo sepa encontrar las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le aadimos
%PATH%.

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

Y aceptamos la creacin de un fichero nuevo.


Ajustar la variable CLASSPATH para que las herramientas del JDK sepan encontrar
nuestras clases Java. Tenemos dos opciones, o aadir el . (punto) y siempre
ejecutar las herramientas en el directorio donde se encuentre el cdigo, o aadir el
directorio de trabajo y ejecutar las herramientas donde queramos. Para respetar el
valor que ya tuviese la variable CLASSPATH le aadimos %CLASSPATH%.

64

65

MDULO 2

Unidad 2.2 Entorno de Desarrollo

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

Escribimos el cdigo 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 extensin.

Compilamos el programa Java con el compilador javac. Al compilador hay que


darle el nombre del fichero incluyendo su extensin.
66

67

MDULO 2

Unidad 2.2 Entorno de Desarrollo

PRCTICA C: Requiere instalar Eclipse. Desarrollar un programa Java que muestre por pantalla el texto Hola Mundo! con Eclipse
Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe

Seleccionar la ubicacin del workspace (o rea de trabajo).

Cerrar la ventana de bienvenida si aparece (esta ventana aparece la primera vez


que se arranca Eclipse).

68

69

MDULO 2

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 mtodo main.

70

71

MDULO 2

Unidad 2.2 Entorno de Desarrollo

Por defecto, en eclipse, al salvar los cambios realizados en un fichero, se realiza la


compilacin de las clases que estn en el worskpace.
En el caso de producirse algn error de compilacin, se pueden ver en la vista Problems

Seleccionar Finish
Escribir el cdigo dentro del mtodo main y salvar con Ctrl + S o File -> Save
Seleccionando la clase Java, con el botn derecho del ratn ejecutarla como Java
Application

72

73

MDULO 2

Ttulo de unidad didctica

En este unidad hemos visto la historia del JDK desde su comienzo hasta el momento actual, viendo las distintas posiblidades de desarrollo, va el JDK directamente (entorno no grfico) o va los entornos grficos o IDEs, tales como Eclipse,
Rational Application Development ...

Se han visto tambin el contenido y componentes que forman un JDK y dos


variables muy importantes a tener en cuenta en entornos de desarrollo Java que
son PATH y CLASSPATH.

Y veremos como se abre una consola con el resultado.

74

MDULO B

Sintxis
Tema 2.3

ndice de la unidad:

1. Comentarios
2. Puntos y coma, bloques y espacios en blanco
3. Identificadores
4. Variables
5. Tipos de datos
6. Variables primitivas versus complejas
7.

Unidad 2.3 Sintaxis

En esta unidad trataremos en detalle la sintaxis del lenguaje de programacin Java.


Dicha sintaxis es comprobada por el compilador y en caso de no ser correcta, este
nos indicar los errores o avisos existentes. Por defecto, no se pueden ejecutar
programas Java con errores de compilacin, por lo que la sintaxis del programa debe ser 100% correcta.

1. Comentarios
Los comentarios son lneas de cdigo que no son ejecutadas en tiempo de ejecucin, ni siquiera son incluidas en el byte code compilado. Estos comentarios, permiten incluir explicaciones acerca de qu es lo que est haciendo nuestro cdigo, documentacin, inhabilitar lneas de cdigo que ya no son necesarias en runtime, etc.
Existen tres formas distintas de escribir los comentarios:
x

// comentario de una sola lnea. Abarca desde el comienzo del

comentario // hasta el final de lnea.


x

/*

*/ Comentario de una o ms lneas. Abarca desde el co-

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


x

/**

*/ Comentario de documentacin, utilizado por la

herramienta javadoc.exe. Abarca desde el comienzo del comentario


/** hasta el final del mismo */.
x

Ejemplo: A continuacin se muestra un ejemplo con los distintos ti-

pos de comentarios mencionados anteriormente.

79

MDULO 2

Unidad 2.3 Sintaxis

Otro concepto importante a tener en cuenta en Java es el de bloque de cdigo. Un


bloque es un conjunto de sentencias (de 0 a n) agrupadas entre llaves ({ }). Los
bloques pueden estar anidados.
Suelen utilizarse conjuntamente con las sentencias de control de flujo (ver punto
8), pero tambin pueden utilizarse, por ejemplo, para minimizar el mbito de ciertas variables, como son las variables de bloque (ver punto 4.2).
x

Ejemplo: A continuacin se muestra un ejemplo de bloques de cdi-

go con una o varias sentencias y anidamientos de bloques

2. Puntos y coma, bloques y espacios en blanco


Uno de los caracteres ms 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 lnea simple de
cdigo terminada en un punto y coma. La lnea simple de cdigo puede o no estar
fsicamente formada en una lnea fsica.
x

Ejemplo: A continuacin se muestra un ejemplo con los distintos ti-

pos de lneas simples de cdigo mencionados anteriormente.

Java permite los espacios en blanco entre elementos de cdigo fuente. Son utilizados principalmente para separar cada uno de los elementos de la sintaxis Java (al
menos un espacio en blanco como mnimo) y mejorar el entendimiento del cdigo
(el nmero de espacios utilizado para este propsito es irrelevante).
x

Ejemplo: A continuacin se muestran ejemplos donde los espacios

se utilizan como separadores de elementos de la sintaxis (entre int e i, y entre int y j entre otros) y como mejoras para el entendimiento del cdigo:

80

81

MDULO 2

Unidad 2.3 Sintaxis

3. Identificadores
Son los nombres unvocos que se le dan a las clases, mtodos y variables. Hay que

tener presente las siguientes reglas:


x

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

Ejemplo: Los siguientes identificadores son vlidos: variable,

$va-

riable2, CONSTANTE, nombre_usuario, nombreUsuario, _variable_sistema


Ejemplo: Los siguientes identificadores no son vlidos: 1variable,

int, #variable, variable%Final

4. Variables

dlar ($).
Una variable es un contenedor de datos identificado mediante un identificador o

Despus del primer carcter se pueden usar nmeros.

Java distingue entre maysculas y minsculas (es case sensi-

tive). Los identificadores VARIABLE y variable son dos 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 continuacin se muestra un listado de las keyword


mas utilizadas en Java y que por tanto tienen un significado especial
para el lenguaje

Un tipo

Un identificador

Un dato o valor.

4. 1 Declaracin de variables

82

83

MDULO 2

Unidad 2.3 Sintaxis

La declaracin es la sentencia mediante la cual se define una variable, asignndola 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 asignacin.


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 cdigo donde se puede referenciar di-

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

cha variable a travs de su identificador.

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

El lugar de declaracin de una variable establece su mbito. Los distintos m-

nen preferencia frente a los parmetros y por ltimo las de menor preferencia

bitos existentes son:

son los atributos.

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

zar solamente asociados a la clase a la que pertenecen.


x

Ejemplo: El siguiente ejemplo muestra el error de compilacin al in-

tentar referenciar una variable fuera de su mbito.

Parmetros de mtodo. Se pueden utilizar solamente en el

mtodo del cual son parmetros.


x

Variables locales: (o de mtodo) siempre hay que inicializar-

las. Solamente puede accederse a ellas, dentro del mtodo 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

MDULO 2

Unidad 2.3 Sintaxis

5. Tipos de datos.
En Java existen dos tipos de datos genricos:
x

Tipos Primitivos. Existen ocho tipos de datos primitivos clasifi-

cados en cuatro grupos diferentes:


x

Lgico: boolean.
Carcter: char.
Nmeros enteros: byte, short, int y long.
Nmeros reales: double y float.

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

enumeracin: enum que aparece en Java JSE 5.0

5.1 Tipo de dato lgico


La keyword utilizada para definir un tipo de dato lgico es boolean. Sus posibles
valores son:
x

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

segn el mbito en el que est declarada.

true: o verdadero

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 carcter


La keyword utilizada para definir un tipo de dato carcter es char y representa
un carcter UNICODE, siendo su tamao de: 16 bits (2 bytes). Desde la versin
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 carcter entre comillas simples: a.


87

MDULO 2

Unidad 2.3 Sintaxis

Un carcter especial con \ por delante: \n, \t, etc.

Un cdigo UNICODE: \uxxxx (donde xxxx es un valor en

Un valor octal: 077 (comenzando por cero).

Un valor hexadecimal: 0xBAAC

cio en blanco.

El valor por defecto es 0.

Ejemplos: char letra1 = a;

Ejemplos: byte unByte = 12;

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 ms detalle en la Unidad 2.6 Clases bsicas.

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

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

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 arimticas, 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
tamaos 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).

float: 32 bits (4 bytes). Su precisin vara segn la platafor-

ma.
x

double: 64 bits (8 bytes). Su precisin tambin vara segn la

plataforma.
Sus posibles valores son:
x

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

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

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

89

MDULO 2

Unidad 2.3 Sintaxis

El valor por defecto es 0.0 (cero).

Ejemplos: float unFloat = 0.17F;


double unDouble; // su valor es 0.0
double otroDouble = -12.01E30;

Se suelen utilizar en operaciones arimticas, 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.

El valor por defecto es null

Ejemplos: String unString = new String(Hola);

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

String otroString; // su valor es null

Se suelen utilizar para contener objetos de nuestro mundo real.

5.6 Tipo de dato enumeracin


La keyword utilizada para definir un tipo de dato enumeracin es enum.
Se trata de un tipo de dato complejo algo especial que surge con la versin 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

MDULO 2

Unidad 2.3 Sintaxis

Un tipo de dato nmerico puede llegar a convertirse a otro tipo. Existen cuatro
entornos de conversin en Java:
x

Promocin aritmtica. Por ejemplo: de short a int y este a

float.
x

Asignacin. Por ejemplo: long l = 42; // un int se convierte en

long
x

7. Operadores
Llamada a mtodos con parmetros. Por ejemplo: f(long p) ->

f(5) //se llama a un mtodo con un int y se convierte a un long

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

una primera clasificacin puede ser esta:


Casting. Por ejemplo: int i = (int)42L //un long se convierte en

int. Ver la explicacin de downcasting.

Operadores unarios: pueden ser de tipo prefijos o postfijos.

op operador u operador op.


Las conversiones implcitas se resuelven en tiempo de compilacin. El upcasting
(de un tipo ms pequeo convertirlo a uno ms grande) se realiza implcitamente.
El downcasting (de un tipo ms grande convertirlo a uno ms pequeo) se realizan explcitamente (hay que indicar a que tipo se quiere convertir) y se resuelve
en tiempo de ejecucin. Nota: puede perderse informacin, por lo que se obliga
a que sean realizados explcitamente.

6. Variables primitivas versus complejas


Una variable de tipo primitivo contiene el dato directamen-

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

variable contador. La variable se queda con el valor sumado

Operadores binarios: operador op operador

Ejemplo: contador + 2; // operador de sumar un nmero a una va-

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

Operadores ternarios: op ? op : op

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 clasificacin 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

Aritmticos

Relacionales

Condicionales

De desplazamiento
93

MDULO 2

Unidad 2.3 Sintaxis

Lgicos

De asignacin

-op: cambia el signo al operando.

Otros

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

7.1 Operadores aritmticos


A similitud con el mundo mtematico, existen los siguientes operadores aritmticos 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.

despus 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

despus de decrementarse).

valores.

- : resta dos operandos op1 op2

antes de decrementarse).

* : multiplica dos operandos op1 * op2

/ : divide dos operandos op1 / op2

% : calcula el resto de la divisin op1 % op2

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

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

crementales, diferenciando si se evala el valor de la variable antes o despus 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.

Tambin existen operadores aritmticos unarios (actan solo sobre un operando):

7.2 Operadores relacionales


Java tiene los siguientes operadores relacionales:

94

95

MDULO 2

Unidad 2.3 Sintaxis

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

<: compara si un operando es menor que otro op1 < op2

==: compara si un operando es igual que otro op1 == op2.

Cuidado con no confundir con el operador de asignacin =


x
x

>>: desplaza los bits del primer operando hacia la derecha

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

<<: desplaza los bits del primer operando hacia la izquierda

tantas veces como indique el segundo operando op1 << op2. Realiza la misma funcin que dividir por 2, tantas veces se desplace.

!=: compara si un operando es distinto que otro op1 != op2

>=: compara si un operando es mayor o igual que otro op1

tantas veces como indique el segundo operando pero sin signo op1

>>>: desplaza los bits del primer operando hacia la derecha

>= op2

>>> op2. Realiza la misma funcin que multiplicar por 2, tantas ve-

ces se desplace, pero sin tener en cuenta la posicin de signo.


<=: compara si un operando es menor o igual que otro op1

<= op2

Ejemplo: En los siguientes ejemplos se muestran los operadores de

desplazamiento

Todos estos operandos devuelven un boolean indicando si cumple la comparacin.


x

Ejemplo: if (5 < 7) { ... } // La condicin se ejecutar al devolver el

operador < un true o verdadero.

7.3 Operadores condicionales


Suelen combinarse con los operadores relacionales para crear expresiones ms
complejas, devolviendo un boolean. Java tiene los siguientes operadores
condicionales:
x

&&: AND lgico. Comprueba si ambos operandos son verdade-

ros op1 && op2


x

||: OR lgico. Comprueba si uno de los dos operandos es ver-

dadero op1 || op2


x

!: NOT lgico. Niega al operadondo !op

Ejemplo: if (5 < 7 && 4 < 8) { ... } // La condicin se ejecutar al

devolver el primer operador < un true y el segundo operador < un true.

7.4 Operadores de desplazamiento


Java tiene los siguientes operadores de desplazamiento:
96

97

MDULO 2

Unidad 2.3 Sintaxis

^: XOR lgico a nivel de bit de los operandos (el resultado es

uno si alguno de los bits de los operandos es uno, pero no los dos a
la vez) op1 ^ op2

7.5 Operadores lgicos


Java tiene los siguientes operadores lgicos:
x

&: AND lgico a nivel de bit de los operandos (el resultado es

uno si los bits de ambos operandos son uno) op1 & op2. Cuidado
con no confundir con el operador lgico &&

~: complemento a nivel de bit del operando (cambia los ceros

por uno y viceversa) ~op1

7.6 Operadores de asignacin


Java tiene los siguientes operadores de asignacin:
x

= : guarda el valor del segundo operando en el primero op1 =

op2

x
|: OR lgico a nivel de bit de los operandos (el resultado es

uno si alguno de los bits de los operandos es uno) op1 | op2. Cuidado con no confundir con el operador lgico ||

+= : guarda la suma de los dos operandos en el primero op1

+= op2
x

-= : guarda la resta de los dos operandos en el primero op1 -

= op2

98

99

MDULO 2

Unidad 2.3 Sintaxis

*= : guarda la multiplicacin de los dos operandos en el pri-

mero op1 *= op2


x

Bifurcaciones: if-then-else y switch-case.

Gestin de excepciones: try-catch-finally y throw. Las veremos

con ms detalle en la Unidad 3.5 Manejo de excepciones.


/=, %=, &=, |=, ^=, <<=, >>=, >>>=: Similar al anterior,

para cada uno de los operadores indicados.

7.7 Otros operadores


Existen otros operadores en Java como son:
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 cdigo
mientras que la condicin del while sea cumpla (es decir la evaluacin de la

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

condicin sea true o verdadera).

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


x

[] : utilizado para declarar, crear y acceder a arrays (se vern

en la Unidad 3.1).
x

. : utilizado para acceder a los atributos y mtodos de los ob-

jetos (se vern en la Unidad 2.4).


x

(parmetros) : utilizado para pasar parmetros a un mtodo.

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

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

dad 2.4).
x

instanceof : utilizado para chequear si el primer operando es

una instancia del tipo indicado en el segundo operando.

while(expresin)
{
sentencias;
}
La sentencia do-while es parecida a la sentencia while pero asegura que como
mnimo el bloque de cdigo se ejecuta una vez.

do
{
sentencias;
}
while(expresin);

8.2 Sentencia for


La sentencia for facilita la ejecucin de un bloque de cdigo un nmero determinado de veces, mientras la evaluacin de la expresin de terminacin se
cumpla o sea true.

8. Sentencias de control de flujo

for(inicializacin; terminacin; incremento)


{
sentencias;
}

Sin las sentencias de control de flujo, el cdigo Java se ejecutara linealmente desde la primera lnea 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 inicializacin 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

MDULO 2

Unidad 2.3 Sintaxis

public void listar(int[] param)


{
int i = 0;
for(int j=0; j<param.length; j++)
i = param[j];
System.out.println(i);
}

8.4 Sentencia ifthen-else


La sentencia if-then-else permite elegir qu bloque de cdigo ejecutar entre dos
posibilidades dependiendo de la evaluacin de la expresin. Si se cumple (true)
ejecuta el primer bloque o bloque del if. Sino se cumple se ejecuta el bloque del
else.
La sintaxis del if sin else sera la siguiente:

if(expresin)
{
sentencias;
}
La sentencia if-then-else sera

8.3 Sentencia for/in


Esta nueva sentencia que aparece en el Java SE 5.0 nos facilita la iteracin por
los elementos de cualquier tipo de coleccin: arrays, listas, etc

for(inicializacin: coleccin)
{
sentencias;
}

Nota: Se usa : en vez de ;.

Las variables definidas en la sentencia de inicializacin son locales al bloque. Por


tanto dejan de existir una vez se haya terminado el bucle.
x

Ejemplo: se muestra un ejemplo de la sentencia de control for/in


public void listar(int[] param)
{
for(int i: param)
System.out.println(i);
}

Bsicamente, se trata de una simplificacin a la hora de codificar. Es decir, al final, el compilador convierte el cdigo en una sentencia for convencional como la
siguiente:
102

if(expresin)
{
sentencias;
}
else
{
sentencias;
}
Las sentencias if pueden estar concatenadas. Su sintaxis sera:

if(expresin)
{
sentencias;
}
else if (expresin2)
{
sentencias;
}else
{
sentencias;
}
x

Ejemplo: se muestra un ejemplo de la sentencia de control if anida-

das

103

MDULO 2

Unidad 2.3 Sintaxis

}
public void evaluar(int param)
{
if (param < 5)
{
//ejecutamos algo
} else if (param >=5 && param < 10){
//ejecutamos algo
} else {
//ejecutamos algo
}
}

8.6 Sentencia de ruptura


Java proporciona las siguientes sentencias de ruptura de ejecucin:
x

break: sirve para detener la ejecucin tanto de los bucles co-

mo de la sentencia switch. Por tanto, salta a la siguiente lnea de cdigo despus del bucle o switch.

8.5 Sentencia switch

continue: sirve para detener la ejecucin del bloque de cdigo

de un bucle y volver a evaluar la condicin de este.


La sentencia switch es un caso particular de la sentencia if-then-else if-else.
Evala una expresin del tipo int o que pueda ser convertida a int de forma im-

plcita (como puede ser un char).

ver un valor en el caso de ser necesario).

return: sirve para finalizar la ejecucin de un mtodo (y devol-

As se evala la expresin intExpresin y va comparando cada uno de los case a


ver si cumple la condicin. En el caso de que la comparacin sea true, se ejecu-

Nota: Las guas de programacin estructurada prohiben el uso de estas senten-

tan las sentencias siguientes hasta que se encuentre la siguiente sentencia

cias o aconsejan un uso muy lmitado para facilitar la legibilidad y mantenimien-

break o llegue al final de la sentencia switch.

to del cdigo

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(intExpresin)
{
case intExpresin:
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

MDULO 2

Unidad 2.3 Sintaxis

while(x<10)
{
if(x>3)
{
System.out.println("Hola");
}
}
}
}
PRCTICA A: Identificar que sentencias son correctas y cules no (se irn utilizando las variables segn se va avanzando en el ejercicio):
1. int x = 34.5;
2. boolean boo = x;
3. int g = 17;
4. int y = g;
5. y = y + 10;
6. short s;
7. s = y;
8. byte b = 3;
9. byte v = b;
10. short n = 12;
11. v = n;
12. byte k = 128;
13. int p = 3 * g + y;

Solucin:
1. int x = 34.5; -> int x = (int)34.5; // Posible con downcasting
2. boolean boo = x; -> No hay solucin
3. int g = 17;
4. int y = g;
5. y = y + 10;
6. short s;
7. s = y; -> s = (short)y; // posible con downcasting
8. byte b = 3;
9. byte v = b;
10. short n = 12;
11. v = n; -> v = (byte)n; // posible con downcasting
12. byte k = 128; -> byte k = (byte)128; // posible con downcasting
13. int p = 3 * g + y;

PRCTICA B: Identificar si este cdigo compila bien. Si no compila solucionarlo. Si


compila decir cul sera la salida.
public class Temp
{
public static void main(String[] args)
{
int x = 1;
106

Solucin:
El cdigo compila bien. Pero entra en un bucle infinito. Habra que modificarlo con
la lnea roja y saldra la palabra Hola siete veces por pantalla.
public class Temp
{
public static void main(String[] args)
{
int x = 1;
while(x<10)
{
x = x + 1;
if(x>3)
{
System.out.println("Hola");
}
}
}
}

PRCTICA C: Identificar si este cdigo compila bien. Si no compila solucionarlo.


Si compila decir cul sera la salida.
public class Temp
{
public static void main(String[] args)
{
int x = 5;
while(x>1)
{
x = x - 1;
if(x<3)
{
System.out.println("Hola");
}
}
}
}
Solucin:
Compila y saldra la palabra Hola dos veces por pantalla.

107

MDULO 2

Unidad 2.3 Sintaxis

PRCTICA D: Al siguiente programa Java le falta un trozo de cdigo


public class Temp
{
public static void main(String[] args)
{
int x = 0;
int y = 0;
while(x<5)
{
//TROZO DE CODIGO A SUSTITUIR
System.out.print(x + + y + );
x = x + 1;
}
}
}
Seleccionar para cada trozo de cdigo de la izquierda, la salida por pantalla al
ejecutar el programa anterior con ese trozo de cdigo

PRCTICA E: Desarrollar un programa Java que muestre por pantalla los nmeros
primos del 1 al 1000 y todos los aos bisiestos entre el ao 2000 y el 3000.
Vamos a realizar la prctica con el con el JDK de Sun.
En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS
y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar
las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le
aadimos %PATH%.

Solucin

108

109

MDULO 2

Unidad 2.3 Sintaxis

PATH%.

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 aadir el . (punto) y
siempre ejecutar las herramientas en el directorio donde se encuentre el cdigo, o
aadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para
respetar el valor que ya tuviese la variable CLASSPATH le aadimos %CLASS-

110

Ahora arrancamos un editor de texto (por ejemplo Notepad) para escribir el cdigo
fuente de nuestro programa que guardaremos en el fichero PracticaE.java; el
nombre del fichero debe ser exactamente igual (incluyendo maysculas y
minsculas) al de la clase Java que vamos a desarrollar.

Y aceptamos la creacin de un fichero nuevo.

111

MDULO 2

Unidad 2.3 Sintaxis

Compilamos el programa Java con el compilador javac. Al compilador hay que


darle el nombre del fichero incluyendo su extensin.

Escribimos el cdigo y salvamos los cambios. Cerramos el Notepad.


En la Unidad 2.4 veremos el concepto de clase y mtodo main. Mientras tanto,
nuestro cdigo estar incluido entre las lnea de cdigo
public class PracticaE
{
public static void main(String[] args)
{
}
}

Si no sale ningn mensaje significa que todo ha ido bien y que ha creado el bytecode, es decir, PracticaE.class

Por ltimo, ejecutamos el programa Java con la JVM java. A la JVM hay que darle
el nombre del fichero del bytecode sin la extensin.

112

113

MDULO 2

Unidad 2.3 Sintaxis

Ahora realizaremos la misma practica con Eclipse


Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe
Seleccionar la ubicacin del workspace (o rea de trabajo).

Cerrar la ventana de bienvenida si aparece (esta ventana aparece la primera vez


que se arranca Eclipse).

114

115

MDULO 2

Unidad 2.3 Sintaxis

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

Crear un proyecto nuevo de nombre PracticaE

Darle el nombre y seleccionar Finish.

Crear una clase Java nueva llamada PracticaE con el mtodo main.

116

117

MDULO 2

Unidad 2.3 Sintaxis

Por defecto, en eclipse, al salvar los cambios realizados en un fichero, se realiza la


compilacin de las clases que estn en el worskpace.
En el caso de producirse algn error de compilacin, se pueden ver en la vista Problems
Seleccionando la clase Java, con el botn derecho del ratn ejecutarla como Java
Application

Seleccionar Finish
Escribir el cdigo dentro de la clase y salvar con Ctrl + S o File -> Save

118

119

MDULO 2

Unidad 2.3 Sintaxis

En esta unidad hemos visto la sintaxis del cdigo Java, aprendiendo a utilizar comentarios, delimitar una sentencia Java con el ; y el uso de los espacios en
blanco.

Se han definido los Identificadores, las Keywords, las Variables y los mbitos
donde se pueden utilizar:
Atributos
Parmetros de mtodo.
Variables locales
Variables de bloque
Se han visto los distintos Tipos de datos:
x

Y veremos como se abre una consola con el resultado.

tipos primitivos:

Lgico: boolean
Carcter: char.
Nmeros enteros: byte, short, int y long.
Nmeros reales: double y float.
x

tipos complejos o clases: viendo el tipo especial enum

Se han visto adems los distintos tipos de Operadores:


Aritmticos
Relacionales
Condicionales
De desplazamiento
Lgicos
De asignacin.
Otros
Por ltimo se han determinado los distintos tipos de Sentencias de control de flujo,
que permiten ejecutar el cdigo de una manera no secuencial:
Bucles: while, do-while, for y for/in
Bifurcaciones: if-then-else y switch-case
Gestin de excepciones: try-catch-finally y throw
De ruptura: break, continue, label: y return.

120

MDULO B

Clases, objetos, herencia y


polimorfismo
Tema 2.4

ndice de la unidad:

1. Clases
2. Objetos
3. Relacin de herencia
4. Polimorfismo

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

En esta unidad veremos los cuatro paradigmas bsicos en los que se apoya los lenguajes orientados a objetos y por tanto el lenguaje de programacin Java.

1. Clases
Una clase representa la abstraccin de las operaciones y los datos (o atributos y
mtodos) comunes a un conjunto de objetos, en relacin a nuestro mundo real.
La implementacin de una clase Java debe ir en un fichero fsico en formato texto,
con la extensin *.java y nombre idntico a la clase implementada.
x

Ejemplo: La clase MiClase debe ir en un fichero: MiClase.java

La declaracin de una clase Java se realiza mediante la keyword: class seguida de


su nombre.
La keyword siempre va precedida por un modificador de acceso: public, protected,
private o default (nada) que ya explicaremos ms adelante.
La implementacin de la clase ir contenida en un bloque { } justo despus de la
declaracin. La sintaxis de la declaracin de una clase es:
modificador_acceso class nombre_clase
{
}
x

Ejemplo: public class MiClase


{
}

1. 1 Atributos y mtodos
La implementacin de una clase consiste en una serie de:
x

Atributos o datos.

Mtodos u operaciones.
125

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

La sintaxis de la declaracin de un atributo es la siguiente:


modificador_acceso tipo nombre; // sin inicializacin
modificador_acceso tipo nombre = valor_inicial;
x

Ejemplo: private boolean sw = true;

Solo puede usarse una vez por mtodo.

Siempre debe ser el ltimo parmetro de todos en la defini-

cin.
x

Ejemplo:
public int metodo(String param1, int param2, int params)
{
}
// en este ejemplo, siempre se recibir param1 y param2, mientras
que params ser una array de un tamao indeterminado hasta su
ejecucin.

private int i; // sin inicializar. Su valor por defecto es 0

La sintaxis de la declaracin de un mtodo es la siguiente:


modificador_acceso tipo_retorno nombre([tipo parametro,..])
{
}

1. 2 Constructores
La implementacin del mtodo ir contenida en un bloque { } justo despus
Existe un tipo de mtodo especial en Java llamado constructor.

de la declaracin.
x

Se utiliza para la construccin (instanciacin) de objetos (o instancias) a partir

Ejemplo:

de esa clase.
public int suma(int param1, int param2)

En su implementacin se suele dar valores a los atributos para ese objeto para

{
return param1 + param2;

asegurar que los atributos estn inicializados.

Su declaracin es idntica a la de los mtodos convencionales con dos salveJava SE 5.0 aade una novedad a la definicin de un mtodo mediante la ca-

dades:

racterstica: varargs.
Se permite definir un nmero indefinido de parmetros del mismo tipo mediante: ... Lo que recibimos es un array del tipo definido.
x

Ejemplo:
public int suma(int params)
{
int acum = 0;
for(int num: params) { // He usado tambin el nuevo for/in
acum = acum + num;
}
return acum;
}

Hay que tener en cuenta que podemos recibir, cero, uno o varios valores en

No tienen tipo de retorno.

Se tiene que llamar igual que la clase.

La sintaxis de la declaracin de un constructor es la siguiente:


modificador_acceso nombre([tipo parametro,..])
{
}
x

Ejemplo:
public MiClase(int param1, boolean param2)
{
}

dicho parmetro y que tiene las siguientes restricciones:


126

127

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Si nuestra clase no tiene constructores, el compilador aade por defecto uno


sin parmetros; pero si hemos declarado alguno, el compilador no aade nada.

1. 3 Sobrecarga de mtodos
Se dice que un mtodo est sobrecargado cuando existen dos mtodos con el
mismo nombre y tipo de retorno pero con parmetros distintos.
De esta manera podemos tener en una clase varios constructores.
x

Ejemplo:

El nombre de las clases comenzar con maysculas

Ejemplo: MiClase, String, Circulo, Cuenta, CuentaCorriente

El nombre de los atributos comenzar con minsculas

Ejemplo: contador, sw, i, segundoContador

El nombre de los mtodos comenzar con minsculas (a ex-

cepcin de los constructores)


x

Ejemplo: ingresar, miMetodo, sumar

Ejemplo: a continuacin se muestra un ejemplo de una clase

completa, con sus mtodos y atributos

public MiClase()
{
}
public MiClase(int param1, boolean param2)
{
}

Java SE 5.0 aade una novedad al respecto. Se permite la sobrecarga de mtodos cambiando tambin el tipo de retorno, pero siempre que:
x

El mtodo que se est sobrecargando sea de una clase padre

(de la que heredamos directa o indirectamente).


x

El nuevo tipo de retorno sea hijo del tipo de retorno del mto-

do original (es decir, que herede de l directa o indirectamente).


Por tanto, no es vlido para tipos primitivos.

1. 4 Convenciones en Java

Aunque no est obligado por la sintaxis, existen una serie de convenciones


respecto a en la nomenclatura de clases, mtodos y atributos, que todo programador de Java suele seguir para hacer mas legible el cdigo.

128

129

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Se llama a un constructor de la clase de la que queremos ins-

tanciar.
La sintaxis de la inicializacin sera la siguiente:
tipo identificador = new tipo([parametro,]);
x

Ejemplo: Cuenta miCuenta = new Cuenta(1200.75);

2.1 Variables primitivas versus variables complejas


Como vimos en la Unidad 2.3 Sintaxis, una variable de tipo primitivo contiene
el

dato

directamen-

te:

2. Objetos
Los objetos en Java no son mas que variables de tipo complejo, frente a las de tipo
Mientras que una variable de tipo complejo contiene una referencia (puntero)

primitivo.

a la zona de memoria donde est el objeto:


El tipo de un objeto es la clase de la que se ha instanciado o creado.
La declaracin de un objeto es idntica a la declaracin de una variable de tipo primitivo:
tipo identificador;
x

Ejemplo: Cuenta miCuenta;

El valor por defecto de un objeto sin inicializar es: null.

Ejemplo:

La inicializacin de un objeto si que es algo distinta a la inicializacin de las variables de tipo primitivo:
x
130

Se utiliza el operador new.


131

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Ejemplo: miCuenta.reintegro(13.7);

La posibilidad de acceso a un atributo o a un mtodo de un objeto depender


del modificador de acceso que exista en su definicin.
x

Ejemplo: partiendo de la siguiente definicin de la clase cuenta

2.2 Manejo de objetos


El trabajo con un objeto consiste en acceder:
x

A sus atributos.

A sus mtodos.

Podemos tener el siguiente cdigo que utiliza la clase Cuenta:

En ambos casos utilizaremos el operador . (punto).


La sintaxis para acceder a un atributo de un objeto es la siguiente:
objeto.atributo
x

Ejemplo: miCuenta.saldo = 0;

La sintaxis para acceder a un mtodo (lo que en Orientacin a Objetos se denominaba mensaje) es la siguiente:
objeto.metodo([parametro,..])
132

133

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

El parmetro args es un array (ver Unidad 3.1) donde permite pasarle argumentos al programa Java para su ejecucin, en caso de necesitarlos.
Si las clases representan entidades que participan en la resolucin de un problema. En qu entidad tiene sentido incluir el mtodo main?. En ninguna. Por
eso crearemos siempre una clase a parte (de ahi el denominarla truco), que
solo tenga el mtodo main. Debido a que no est relacionado con ninguna clase en concreto, no se necesita la creacin de ningn objeto para llamarla.

2.4 Destructores y Garbage Collector


Los destructores son unos mtodos encargados de eliminar los objetos de
memoria, aunque en Java no existe este tipo de mtodos (si existen en otros
lenguajes de programacin como C++).
En Java lo que existe es un proceso automtico que se ejecuta en la JVM a la
vez que nuestra aplicacin y que se encarga de buscar todos aquellos objetos
en memoria no utilizados y limpiarlos. Este proceso se llama Garbage Collector.
Las llamadas a mtodos se pueden encadenar para evitar tener que crear variables intermedias entre distintas ejecucines de mtodos:

Cmo sabe el Garbage Collector que un objeto ya no est siendo utilizado


por la aplicacin y que por tanto puede ser eliminado? Porque no est referen-

String s1 = new String(abc");


char c = s1.toUpperCase().charAt(0);
Equivaldra a:
String s1 = new String(abc");
String s2 = s1.toUpperCase();
char c = s2.charAt(0);

ciado por ninguna variable.


Existen tres motivos por los que una variable deja de referenciar a un objeto:
x

Se iguala a null. Deja de referenciar a un objeto.

Se iguala a otro objeto. Por lo que el objeto al que referencia-

ba puede ser eliminado.

2.3 El mtodo main y la clase truco


Existe un mtodo especial en Java llamado main cuya sintaxis es la siguiente:

Se termina su mbito. Por lo que la variable deja de tener va-

lidez.

public static void main(String[] args)


Es el mtodo donde comienza la ejecucin de un programa Java. Por lo tanto

Ejemplo: En cuanto pun es igualado a null, deja de referenciar al ob-

es el mtodo ejecutado cuando desde la JDK de Sun ejecutamos java Nom-

jeto creado va new. Pero ojo!, el objeto al que referenciaba pun no se pue-

breDeClase o desde Eclipse ejecutamos Run as Java Application.

de limpiar porque sigue referenciado por centro desde un atributo del objeto
referenciado

134

por

135

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

cir.

Una clase puede ser superclase y subclase al mismo tiempo.


Existen distintos tipos de herencia:

Simple. Solo puede heredar de una clase.

Mltiple (no soportada en Java)

Ejemplo:

3. Relacin de herencia
Se basa en la existencia de relaciones de generalizacin/especializacin entre clases.
Las clases se disponen en una jerarqua, donde una clase hereda los atributos y

La implementacin de la herencia se realiza mediante la keyword: extends. La sin-

mtodos de las clases superiores en la jerarqua. Es decir, definimos una especie de

taxis de la declaracin de la herencia es la siguiente:

interfaz (API) para un grupo de clases relacionados mediante la herencia.


Una clase puede tener sus propios atributos y mtodos adicionales a lo heredado.
Una clase puede modificar los atributos y mtodos heredados.

modificador_acceso class nom_clase extends nom_clase


{
}
x

public class MiClase extends OtraClase


{
}

Las clases por encima en la jerarqua a una clase dada, se denominan superclases
o clases padre.
Las clases por debajo en la jerarqua a una clase dada, se denominan subclases o
clases hijas.
136

Ejemplo:

Ejemplo:

137

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Si no lo especificamos en el cdigo, el compilador hace que

nuestra clase herede de la clase Object (raz de la jerarqua de clases


en Java).
x

Ejemplo:
public class MiClase extends Object
{
// Es redundante escribirlo puesto que el
// compilador lo har por nosotros.
}

Esto significa que nuestras clases siempre van a contar con los atributos y mtodos de la clase Object por lo que es importante conocerlos. Algunos de sus
mtodos ms utilizados son:
x

public boolean equals(Object o); //Compara dos objetos y dice

si son iguales.
x

public String toString(); //Devuelve la representacin literal de

un objeto.
x

public Class getClass(); //Devuelve la clase de la cual es ins-

tancia el objeto.
x

public int hashCode(); //Devuelve un identificador unvoco

despus de aplicarle un algoritmo hash.


x

public Object clone(); //Devuelve una copia del objeto.

public void finalize(); //Un mtodo llamado por el Garbage Co-

llector.
x

3.1 La clase Object

public void wait(); public void notify(); public void notifyAll();

//Tienen que ver con el manejo de threads.


En Java todas las clases heredan de otra clase:
x

Ejemplo:

Si lo especificamos en el cdigo con la keyword extends, nues-

tra clase heredar de la clase especificada.

138

139

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

3.2 Casting
El casting es una forma de realizar conversiones de tipos. Hay dos tipos de

3.3 Sobrescribir un mtodo

casting:
x

UpCasting: conversin de un tipo en otro superior en la jerar-

qua de clases. No hace falta especificarlo.


x

DownCasting: conversin de un tipo en otro inferior en la je-

rarqua de clases.

Sobrescribir un mtodo significa que una subclase reimplementa un mtodo


heredado.
Para sobrescribir un mtodo hay que respetar totalmente la declaracin del
mtodo:

Se especifica precediendo al objeto a convertir con el nuevo tipo entre parntesis.


x

Ejemplo:

El nombre ha de ser el mismo.

Los parmetros y tipo de retorno han de ser los mismos.

El modificador de acceso no puede ser ms restrictivo.

Al ejecutar un mtodo, se busca su implementacin de abajo hacia arriba en la


jerarqua de clases.
x

140

Ejemplo:

141

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

142

Ejemplo: de sobrescribir un mtodo

143

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

3.4 Sobrecargar versus Sobrescribir


Sobrecargar un mtodo es un concepto distinto a sobrescribir un mtodo.
La sobrecarga de un mtodo significa tener varias implementaciones del mismo mtodo con parmetros distintos:
x

El nombre ha de ser el mismo.

El tipo de retorno ha de ser el mismo.

Los parmetros tienen que ser distintos.

El modificador de acceso puede ser distinto.

Habr que tener muy en cuenta los parmetros que se envan y las conversiones por defecto para saber qu mtodo se ejecuta.
x

Ejemplo: Veremos la sobrecarga de un mtodo que recibe un float y un dou-

ble:
public void miMetodo(float param) { }
miObjeto.miMetodo(1.3); //llamar sin problemas al mtodo anterior
Sobrecargamos el mtodo para que reciba un double.
public void miMetodo(double param) { }
miObjeto.miMetodo(1.3); //ya no llama al mtodo con float.
Recordemos que un nmero real por defecto es double.
Para seguir llamando al mtodo con float debemos especificarlo implcitamente:
miObjeto.miMetodo(1.3F); o miObjeto.miMetodo((float)1.3);
x

Ejemplo:

3.5 El uso de la herencia


Debemos usar herencia cuando hay una clase deun tipo mas especfico que
una superclase. Es decir, se trata de una especializacin.
144

145

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Ejemplo: Lobo es mas especfico que Canino. Luego tiene sentido que Lobo

herede de Canino.

Debemos usar herencia cuando tengamos un comportamiento que se puede


reutilizar entre varias otras clases del mismo tipo genrico.
x

Ejemplo: Las clases Cuadrado, Circulo y Triangulo tiene que calcular su rea

y permetro luego tiene sentido poner esa funcionalidad en una clase genrica
como Figura.

No debemos usar herencia solo por el hecho de reutilizar cdigo. Nunca debemos romper las dos primeras reglas.
x

Ejemplo: Ejemplo de acceso a un constructor

Ejemplo: Ejemplo de acceso a un mtodo

Ejemplo: Podemos tener el comportamiento cerrar en Puerta. Pero aunque

necesitemos ese mismo comportamiento en Coche no vamos a hacer que Coche


herede de Puerta. En todo caso, coche tendr un atributo del tipo Puerta.

No debemos usar herencia cuando no se cumpla la regla: Es-un (Is-a).


x

Ejemplo: Refresco es una Bebida. La herencia puede tener sentido. Bebida

es un Refresco. ? No encaja luego la herencia no tiene sentido.

3.6 super y this


super y this son dos keywords de Java.
super es una referencia al objeto actual pero apuntando al padre. super se
utiliza para acceder desde un objeto a atributos y mtodos (incluyendo constructores) del padre.
Cuando el atributo o mtodo al que accedemos no ha sido sobrescrito en la
subclase, el uso de super es redundante. Los constructores de las subclases
incluyen una llamada a super() si no existe un super o un this.
x

146

Ejemplo: Ejemplo de acceso a un atributo.

147

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

this es una referencia al objeto actual.

4. Polimorfismo
this se utiliza para acceder desde un objeto a atributos y mtodos (incluyendo
constructores) del propio objeto.

Es otro de los paradigmas de la Orientacin a Objetos.

Existen dos ocasiones en las que su uso no es redundante:

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.

Acceso a un constructor desde otro constructor.

Acceso a un atributo desde un mtodo donde hay definida una

Esto significa que podemos referenciar un objeto de una subclase mediante una re-

variable local con el mismo nombre que el atributo.

148

Ejemplo: Ejemplo de acceso a un atributo

Ejemplo: Ejemplo de acceso a un constructor

ferencia declarada como una de sus superclases. Ver punto 3.2 Casting para las
conversiones de tipos.
x

Ejemplo: Object o = new String(Hola);

149

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Nota: Los arrays se vern mas en detalle en la Unidad 3.1

Ejemplo: Ejemplo de mtodo genrico.

Por tanto mediante el polimorfismo podemos asignar a una referencia de un tipo


superior en la jerarqua de herencia, una instancia de un tipo inferior (que herede).
Ahora bien, que la referencia sea de otro tipo no significa que los mtodos que se
ejecuten sean distintos. Siguen siendo los de la instancia.
Algunos usos habituales del polimorfismo en Java son:

Implementacin de colecciones genricas.

Implementacin de mtodos genricos.

Ejemplo: Ejemplo de coleccin genrica.

Con el polimorfismo podemos desarrollar cdigo que no tiene que ser modificado
por la introduccin en el programa de nuevas subclases o tipos debido a:
x
150

Cambio en las especificaciones.


151

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

x
x

Rediseo

Ejemplo: la clase Matematico seguir funcionando aunque desarrolle-

mos nuevas figuras como Cuadrado, Ameba, etc. siempre y cuando


hereden de la superclase Figura.
x

Ejemplo: Supongamos que necesitamos implementar una clase para

almacenar dos lobos en nuestro proyecto

Hablando con un compaero de otro proyecto, nos comenta que en su


proyecto necesita implementar una clas par almacenar dos Tringulos.
Le podramos pasar nuestra clase si la hubiramos hecho ms genrica. No heredaba en Java todo de la clase Object?
En Java encontraremos multitud de ejemplos que usen el Polimormismo con este fin.
Ahora nos diden que en el mismo proyecto tambin necesitamos almacenar dos gatos. Tenemos distintas alternativas:

Crear una clase nueva MiLista2

Aadir a MiLista dos atributos nuevos del topo Gato y otro mtodo
add() que reciba un Gato

Modificar MiLista para que maneje el tipo genrico Animal y as nos


valga tanto para Lobos como pata Gatos e incluso otros animales en
le futuro. Nos decidimos por este ltimo.

152

153

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

4.1 Clases abstractas


A menudo existen clases que sirven para definir un tipo genrico pero que no
tiene sentido instanciar (crear objetos de ella). Por ejemplo, puede tener sentido instanciar un Circulo pero a lo mejor no instanciar una Figura, porqu
qu figura es? cul es su rea? y su permetro?
Estas clases pueden estar siendo usadas simplemente para agrupar bajo un
mismo tipo a otras clases, o para contener cdigo reutilizable, o para forzar un
API a sus subclases..
La clases se definen como abstractas mediante la keyword: abstract. La sintaxis de la declaracin de una clase abstracta es la siguiente:
modificador_acceso abstract class nom_clase
{
}
x

Ejemplo:
public abstract class MiClase
{
}

4.2 Mtodos abstractos

Ejemplo:

Adems de clases abstractas, tambin podemos tener mtodos abstractos.


Una clase abstracta significaba que tena que ser heredada. No poda ser instanciada.
Un mtodo abstracto significa que tiene que ser sobrescrito. No est implementado.
Una clase con uno o varios mtodos abstractos tiene que ser declarada abstracta.
No obstante una clase abstracta no tiene porque tener mtodos abstractos.
Los mtodos se definen como abstractos mediante la keyword: abstract. La
sintaxis de la declaracin de una clase abstracta es la siguiente:
modif_acceso abstract tipo_retorno nombre([tipo param,]);
154

155

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Ejemplo: public abstract void miMetodo();

El objetivo de un mtodo abstracto es forzar una interfaz (API) pero no una


implementacin.
x

Ejemplo:

Qu ocurre si queremos reusar el diseo para un aplicativo de Tienda de


Mascotas? Una primera aproximacin sera aadir a la clase Animal todos los
mtodos especficos de una mascota como son jugar, vacunar.
Automticamente todas las mascotas tendrn los mtodos necesarios. Pero
tambin los tendrn las no mascotas. Y seguro que hay que retocar cada mas-

4.3 Ejemplo prctico de Polimorfismo


Partimos del diseo de animales visto anteriormente.

cota reescribiendo sus mtodos porque tengan alguna peculiaridad.


Modificamos la primera aproximacin definiendo los mtodos de las mascotas
en la clase Animal como abstractos de manera que cada mascota los implemente.

156

157

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Otra aproximacin sera introducir los nuevos mtodos solo en las mascotas.
As todas las mascotas heredan el interfaz e implementan su comportamiento

As ya no nos tenemos que preocupar de que haya clases que sin ser masco-

dependiendo de la mascota en concreto. Pero no solo el resto de animales

tas tengan mtodos de estas.

heredarn tambin el interfaz si no que tienen que implementarlo aunque sea


vaco.

Sin embargo esto implica otro tipo de problemas como que los programadores
de mascotas tendrn que ponerse de acuerdo en el interfaz de estas y siempre
llevarlo a raja tabla puesto que ahora no se hereda y el compilador no nos
ayuda con los posibles errores.
Otro inconveniente muy importante es que no tenemos posibilidad de usar el
polimorfismo con las mascotas.

158

159

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

La solucin que parece ptima, sera tener otra clase abstracta llamada Mascota con los mtodos abstractos de las mascotas. Y que todas las mascotas
heredasen de ella.

5. Interfaces

As, ya no nos tenemos que preocupar de que haya clases que sin ser masco-

Los interfaces en Java nos solucionan en parte la no existencia de la herencia mlti-

tas tengan mtodos de estas.

ple; habilitando as las posibilidades del polimorfismo en la herencia mltiple sin los
problemas que esta conlleva.

Todas las mascotas cumplirn forzosamente el API de las mascotas y el compilador nos ayudar a asegurarlo. Y tambin tendremos la posibilidad de usar

Los interfaces son un tipo de clase especial que no implementa ninguno de sus m-

el polimorfismo con las mascotas.

todos. Todos son abstractos. Por tanto no se pueden instanciar.

Pero eso significa que habr clases que heredarn de dos clases a la vez y en

La declaracin de un interface Java se realiza mediante la keyword: interface segui-

Java no existe la herencia mltiple.

do de su nombre. La sintaxis de la declaracin de un interface es la siguiente:


modificador_acceso interface nombre_interface
{
}
x

Ejemplo:
public interface MiInterface

160

161

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

{
}

Ejemplo:

Siguen siendo clases Java por lo que su cdigo fuente se guarda en un fichero texto
de extensin *.java y al compilarlo se generar un *.class
Los mtodos se definen como abstractos mediante la keyword: abstract. La sintaxis
de la declaracin de un mtodo abstracto es la siguiente:
modif_acceso abstract tipo_retorno nombre([tipo param,]);
x

Ejemplo: public abstract void miMetodo();

El objetivo de un mtodo abstracto es forzar una interfaz (API) pero no una implementacin.
De los interfaces tambin se hereda, aunque se suele utilizar ms el trmino implementa por la keyword utilizada. Se realiza mediante la keyword: implements.
La sintaxis de la declaracin de la herencia de un interface es la siguiente:
modif_acceso class nom_clase implements nom_interface[,nom_int.]
{
}
x

Un interface se trata como un tipo cualquiera. Por tanto, cuando hablamos de polimorfismo, significa que una instancia de una clase puede ser referenciada por un
tipo interface siempre y cuando esa clase o una de sus superclases implemente

Ejemplo:

dicho interface.
public class MiClase implements MiInterface
{
}

Ejemplo: Este sera el diseo final de la tienda de mascotas

Una clase puede heredar o implementar mltiples interfaces consiguiendo as la


herencia mltiple. Y tambin un interface puede heredar de otros interfaces
Una clase puede heredar de otra clase (como mximo de una) y a la vez heredar de
mltiples interfaces.
Un interface puede tambin definir constantes.
Si una clase que hereda de un interface, no implementa todos los mtodos de este,
deber ser definida como abstracta.

162

163

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Haremos una clase que no herede de nadie cuando la clase no

pase la prueba de Es-Un. Veremos por ejemplo, si un Circulo Es-Una


Figura (por lo que heredar de Figura), pero que Figura no es un Circulo, ni un Triangulo .... por lo que no heredar de nadie.
x

Haremos una subclase cuando necesitemos hacer una especia-

lizacin de la superclase mediante sobreescritura o aadiendo nuevos


mtodos.
x

Haremos una clase abstracta cuando queramos definir un gru-

po genrico de clases y adems tengamos algunos mtodos implementados que reutilizar. Tambin cuando no queramos que nadie
instancie dicha clase.
x

Haremos un interface cuando queramos definir un grupo gen-

rico de clases y no tengamos mtodos implementados que reutilizar.


O cuando nos veamos forzados por la falta de herencia mltiple en
Java.

5.1 Interface versus Clases abstractas


Las interfaces se diferencian de las clases abstractas principalmente en:
x

Un interface no puede implementar ningn mtodo.

Una clase puede implementar n interfaces pero solo una clase.

Un interface no forma parte de la jerarqua de clases. Clases

PRCTICA A: Identificar si hay algo mal en el siguiente cdigo:

dispares pueden implementar el mismo interface.


x

El objetivo de un mtodo abstracto es forzar una interfaz (API)

pero no una implementacin.

5.2 Clases, Subclases, Clases abstractas e Interfaces


A continuacin se vern ciertas directrices de cuando utilizar se pueden utilizar
las Clases, Subclases, Clases abstractas e Interfaces:

164

165

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Solucin:
Estaba mal. No habamos creado el objeto r.

PRCTICA C: Identificar si hay algo mal en este cdigo,suponiendo que la clase


Rectangulo existe.

PRCTICA B: Identificar si hay algo mal en este cdigo:

Solucin:
Solucin:

Estaba mal. El objeto miRect no est inicializado, por tanto vale null. Con null no
podemos hablarnos.

Estaba mal. Se estaba llamando a un mtodo inexistente.

166

167

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Desarrollar una clase llamada Punto que:


PRCTICA D: Basndonos en el siguiente ejemplo

x
x
x
x
x

Tenga dos atributos private de tipo double.


Tenga un constructor con dos parmetros de tipo double que inicialice los
dos atributos.
Tenga un constructor por defecto (sin parmetros) que inicialice los dos atributos al valor que se quiera.
Tenga un getter para cada uno de los atributos.
Tenga un mtodo calcularDistanciaDesde que recibe un parmetro de tipo
Punto y que devuelve un double.

Desarrollar una clase llamada Circulo que:


x
x

x
x
x
x

x
x

Contesta a las siguientes preguntas:


1.
2.
3.
4.
5.
6.
7.

Cuntos atributos tiene la clase Cirujano?:__.


Cuntos atributos tiene la clase MedicoDeCabecera?:__.
Cuntos mtodos tiene la clase Medico?:__.
Cuntos mtodos tiene la clase Cirujano?:__.
Cuntos mtodos tiene la clase MedicoDeCabecera?:__.
Puede un MedicoDeCabecera tratar pacientes?:___.
Puede un MedicoDeCabecera hacer incisiones?:___.

Solucin:
1.
2.
3.
4.
5.
6.
7.

Cuntos atributos tiene la clase Cirujano?:_1_.


Cuntos atributos tiene la clase MedicoDeCabecera?:_2_.
Cuntos mtodos tiene la clase Medico?:_1_.
Cuntos mtodos tiene la clase Cirujano?:_2_.
Cuntos mtodos tiene la clase MedicoDeCabecera?:_2_.
Puede un MedicoDeCabecera tratar pacientes?:_SI__.
Puede un MedicoDeCabecera hacer incisiones?:_NO__.

Desarrollar una clase llamada Triangulo que:


x
x
x
x
x
x

168

Tenga tres atributos private de tipo Punto.


Tenga un constructor con tres parmetros de tipo Punto que inicialice los dos
atributos.
Tenga un constructor por defecto (sin parmetros) que inicialice los tres
atributos al valor que se quiera.
Tenga un constructor con seis parmetros de tipo double que inicialice los
tres atributos.
Tenga un getter para cada uno de los atributos.
Tenga un mtodo calcularDistanciaDesde que recibe un parmetro de tipo
Punto y que devuelve un double.
Tenga un mtodo calcularArea que no recibe ningn parmetro y devuelve
un double.
Tenga un mtodo calcularPerimetro que no recibe ningn parmetro y devuelve un double.

Desarrollar una clase llamada Practica5a que en su mtodo main:


x
x
x

PRCTICA E: Desarrollar el siguiente programa tanto en la JDK de Sun como en


Eclipse. Hay que tener en cuenta que hay que desarrollar los siguientes elementos:

Tenga dos atributos private de tipo Punto y double.


Tenga un constructor con dos parmetros de tipo Punto y double que inicialice los dos atributos.
Tenga un constructor por defecto (sin parmetros) que inicialice los dos atributos al valor que se quiera.
Tenga un constructor con tres parmetros de tipo double que inicialice los
dos atributos.
Tenga un getter para cada uno de los atributos.
Tenga un mtodo calcularDistanciaDesde que recibe un parmetro de tipo
Punto y que devuelve un double.
Tenga un mtodo calcularArea que no recibe ningn parmetro y devuelve
un double.
Tenga un mtodo calcularPerimetro que no recibe ningn parmetro y devuelve un double.

Cree e inicialice dos objetos de la clase Punto y muestre la distancia entre


ambos.
Cree un objeto de la clase Circulo y muestre su rea, permetro y distancia a
uno de los dos puntos creados al comienzo.
Cree un objeto de la clase Triangulo y muestre su rea, permetro y distancia a un nuevo punto.

Nota 1: No seremos rigurosos con las matemticas y supondremos que los tringulos siempre son rectngulos.
169

MDULO 2

Nota 2: Para calcular la raz cuadrada de un nmero usaremos Math.sqrt(?) siendo


? el nmero.

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

aadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para


respetar el valor que ya tuviese la variable CLASSPATH le aadimos %CLASSPATH%

Solucin con la JDK De Sun


En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS
y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar
las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le
aadimos %PATH%.

Ahora arrancamos un editor de texto (por ejemplo Notepad) para escribir el cdigo
fuente de cada uno de nuestras clases java; el nombre del fichero debe ser
exactamente igual (incluyendo maysculas y minsculas) al de la clase Java que
vamos a desarrollar.
Empezamos con Punto.java

Creamos un directorio de trabajo donde guardar el programa Java.

Y aceptamos la creacin de un fichero nuevo.

Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan
encontrar nuestras clases Java. Tenemos dos opciones, o aadir el . (punto) y
siempre ejecutar las herramientas en el directorio donde se encuentre el cdigo, o
170

171

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Escribimos el cdigo y salvamos los cambios. Cerramos el Notepad.

Todava no podemos ejecutar ningn programa Java, porque no tenemos un mtodo main al que llamar y nos faltan por desarrollar ms clases.

Los atributos les aplicamos el modificador de acceso private (los veremos en detalle
en la Unidad 2.5)

Creamos con el notepad las siguientes clases y las compilamos al igual que hemos
hecho con el Punto.java : Circulo.java y Triangulo.java

Compilamos el programa Java con el compilador javac. Al compilador hay que


darle el nombre del fichero incluyendo su extensin.
172

173

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Por ltimo crearemos nuestra clase truco con el mtodo main que guardaremos
en el fichero PracticaE.java

174

175

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Ahora si que podemos ejecutar el programa llamando a la clase PracticaE mediante


el ejecutable java.
La salida por consola queda como sigue:

Salvamos los cambios y compilamos la clase con javac. Debemos de tener los bytecode de todas las clases

Ahora realizaremos la misma practica con Eclipse


Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe
Seleccionar la ubicacin del workspace (o rea de trabajo).

176

177

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Crear un proyecto nuevo de nombre PracticaE


Aparecer la pantalla para empezar a trabajar.

Darle el nombre y seleccionar Finish.

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

178

179

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Seleccionar Finish
Escribir el cdigo dentro del bloque de la clase y salvar con Ctrl + S o File -> Save

Crear una clase Java nueva llamada Punto sin el mtodo main

180

181

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Continuacin de la implementacin de la clase Triangulo

Hacer lo mismo para las clases Circulo y Triangulo.

Crear una clase Java nueva llamada PracticaE con el mtodo main.

182

183

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

Seleccionando la clase Java PracticaE, con el botn derecho del ratn ejecutarla
como Java Application

Y veremos como se abre una consola con el resultado.

184

185

MDULO 2

Unidad 2.4 Clases Objetos Herencia y Polimorfismo

En esta unidad hemos visto los cuatro paradigmas bsicos en los que se apoya los
lenguajes orientados a objetos y por tanto el lenguaje de programacin Java.
x

Clases, donde su implementacin consta normalmente de una serie de


atributos y mtodos.
-

Existen ciertos mtodos especiales llamados Cons-

Se pueden sobrecargar los mtodos, teniendo el

tructores, que permiten crear objetos.

mismo nombre de mtodo y distintos parmetros.


x

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

El mtodo main se utiliza directamente sin la creacin de un objeto, para empezar la ejecucin de un
programa Java.

La eliminacin de los objetos en memoria se utiliza


via el Garbage Collector.

La relacin de herencia, se basa en la existencia de relaciones de generalizacin/especializacin entre clases.

Todas las clases por defecto heredan de la clase

Se puede generalizar o especializar entre las su-

Se pueden reimplementar mtodos heredados me-

Object

perclases y subclases mediante los casting.

diante la sobrescritura de mtodos.


x

La relacin de polimorfismo, consiste en que una vez se ha definido


una superclase para un grupo de subclases, cualquier instancia de esas
subclases puede ser usada en el lugar de la superclase.
-

Utilizacin de clases abstractas, o genricas que

Si se utilizan mtodos abstractos, la clase debe

no pueden ser instanciadas.

ser identificada como abstracta, y alguna de las


subclases tiene que implementar dichos mtodos.
x

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

186

PA-

MDULO B

Otros conceptos
Tema 2.5

ndice de la unidad:

1. Paquetes
2. Modificadores de acceso
3. Mtodos estticos
4. final
5. Paso por valor o por referencia
6. Cosas que ocurren por defecto
7. Instanceof

Unidad 2.5 Otros conceptos

En las unidades anteriores se ha visto la sintaxis de Java, y paradigmas bsicos de


la programacin orientada a objetos. Existen otros conceptos, a nivel organizativo
de las clases y de acceso de las clases y objetos que son los que veremos en esta
Unidad.

1. Paquetes
Los paquetes Java son una caracterstica ms del lenguaje que nos permite
organizar el cdigo en grupos.
Adicionalmente, ayudan a evitar colisiones en los nombres de las clases. De manera
que en un programa que va a usar un framework (conjunto de clases con un propsito en concreto) de un tercero, tenga un 99% de seguridad de que no tiene ninguna clase con el mismo nombre, que las del framework.
Para especificar el paquete al que pertenece una clase se utiliza la keyword: package. La sintaxis de la declaracin de un paquete es la siguiente:
package nombre_del_paquete;
x

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

El nombre de una clase no se limita solamente al identificador utilizado en la definicin, sino a la suma del paquete al que pertenece ms el del identificador: Nombre
de paquete + Identificador de la Clase
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 raz sin nombre o nada, pero no est recomendado su uso). En el caso de especificarlo, la sentencia package tiene que ser la
primera lnea del fichero con el cdigo fuente de la clase.

191

MDULO 2

Unidad 2.5 Otros conceptos

Existe una convencin aceptada por todos los desarrolladores en cuanto a la no-

por

menclatura de los paquetes Java:

es.java.aula.mentor.figuras.Circulo

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

mediante el punto)

Se suele utilizar el nombre de dominio de la empresa,

Utilizar su

organizacin o institucin invertido para intentar asegurar nombres

unvocos 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 inclusin de cdigo como ocurre en un #include de C++.


Simplemente son vas de acceso para buscar el cdigo. El cdigo se va cargando

Para poder utilizar una clase en nuestro cdigo tenemos que escribir su nombre

segn se necesita.

completo cada vez que la utilicemos: paquete + clase. Para mejorar la legibilidad
del cdigo, existe otro mecanismo para facilitar la codificacin y facilitar la vida al

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 declaracin de

Java equivale a un fichero texto de extensin *.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 definicin de la clase.


Las clases importadas de esta manera pueden ser referenciadas en el cdigo directamente por su nombre de clase sin necesidad de escribir el paquete al que pertenecen.
Un import genrico (es decir, con el *) importa solo las clases de ese paquete, pero
no de los subpaquetes.
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 estn en nomenclatura

192

193

MDULO 2

Unidad 2.5 Otros conceptos

Desde

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

ejecutamos:

javac Circulo.java
Para ejecutar una clase solo tenemos una opcin 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 tambin sera
suficiente)
A continuacin mostramos distintos ejemplos de utilizacin de clases teniendo en
cuenta los paquetes a los que pertenecen:
x

Ejemplo: Ambas clases estn en el paquete por defecto y por tanto se en-

cuentran.

Ejemplo: Las clases estn en paquetes distintos y se utilizan las clases con el

nombre completo

Ejemplo: Las clases estn en paquetes distintos y no se utilizan las clases

con el nombre completo ni con la sentencia import

194

195

MDULO 2

Unidad 2.5 Otros conceptos

Ejemplo: Las clases estn en paquetes distintos y se utilizan las clases con la

sentencia import

Ejemplo: Las clases estn en el mismo paquete

Ejemplo: Las clases estn en paquetes distintos y se utilizan las clases con la

sentencia import genrica

1. 1 Caractersticas de los Paquetes Java


196

197

MDULO 2

Unidad 2.5 Otros conceptos

Las clases bsicas System, String, Math, etc pertenecen al paquete


java.lang.*. (las veremos con ms detalle en la Unidad 2.6).

Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que estn en

paquetes distintos. Utilizamos la sentencia import genrico y en la clase conflictiva utilizamos el nombre completo.

Cmo compilaban todas nuestras prcticas si no conocamos los paquetes


Java (y por tanto la keyword import)? La respuestas es porque el compilador,
por defecto, siempre aade la siguiente lnea a nuestro cdigo:
import java.lang.*;
Aunque no es frecuente, es posible que provoquemos ambigedades en el uso
de los imports, y por tanto errores de compilacin.
Qu ocurre al usar una clase cuyo nombre existe a la vez en dos paquetes
que hemos importado? Cul de las dos clases es la que se debe utilizar?
En esos casos, hay que importar o referirse a la clase conflictiva mediante su
identificador completo: paquete + clase.
x

Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que estn en

paquetes distintos. Utilizamos solamente la sentencia import genrico

Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que estn en

paquetes distintos. Utilizamos la sentencia import genrico e import especfico.

198

199

MDULO 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 explcita un paquete
determinado en su cdigo.
Desde la versin 1.4.x, el compilador no permite importar desde una clase que
pertenece a un paquete explcito, una clase que pertenece al paquete por
defecto.
Esto no tendra que ser un problema en la mayora de los casos porque
siempre deberamos ubicar las clase en paquetes Java de forma explcita.
Cuando consultamos el API, por ejemplo, via online en la documentacin de
SUN http://java.sun.com/javase/6/docs/api/index.html, podemos apreciar la
categorizacin de los paquetes y las clases que pertenecen a cada uno de
ellos.

Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que estn en

paquetes distintos. Utilizamos la sentencia import especfico.

2. Modificadores de acceso
Hasta ahora hemos visto que podemos utilizar cualquier clase, mtodo y atributo
desde cualquier punto de nuestro cdigo sin ningn tipo de problema. Pero el
lenguaje de programacin Java, nos permite poder delimitar quin o desde donde
se puede acceder a una clase, a un mtodo o a un atributo.
Existen cuatro tipos de modificadores de acceso y por tanto, cuatro keywords. Las
hemos ordenados de menor a mayor restriccin.

200

201

MDULO 2

Unidad 2.5 Otros conceptos

public -> Pblico

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:

Ejemplo: Ejemplo de modificadores de acceso con mtodos.

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

Atributos: se permiten cualquiera de los cuatro.

Mtodos: se permiten cualquiera de los cuatro.

Ejemplo: Ejemplo de modificadores de acceso con atributos.

203

MDULO 2

Unidad 2.5 Otros conceptos

clases

La respuesta es no. Y para ello contamos en Java con los mtodos estticos. Estn
asociados a una clase solamente desde un punto de vista organizativo.
Para definir un mtodo esttico utilizamos la keyword: static. La sintaxis de la
declaracin es la siguiente:
modifi_acceso static tipo_retorno nombre([tipo parametro,..])
{
}
x

Ejemplo:
public static void miMetodo()
{
}

Para ejecutar por tanto un mtodo esttico no hace falta instanciar un objeto de la
clase. Se puede ejecutar el mtodo directamente sobre la clase.
x

Ejemplo: int a = Math.min(10,17);


Mientras que los mtodos convencionales requieren de un objeto:
String s = new String(Hola);
int a = s.indexOf(a);
No se puede realizar la siguiente llamada
int a = String.indexOf(a);

3. Mtodos estticos
Existen casos en los que nos encontramos con clases cuyos mtodos no dependen
en absoluto de los atributo de la clase, y en todo caso de los parmetros de los

Una

clase

puede

perfectamente

mezclar

mtodos

estticos

con

mtodos

convencionales. Un ejemplo clsico es el mtodo main:

mtodos. Por ejemplo, la clase java.lang.Math:


x

public static void main(String[] args) { }


Su mtodo round recibe un nmero decimal y lo devuelve

redondeado.
x
x

Su mtodo sqrt recibe un nmero y devuelve su raiz cuadrada.


Su mtodo min recibe dos nmeros y devuelve el menor.

Son mtodos que parece no pertenecer a una entidad concreta. Son genricos,
globales, independientes de cualquier estado del objeto.
Tiene sentido instanciar un objeto para ejecutar algo que no depende de nada de
dicho objeto?

204

Hay ciertas reglas que hay que tener en cuenta en el uso de mtodos estticos:
x

Un mtodo esttico jams puede acceder a un atributo de

instancia (no esttico).


x

Un mtodo esttico jams puede acceder a un mtodo de

instancia (no esttico).


x

Pero desde un mtodo convencional si que se puede acceder a

atributos y mtodos estticos.

205

MDULO 2

Unidad 2.5 Otros conceptos

Ejemplo: Utilizacin de atributos desde un mtodo esttico

3.1 Atributos estticos


Los atributos estticos (o variables estticas) son atributos cuyo valor es compartido por todos los objetos de una clase.
Para definir un atributo esttico utilizamos la keyword: static. La sintaxis de
la declaracin 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 difciles de
detectar. Como todos los objetos de una misma clase comparte el mismo atributo esttico, si un objeto a modifica el valor del atributo, cuando el objeto
b vaya a usar dicho atributo, lo usa con un valor modificado.
Recordemos que sin embargo los atributos convencionales (de instancia) son
x

propios de cada objeto.


Ejemplo: Utilizacin de mtodos estticos desde un mtodo esttico

Los atributos estticos son cargados en memoria cuando se carga la clase.


Siempre antes de que:
x

Se pueda instanciar un objeto de dicha clase.

Se pueda ejecutar un mtodo esttico de dicha clase.

Para usar un atributo esttico no hace falta instanciar un objeto de la clase.


x

Ejemplo: System.out.println(Hola); // out es un atributo esttico

de la clase java.lang.System.
x

206

Ejemplo:

207

MDULO 2

Unidad 2.5 Otros conceptos

4. final
3.2 Bloques de cdigo estticos
final es una keyword que modifica el funcionamiento de:
Los bloques de cdigo esttico son trozos de cdigo que se ejecutan al cargar
una clase en memoria (no al instanciar objetos de esa clase).

Clases

Para definir un bloque de cdigo esttico utilizamos la keyword: static. La

Atributos

Mtodos

sintaxis de la declaracin es la siguiente:


static { . }

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

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 declaracin es la siguiente:
208

209

MDULO 2

Unidad 2.5 Otros conceptos

modificador_acceso final class nombre_clase


{
}
x

Ejemplo:
public final class MiClase
{
}

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 Mtodos finales


Definiendo un mtodo como final conseguimos que ninguna otra clase pueda
sobrescribirlo.

Para definir un atributo como final utilizamos la keyword: final. La sintaxis de


la declaracin es la siguiente:
modificador_acceso final tipo nombre [= valor_inicial];

Para definir un mtodo como final utilizamos la keyword: final. La sintaxis de

Ejemplo:

la declaracin es la siguiente:
protected final boolean sw = true;
public final int i;

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


{
}
x

Ejemplo:

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

210

Ejemplo:

211

MDULO 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 ningn mtodo definido ni implementado.

4.4 Static imports


Java SE 5.0 aado una novedad al respecto, permitiendo la importacin de
atributos y mtodos estticos, de manera que no haya que nombrar a la clase
para su acceso.
La sintaxis de la declaracin es la siguiente:
import static nombredelpaquete.nombredelaclase.miembro;
import static nombredelpaquete.nombredelaclase.*;

4.3 Definicin de constantes

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

Ejemplo:

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

Ejemplo: public static final double PI = 3.141592653589;

Por convencin, a la hora de programar, las constantes se suelen llamar con


todas las letras en maysculas.
x

Ejemplo: Constantes ya existentes en las clases bsicas:


java.lang.Math.PI: el nmero PI.
java.lang.Math.E: el nmero E.
javax.swing.SwingConstants.CENTER: centrado.
java.awt.event.KeyEvent.VK_ENTER: tecla de intro.

212

213

MDULO 2

Unidad 2.5 Otros conceptos

4. Paso por valor o por referencia


En programacin existen dos formas de pasar parmetros:
x

Por valor (o copia): se realiza una copia del parmetro.

Por referencia: se pasa una referencia al parmetro.

En C se decida mediante la gestin de punteros con los operadores: * y &


En Java sin embargo no hay decisin posible: todo se pasa por valor. Si se modifica
el valor de la variable recibida, no se modifica la variable original..
x

Ejemplo:

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

de esas referencias.

214

Ejemplo:

215

MDULO 2

Unidad 2.5 Otros conceptos

Las clases que no definan ningn constructor contienen impl-

citamente uno sin parmetros:


public MiClase()
{
super();
}
x

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

ma clase o del padre, contienen una llamada implcita al del padre


sin parmetros:
public MiClase(int param)
{
super();
this.valor = param;
}
x

Siempre que se haga referencia un atributo o mtodo de la

propia clase, implcitamente se aade this:


this.miMetodo();
x

Todos los mtodos de un interfaz son definidos como abstract

de forma implcita:
public abstract int miMetodo();

5. Cosas que ocurren por defecto

Todos los atributos son inicializados a su valor por defecto si

no se inicializan de forma explcita. Cuidado, que no ocurre lo mismo


El compilador realiza cosas por defecto de forma automtica (sin que estn desarrolladas de forma explcita en nuestro cdigo). Las enumeramos a continuacin:
x

Las clases que no importan explcitamente el paquete ja-

va.lang.* lo hacen de forma implcita:


import java.lang.*;
x

con las variables locales.


x

Si no se especifica ningn package, la clase pertenece al pac-

kage por defecto.


x

Si no se especifica ningn modificador de acceso al definir una

clase, atributo o mtodo, se le aplica el modificador package.

Las clases que no heredan explcitamente de otra clase, here-

dan implcitamente de java.lang.Object:


public class MiClase extends Object

216

217

MDULO 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 declaracin es la siguiente:
objeto instanceof clase
x

PRCTICA A: Cul 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 lgicas (condiciones).
Bsicamente lo que hace es comprobar si un casting concreto se puede realizar o
no.
x

Ejemplo:

Solucin:

PRCTICA B: Cul de estos programas compila sin errores?

218

219

MDULO 2

Unidad 2.5 Otros conceptos

Solucin:
PRCTICA D: Desarrollar, tanto en la JDK de Sun como en Eclipse, el comienzo de
un juego de rol donde tengamos distintas criaturas: Elfos, Trolls y Enanos. Inventad
una serie de atributos (entre ellos la fuerza), constructores y mtodos para todos
ellos. Debern estar en el paquete es.java.aula.mentor.practicad.criaturas.
Al mismo tiempo, tendremos un interfaz con los puntos de fuerza de cada una de
las
criaturas
definidas
como
constantes
en
el
paquete
es.java.aula.mentor.practicad.util. De esta manera un simple cambio en el interfaz
actualiza todo el juego.
La clase PracticaD que se encuentra en el paquete es.java.aula.mentor.practicad
tiene un mtodo main en el que se crean una serie de criaturas y se muestran por
pantalla.
Aunque en esta primera fase del desarrollo del juego no utilicemos las criaturas,
realizar un diseo lo mas genrico, reutilizable y fcil de mantener que se pueda.
PRCTICA C: Cul de estos programas compila sin errores?

Solucin con la JDK De Sun


En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS
y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar
las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le
aadimos %PATH%.

Solucin:

220

221

MDULO 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 aadir el . (punto) y
siempre ejecutar las herramientas en el directorio donde se encuentre el cdigo, o
aadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para
respetar el valor que ya tuviese la variable CLASSPATH le aadimos %CLASSPATH%

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

222

223

MDULO 2

Unidad 2.5 Otros conceptos

Y aceptamos la creacin de un fichero nuevo.

Para la clase Enano.java

Escribimos el cdigo y salvamos los cambios. Cerramos el Notepad.


Hacemos el mismo proceso para la clase Troll.java

Y para la clase Elfo.java


224

225

MDULO 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 extensin.
Podemos hacerlo desde cada uno de los directorios donde estn las clases, indicando solamente el nombre de la clase sin paquete (por ejemplo javac Troll.java) o
desde el directorio trabajo, indicando el nombre completo de la clase (por ejemplo
javac es\java\aula\mentor\practicad\criaturas\Troll.java).
Para poder compilar las clases, es necesario que las clases que utilizan sean compiladas previamente.
A continuacin mostramos un posible orden de compilacin:

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

226

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

227

MDULO 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 prctica con Eclipse


Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe
Seleccionar la ubicacin del workspace (o rea de trabajo).

228

229

MDULO 2

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

MDULO 2

Unidad 2.5 Otros conceptos

Crear las siguientes clases Troll , Enano, Elfo (sin mtodo main) dentro del mismo
paquete. Para no tener que volver a escribir el nombre del paquete, podemos seleccionarlo va el botn derecho del ratn y luego seleccionar el crear una nueva
clase.

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

232

233

MDULO 2

Unidad 2.5 Otros conceptos

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

234

235

MDULO 2

Unidad 2.5 Otros conceptos

Seleccionando la clase Java PracticaD, con el botn derecho del ratn 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

MDULO 2

Unidad 2.5 Otros conceptos

En esta unidad hemos visto distintos conceptos que nos permiten organizar nuestro cdigo y modificar el acceso a nuestras clases, mtodos y atributos.
x

Paquetes: son una caracterstica del lenguaje que nos permite organizar
el cdigo en grupos. Fsicamente, cada uno de los subgrupos del paquete
se convierten en un directorio del sistema operativo.

Modificadores de acceso: son una caracterstica del lenguaje que nos


posibilita delimitar quin o desde donde se puede acceder a una clase, a
un mtodo o a un atributo. Existen cuatro delimitadores:
-

public: puede acceder todo el mundo.

protected: Solamente se pueden acceder desde el mismo


paquete o subclases de otros paquetes.

: Solamente se pueden acceder desde el mismo paquete.

private: Solamente se puede acceder desde la misma clase.

Adicionalmente hemos visto otros keyword que modifican el comportamiento de


clases, atributos y mtodos
x

Mtodos estticos: son mtodos que son dependientes de la clase a la


que pertenecen y no a una instancia de una clase.

Atributos estticos: son atributos de clase y son compartidos por todas


las instancias de la clase a la que pertenecen.

Bloques estticos: son bloques de cdigo que se ejecutan una sola vez
cuando la clase es cargada en memoria.

238

Clases finales: son clases de la que nadie ms puede heredar.

MDULO 2 PROGRAMACIN JAVA

Mtodos finales: son mtodos que no pueden ser sobreescritos.


Atributos finales: son atributos que una vez definidos no se puede cambiar su
valor. Si se utilizan conjuntamente con la keyword static, se convierten en constantes a nivel de clase.

MDULO C

UNIDADES DIDCTICAS:

1. Clases bsicas. String, StringBuffer, System,


Math, Integer, .
2. Estructuras de datos. Arrays y colecciones

MDULO C

Clases bsicas
Tema 3.1

ndice de la unidad:

1. Clase java.lang.String
2. Clase java.lang.StringBuffer
3. Clase java.lang.StringBuilder
4. Clase java.lang.System
5. Clase java.lang.Math
6. Otras clases
7. Wrapper de tipos primitivos

Unidad 3.1 Clases bsicas

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

Mediante su constructor con una cadena de caracteres.


x Ejemplo: String s = new String(Hola);

Mediante la asignacin de una cadena de caracteres.


xEjemplo: String s = Hola; // Es la nica excepcin al uso del new.

Otros

constructores:

http://java.sun.com/javase/6/docs/api/java/lang/String.html#constr
uctor_detail
Es importante tener en cuenta que para la clase String, la primera posicin de la
cadena de caracteres es la cero (y no la uno).
Implementa una serie de mtodos muy tiles para el manejo de las cadenas de caracteres. Por ejemplo:
x

public char charAt(int index); Devuelve el carcter que se

encuentra en la posicin index.


x

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

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

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

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

MDULO 3

Unidad 3.1 Clases bsicas

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


comparacin 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 posicin beginIndex hasta el final.


x

public String substring(int beginIndex, int endIndex);

Devuelve la cadena desde la posicin beginIndex hasta endIndex


La clase String, sobreescribe el mtodo equals() de la clase java.lang.Object (re-

1.
x

cordemos que mtodo el equals de Object comparaba las posiciones de memoria, y


public String toLowerCase(); Devuelve la cadena en mins-

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-

Ejemplo:

ysculas.
x

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

blanco ni por delante ni por detrs.


x

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

de caracteres que representa d. Este mtodo est sobrecargado varias veces recibiendo como parmetro otros tipos primitivos (char,
int, float, long).
x

Otros mtodos:

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, jams se modifica el valor de un String si no que se crean nuevos
objetos. En la ejecucin del siguiente cdigo
String s = "0";
for(int i=1; i <10; i++)
s = s + i;

Ejemplo:

247

MDULO 3

Unidad 3.1 Clases bsicas

No existe un solo objeto de tipo String al que se le ha ido cambiando su valor inter-

Para la clase StringBuffer, la primera posicin de la cadena de caracteres es la cero

no (atributos), sino que se han creado 10 objetos distintos.

(y no la uno).

Pero an hay ms la JVM reserva un espacio en memoria llamado String Pool

Algunos de sus mtodos ms importantes son:

donde va guardando todos los String. Y el Garbage Collector jams los elimina.
Cada vez que se crea un objeto nuevo del tipo String, la JVM mira antes si ese
String ya existe, y si es as lo reutiliza.

public StringBuffer append(char c); Aade el carcter c al

valor del StringBuffer. Este mtodo est sobrecargado varias veces


recibiendo como parmetro otros tipos: String, Object, int, float,
long Modifica el propio objeto que realiza la llamada.
Por este motivo, el uso de String es un tema no tan trivial como pudiera parecer.
Un uso indebido puede provocar problemas de rendimiento.

public char charAt(int index); Devuelve el carcter que se

encuentra en la posicin index.


x

2. Clase java.lang.StringBuffer

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

de ch (devuelve -1 si no est).

StringBuffer es otra clase relacionada con las cadenas de caracteres. Pero en este

caso no son inmutables.

racteres.

Existen distintas formas de crear un StringBuffer:

Mediante su constructor por defecto.

(y no a ).

Mediante su constructor con un parmetro de tipo int.

dad inicial para 3 caracteres

248

Otros

constructores:

public String toString(); Devuelve un String representado

por el StringBuffer.
public String substring(int beginIndex); Devuelve un

String desde la posicin beginIndex hasta el final.


x

xEjemplo: StringBuffer s = new StringBuffer(3); // Tiene una capaci-

Mediante su constructor con una cadena de caracteres.


x Ejemplo: StringBuffer s = new StringBuffer(Hola);

public int capacity(); Devuelve el nmero de caracteres que

puede contener sin necesidad de alocar o pedir ms memoria.

x Ejemplo: StringBuffer s = new StringBuffer(); // Se inicializa a

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

public StringBuffer reverse(); Devuelve la cadena invertida

en orden. Modifica el propio objeto.


x

public void setCharAt(int index, char ch); Reemplaza el

carcter de la posicin index por ch.


x

public StringBuffer replace(int start, int end, String str);

http://java.sun.com/javase/6/docs/api/java/lang/StringBuffer.html#

Reemplaza la cadena entre las posiciones start y end con str. Modifi-

constructor_detail

ca el propio objeto que hace la llamada.

249

MDULO 3

Unidad 3.1 Clases bsicas

public StringBuffer insert(int offset, char c); Inserta c en

la posicin offset de la cadena. Este mtodo est sobrecargado varias


veces recibiendo como parmetro a insertar otros tipos: int, float,
long Modifica el propio objeto que hace la llamada.
x

public StringBuffer delete(int start, int end); Elimina los

caracteres entre las posiciones start y end.


x

Otros mtodos:

http://java.sun.com/javase/6/docs/api/java/lang/StringBuffer.html#
method_detail
x

Ejemplo:

El uso ms habitual es la creacin de Strings cuyo valor se calcula de forma dinmica. Al no ser inmutable, permite la creacin del String final sin otros objetos intermedios que consumirn memoria de forma innecesaria. En la ejecucin del siguiente cdigo
StringBuffer tmp = new StringBuffer(10);
for(int i=0; i <10; i++)
tmp.append(i);
String s = tmp.toString();
x

Solo se han creado 2 objetos en memoria: un StringBuffer (el GC puede limpiarlo) y


Ejemplo:

un String.

3. Clase java.lang.StringBuilder
Java SE 5.0 aade la clase StringBuilder al tratamiento de cadenas de caracteres.
Su funcionalidad (constructores y mtodos) es idntica a la de StringBuffer. La nica diferencia es que sus mtodos no estn sincronizados (veremos qu significa esto en la Unidad 3.7 Threads).

250

251

MDULO 3

Unidad 3.1 Clases bsicas

En ejecuciones paralelas tiene mejor rendimiento que StringBuffer. Se puede en-

Para

contrar

http://java.sun.com/javase/6/docs/api/java/lang/System.html#field_detail

una

informacin

ms

detallada

en

ms

informacin

http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html
x

Y entre sus mtodos ms utilizados se encuentran:


Ejemplo:

public static long currentTimeMillis(); Devuelve la diferen-

cia de entre la hora actual y la medianoche del 1 de enero de 1970


en milisegundos.
x

public static long nanoTime(); Devuelve la hora actual en

nanosegundos. Es novedad del JSE 5.0


x

public static void exit(int status); Termina la ejecucin de

la JVM devolviendo status como cdigo de retorno (cero significa que


todo ha ido bien).
x

public static void gc(); Pide a la JVM que ejecute el Garbage

Collector. Se trata de un mtodo muy peligroso. Utilizado sin cuidado


puede afectar muy negativamente al rendimiento.
x

public static String getProperty(String key); Devuelve el

valor de la propiedad del sistema key, o null si no existiese.

4. Clase java.lang.System

public static Properties getProperties(); Devuelve una

instancia de java.util.Properties encapsulando todas las propiedades


Se trata de una clase con utilidades genricas del sistema. Todos sus atributos y

del sistema.

mtodos son estticos.

Tiene tres atributos muy utilizados:

librera nativa libname. Se utiliza con la programacin JNI (Java Na-

tive Interface).
public static final PrintStream out; Representa por defecto

al stream de salida en pantalla.


x

Otros

mtodos:

http://java.sun.com/javase/6/docs/api/java/lang/System.html#meth
public static final InputStream in; Representa por defecto

al stream de entrada del teclado.


x

public static void loadLibrary(String libname); Carga la

od_detail
x

Ejemplo:

public static final PrintStream err; Representa por defecto

al stream de salida de errores.

252

253

MDULO 3

Unidad 3.1 Clases bsicas

public static int max(int a, int b); Devuelve el nmero ma-

yor comparando a y b. Este mtodo se encuentra sobrecargado recibiendo otros tipos: long, float
x

public static int min(int a, int b); Devuelve el nmero me-

nor comparando a y b. Este mtodo se encuentra sobrecargado recibiendo otros tipos: long, float
x

public static double pow(double a, double b); Calcula po-

tencias de base a y exponente b.


x

public static double random(); Devuelve un nmero aleato-

rio entre 0.0 y 1.0 (0.0 est incluido pero no as el 1.0).


x

public static long round(double a); Redondea a al nmero

entero ms cercano. Este mtodo se encuentra sobrecargado con

5. Clase java.lang.Math

otros tipos: float.

Se trata de una clase con utilidades matemticas. Todos sus atributos y mtodos

son estticos.

da de a.

Tiene dos atributos (constantes) muy utilizados:

Otros mtodos:

http://java.sun.com/javase/6/docs/api/java/lang/Math.html#method
public static final double E; Es el nmero e, utilizado en los

logaritmos neperianos.
x

public static double sqrt(double a); Calcula la raz cuadra-

public static final double PI; Es el nmero , utilizado en

_detail
x

Ejemplo:

trigonometra.
Para

obtener

ms

informacin:

http://java.sun.com/javase/6/docs/api/java/lang/Math.html#field_detail
Alguno de sus mtodos ms importantes son:
x

public static double abs(double a); Devuelve el valor abso-

luto de a. Este mtodo se encuentra sobrecargado recibiendo otros


tipos: int, long
x

public static double log10(double a); Devuelve el logarit-

mo base 10 de a.
254

255

MDULO 3

Unidad 3.1 Clases bsicas

7. Wrapper de tipos primitivos


Hay ocasiones en las que necesitaramos usar un tipo primitivo como un objeto (tipo complejo). Por ejemplo, cuando queremos guardar nmeros en una coleccin
que solo admite java.lang.Object.
En el paquete java.lang.* existe un wrapper para cada tipo primitivo (no siempre
coincide el nombre):
x

Boolean: para el tipo primitivo boolean

Character: para el tipo primitivo char

Byte, Short, Integer, Long: para los tipos primitivos byte,

short, int y long respectivamente.


x

Float, Double: para los tipos primitivos float y double respec-

tivamente

6. Otras clases
A continuacin se enumeran otras clases importantes a tener en cuenta pertene-

Como norma a seguir, suelen tener los siguientes mtodos:


x

cientes a otros paquetes


x

Para manejar fechas: java.util.Date y java.util.Calendar

Para formatear fechas y nmeros: java.text.DateFormat y

Constructores que reciben un String o el tipo primitivo que re-

presentan:
x Ejemplo: Integer a = new Integer(3);

java.text.NumberFormat

diante el mtodo valueOf

Para dividir una cadena de caracteres en tokens (o trozos de

x Ejemplo: Integer b = Integer.valueOf(3);

cadena separados por un identificador): java.util.StringTokenizer


x

Para

trabajar

con

expresiones

regulares:

va.util.regex.Pattern y java.util.regex.Matcher
x

ja-

Convertidores de tipo String a su tipo complejo (wrapper) me-

Convertidores de tipo String al tipo primitivo que representan

mediante el mtodo parseXXX


x Ejemplo: int c = Integer.parseInt(3);

Ms informacin: http://java.sun.com/javase/6/docs/api/
x

Convertidores de tipo primitivo a String mediante el mtodo

toString
x Ejemplo: String d = Integer.toString(c);

256

257

MDULO 3

Unidad 3.1 Clases bsicas

Extractores del tipo primitivo que representan mediante el m-

todo XXXValue
x Ejemplo: int e = b.intValue();

Todos los wrappers sobreescriben el mtodo equals de la clase java.lang.Object. De

public String toString(); Devuelve su representacin String

(sobrescribe el mtodo toString() de java.lang.Object).


x

public boolean booleanValue(); Extrae el boolean que re-

presenta.

esta forma, podemos saber si dos objetos distintos de un mismo tipo de wrapper,

representan el mismo valor primitivo o no.

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

Ms

informacin

mtodos:

x Ejemplo:

7.2 Clase java.lang.Character


Es el wrapper del tipo primitivo char. Sus mtodos ms importantes son:
x

public Character(char value); Constructor de un Character

con el char value.


x

7.1 Clase java.lang.Boolean


Es el wrapper del tipo primitivo boolean. Sus mtodos ms importantes son:
x

public Boolean(boolean value); Constructor de un Boolean

public Boolean(String s); Constructor de un Boolean con el

String s. Si s no vale true entonces siempre coger el valor false.


x

public static Boolean valueOf(String s); Convierte el

String s en un Boolean. Si s no vale true entonces siempre devuelve un Boolean con false.
x

public String toString(); Devuelve su representacin String

(sobrescribe el mtodo toString() de java.lang.Object).

con el boolean value.


x

public static String toString(char c); Convierte el char c en

un String.

public static boolean parseBoolean(String s); Convierte el

String s en un boolean. Si s no vale true entonces siempre devuel-

public char charValue(); Extrae el char que representa.

Ms informacin y mtodos:

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

7.3 Clase java.lang.Byte


Es el wrapper del tipo primitivo byte. Sus mtodos ms importantes son:
x

ve false.

s.

public static String toString(boolean b); Convierte el

public Byte(byte value); Constructor de un Byte con el byte

value.
public Byte(String s); Constructor de un Byte con el String

boolean b en un String.

258

259

MDULO 3

Unidad 3.1 Clases bsicas

public static Byte valueOf(String s); Convierte el String s

en un Byte.
x

Ms informacin y mtodos:

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

public static byte parseByte(String s); Convierte el String

s en un byte.
x

public static String toString(byte b); Convierte el byte b

en un String.
x

public String toString(); Devuelve su representacin String

(sobrescribe el mtodo toString() de java.lang.Object).

7.5 Clase java.lang.Integer


Es el wrapper del tipo primitivo int. Sus mtodos ms importantes son:
x

public Integer(int value); Constructor de un Integer con el

int value.

public byte byteValue(); Extrae el byte que representa.

Ms informacin y mtodos:

String s.

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

7.4 Clase java.lang.Short


Es el wrapper del tipo primitivo short. Sus mtodos ms importantes son:
x

public Short(short value); Constructor de un Short con el

public Short(String s); Constructor de un Short con el String

public static Short valueOf(String s); Convierte el String s

public static short parseShort(String s); Convierte el

String s en un short.
x

public static int parseInt(String s); Convierte el String s

public static String toString(int i); Convierte el int i en un

public String toString(); Devuelve su representacin String

(sobrescribe el mtodo toString() de java.lang.Object).

en un Short.
x

String.

s.
x

public static Integer valueOf(String s); Convierte el String

s en un Integer.

en un int.

short value.
x

public Integer(String s); Constructor de un Integer con el

public int intValue(); Extrae el int que representa.

Ms informacin y mtodos:

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

public static String toString(short s); Convierte el short s

en un String.
x

7.6 Clase java.lang.Long


public String toString(); Devuelve su representacin String

(sobrescribe el mtodo toString() de java.lang.Object).


x
260

Es el wrapper del tipo primitivo long. Sus mtodos ms importantes son:

public short shortValue(); Extrae el short que representa.

261

MDULO 3

Unidad 3.1 Clases bsicas

public Long(long value); Constructor de un Long con el long

value.
x

public Long(String s); Constructor de un Long con el String

public String toString(); Devuelve su representacin String

(sobrescribe el mtodo toString() de java.lang.Object).


public static Long valueOf(String s); Convierte el String s

en un Long.
x

public static String toString(float f); Convierte el float f en

un String.

s.
x

public static Long valueOf(String s); Convierte el String s

public float floatValue(); Extrae el float que representa.

Ms informacin y mtodos:

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

en un Long.
x

public static String toString(long l); Convierte el long l en

un String.
x

public String toString(); Devuelve su representacin String

(sobrescribe el mtodo toString() de java.lang.Object).


x

public long longValue(); Extrae el long que representa.

Ms informacin y mtodos:

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

7.8 Clase java.lang.Double


Es el wrapper del tipo primitivo double. Sus mtodos ms importantes son:
x

public Double(double value); Constructor de un Double con

el double value.
x

public Double(String s); Constructor de un Double con el

String s.
x

public static Double valueOf(String s); Convierte el String

s en un Double.

7.7 Clase java.lang.Float


Es el wrapper del tipo primitivo float. Sus mtodos ms importantes son:
x

public Float(float value); Constructor de un Float con el

public static double parseDouble(String s); Convierte el

String s en un double.
x

public static String toString(double d); Convierte el dou-

float value.

ble d en un String.

public Float(String s); Constructor de un Float con el String

s.
x

(sobrescribe el mtodo toString() de java.lang.Object).


public static Float valueOf(String s); Convierte el String s

en un Float.
x

public String toString(); Devuelve su representacin String

public

double

doubleValue();

Extrae

el

double

que

representa.

public static float parseFloat(String s); Convierte el String

s en un float.
262

263

MDULO 3

Unidad 3.1 Clases bsicas

Integer i = new Integer(1);


Ms informacin y mtodos:

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

Sin embargo ahora se puede hacer directamente:


Integer i = 1;
El compilador se encarga de realizar la conversin de forma automtica (auto-

7.8 Ejemplo con los wrappers

boxing).

A continuacin mostramos un ejemplo de los wrappers de los tipos bsicos.

De igual forma, antes para extraer un tipo primitivo de su wrapper utilizbamos el siguiente mtodo:
Integer a = new Integer(1); int b = a.intValue();
Sin embargo ahora se puede hacer directamente:
int b = a;
El compilador se encarga de realizar la extraccin de forma automtica (autounboxing).
Esto nos permite tambin operar con los wrappers:
Integer a = 10; Integer b = 3; int c = a + b;
Tambin se permiten las comparaciones:
Integer a = 5; int b = 6;
if(a == b)
System.out.println(Iguales);
El wrapper Boolean tambin se ve favorecido por esta nueva funcionalidad.
Antes no poda participar en condiciones, pero ahora si:

7.9

Autoboxing/Auto-unboxing

Java SE 5.0 aade una novedad al respecto de los wrappers de tipo bsico,
permitiendo que las conversiones entre tipos

Boolean a = true; boolean b = false;


Boolean c = a && b;

primitivos y sus wrappers se

hagan de forma automtica.

Ante esta nueva funcionalidad, nos podemos preguntar qu pasa con la sobrecarga de mtodos?

Antes, para crear un wrapper a partir de un tipo primitivo se utilizaba su constructor:

264

public void metodo(double param) { };


public void metodo(Integer param) { };
265

MDULO 3

Unidad 3.1 Clases bsicas

int a = 5;
this.metodo(a);
Para evitar diferencias en la funcionalidad de una aplicacin al migrar de versiones anteriores, primero se busca el mtodo a ejecutar sin tener en cuenta
el autoboxing y auto-unboxing. Si no se encuentra ninguno, entonces de busca teniendo en cuenta el autoboxing y auto-unboxing. Se llamara por tanto a:
public void metodo(double param) {

};

Creamos un directorio de trabajo donde guardar el programa Java.

PRCTICA A: Desarrollar, tanto en la JDK de Sun como en Eclipse, una clase a la


que se le pase un parmetro de tipo String (sin blancos de separacin) y muestre:
x

x
x
x

la cadena de caracteres en maysculas.


la cadena de caracteres en minsculas.
los dos primeros caracteres de la cadena (solo en caso de que la longitud de
esta sea de dos o ms caracteres).
los dos ltimos caracteres de la cadena (solo en caso de que la longitud de
esta sea de dos o ms caracteres).
el nmero de ocurrencias en la cadena del ltimo carcter.
la cadena con todas las ocurrencias del primer carcter en maysculas.
la cadena con tres asteriscos por delante y por detrs.

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

La cadena invertida.

Solucin con la JDK De Sun


En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS
y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar
las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le
aadimos %PATH%.

266

267

MDULO 3

Creamos el directorio donde va a estar nuestra clase


es\java\aula\mentor\\practicas26

Unidad 3.1 Clases bsicas

Y aceptamos la creacin de un fichero nuevo.


Para poder coger un parmetro pasado en la ejecucin del programa, incluir las
siguientes lneas despus del main. Veremos el tratamiento de los arrays en la
Unidad 3.1
if (args == null || args.length != 1){
System.out.println("Numero de parametros incorrectos");
System.exit(1);
}
String s = args[0];
Nuestra clase quedara de la manera siguiente:

Desde el directorio es\java\aula\mentor\practica26, con un editor de texto (por


ejemplo Notepad) vamos a escribir el cdigo fuente de nuestra clases java; el
nombre del fichero PracticaA.java debe ser exactamente igual (incluyendo
maysculas y minsculas) al de la clase Java que vamos a desarrollar.

268

269

MDULO 3

Unidad 3.1 Clases bsicas

Ahora realizaremos la misma prctica con Eclipse


Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe
Seleccionar la ubicacin del workspace (o rea de trabajo).

Compilamos nuestra clase

Aparecer la pantalla para empezar a trabajar.

Ejecutamos la clase, pasndole un parmetro en la ejecucin:

270

271

MDULO 3

Unidad 3.1 Clases bsicas

Darle el nombre y seleccionar Finish.

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

Crear un proyecto nuevo de nombre Practicas26


Crear una clase Java nueva
es.java.aula.mentor.practicas26

272

llamado

PracticaA,

especificando

el

paquete

273

MDULO 3

Unidad 3.1 Clases bsicas

Salvar los cambios con Ctrl + S o File -> Save

Para ejecutar la clase, pasndole un parmetro, seleccionamos la clase Java PracticaA, con el botn derecho del ratn ejecutarla como Run Configurations

El cdigo dentro del mtodo main, quedara como sigue:

274

275

MDULO 3

Unidad 3.1 Clases bsicas

Y seleccionar el botn Run.

Indicar el parmetro en la pestaa Arguments

PRCTICA B: Desarrollar, tanto en la JDK de Sun como en Eclipse, una clase a la


que se le pasen dos parmetros de tipo String y que sern convertidos a dos nmeros decimales (double); estos nmeros decimales sern los dos catetos de un tringulo rectngulo.
Deber tener un mtodo que muestre:
x
x

El mayor y menor de los catetos.


El valor de la hipotenusa.

Adicionalmente, habr que mostrar el tiempo que tarda en ejecutarse este mtodo.

276

277

MDULO 3

Solucin con la JDK De Sun


En el directorio es\java\aula\mentor\practicas26, creamos una clase nueva llamada
PracticaB.java con un editor de texto como notepad.

Unidad 3.1 Clases bsicas

Ahora realizaremos la misma prctica con Eclipse


Nos creamos una nueva clase en el paquete es.java.aula.mentor.practicas26, llamada PracticaB

Para el paso de parmetros en ejecucin, incluiremos las siguientes lneas en el


mtodo min.
if (args == null || args.length != 2){
System.out.println("Numero de parametros incorrectos");
System.exit(1);
}
String s1 = args[0]; // tenemos en primer parmetro de tipo String
String s2 = args[1]; // tenemos en segundo parmetro de tipo String
Nuestra clase quedara como sigue:

compilamos la clase y ejecutamos pasndole los parmetros

Desarrollamos el cdigo de la clase

278

279

MDULO 3

Unidad 3.1 Clases bsicas

Y ejecutamos mediante Run Configurations, verificando que en el Main class aparece la clase PracticaB (en el caso de no aparecer cambiar el nombre o buscarla mediante el botn Search)

Seleccionamos el botn Run, obteniendo la siguiente salida:

pasndole como argumentos 12.2 y 2.4

280

281

MDULO C

TTULO DE MDULO O BLOQUE

En esta unidad se han visto una relacin de clases bsicas e imprescindibles de conocer a la hora de la programacin en Java.
x

java.lang.String: utilizada para el tratamiento de cadenas de caracteres

Estructuras de datos. Arrays y


colecciones

o String. Se utiliza sobre todo para cadenas de caracteres inmutables


x

Para el tratamiento de cadenas de caracteres que cambian de valor se

Tema 3.2

utilizan las clases

java.lang.StringBuffer (sincronizada)

java.lang.StringBuilder (no sincronizada)

ndice de la unidad:
java.lang.System: se trata de una clase con utilidades genricas del
sistema.

1. Arrays
java.lang.Math: e trata de una clase con utilidades matemticas.

2. Colecciones

Adems se han estudidado las clases wrappers de los tipos primitivos, como son:
x
x
x
x
x
x
x
x

java.lang.Boolean
java.lang.Character
java.lang.Byte
java.lang.Short
java.lang.Integer
java.lang.Long
java.lang.Float
java.lang.Double

3. Importancia de los mtodos equals() y hashCode()


4. Arrays vs. Colecciones

Unidad 3.2 Estructura de datos

En Unidades anteriores hemos estudiado los tipos de datos, tanto primitivos como
complejos. Hemos visto como trabajar con datos de ambos dos tipos, pero siempre
de una manera unitaria. En esta Unidad veremos como trabajar con los conjuntos
de datos, como una sola variable u objeto.

1. Arrays
Un array es una estructura de datos que permite albergar varios elementos del
mismo tipo.
La longitud de un array se establece durante su creacin y una vez establecida la
longitud de un array, ya no se puede modificar, por lo que se puede considerar que
tiene una longitud fija.
Un elemento de un array, es el valor de una de sus posiciones, y se identifica mediante un ndice.
Un array en Java, es un tipo de clase especial que hereda implcitamente de java.lang.Object.
La declaracin de un array se realiza mediante el tipo de datos que va a albergar y
los corchetes [ ]. La sintaxis de la declaracin de un array es la siguiente:
modificador_acceso tipo[] nombre [= valor_inicial];
x

Ejemplos: private int[] numeros;


private String[] cadenas;

Los arrays pueden albergar tanto tipos primitivos como tipos complejos y para poder utilizarlos, hay que inicializarlos. Un array sin inicializar, por defecto vale null.
La creacin de un array se realiza mediante la keyword: new, como con cualquier
otra clase, tanto para tipos primitivos como para tipos complejos. La sintaxis de la
creacin de un array es:
modificador_acceso tipo[] nombre = new tipo[longitud];

285

MODULO 3

Unidad 3.2 Estructura de datos

Ejemplos: private int[] numeros = new int[5];


private String[] cadenas = new String[4];

Una vez hayamos creado un array, todas sus posiciones son inicializadas al valor
por defecto del tipo de variable que albergue.
Es decir, 0 o 0.0 si se trataba de un nmero, false si se trataba de un boolean y null
si se trataba de un tipo complejo.
Existe una forma de crear un array inicializando todas sus posiciones a un valor de-

Con un array de tipos complejos quedara de la siguiente manera:

terminado, igualndolo a un listado de elementos separados por comas entre { }.


El tamao del array ser el nmero de elementos del listado.
x

Ejemplos: private int[] numeros = {1,2,3,4,5};


private String[] cadenas = {hola,adios};
private Integer[] ints = {new Integer(12), new Integer(98)};

Para el acceso al elemento de un array se utiliza en nombre del array seguido de


unos [ ] con la posicin a la que queremos acceder, siendo siempre el ndice de un
array de tipo int. Hay que tener en cuenta que la primera posicin de un array es la
0.
x

Ejemplos: numeros[2] = 3;
int a = numeros[0];

Para conocer la longitud de un array, podremos acceder a su atributo pblico:


if(numeros[4] == 5)..

Vemos como queda en memoria los arrays de tipos primitivos:

length.
Al no ser dinmico, no podemos:
x

Ni eliminar posiciones.

Ni insertar posiciones.

El borrado ser algo lgico, como igualar a null, a -1, etc.. las posiciones que no
se quieran o se necesiten utilizar, dependiendo de la lgica que necesite el programa o de la propia eleccin del programador.
286

287

MODULO 3

Unidad 3.2 Estructura de datos

Es imposible acceder a una posicin fuera del array en tiempo de ejecucin. Llega-

1. 1 Sentencia for/in

do el caso se lanzar una excepcin del tipo ArrayIndexOutOfBoundException


(se vern en ms detalle en la Unidad 3.5).
x

Esta nueva sentencia del Java SE 5.0 nos facilita la iteracin por los elementos
de cualquier tipo de coleccin: arrays, listas, etc

Ejemplo: Si seguimos la ejecucin del siguiente

programa
public class Colecciones
{
public static void main(String[] args)
{
// Creacin e inicializacin.
String[] saludos = new String[4];
// Insercin.
saludos[0] =
saludos[1] =
saludos[2] =
saludos[3] =

new
new
new
new

String("Hola");
String("Adios");
String("Hello");
String("GoodBye");

for(inicializacin: coleccin)
{
sentencias;
}

Las variables definidas en la sentencia de inicializacin son locales al bloque.


Por tanto dejan de existir una vez se haya terminado el bucle.
x

Ejemplo: se muestra un ejemplo de la sentencia de control for/in


public void listar(int[] param)
{
for(int i: param)
System.out.println(i);
}

// Extraccin.
String tmp = saludos[2];
// Borrado.
saludos[2] = null;
saludos[3] = null;
// Recorrido.
for(int i=0; i<saludos.length; i++)
System.out.println(saludos[i]);

Nota: Se usa : en vez de ;.

Bsicamente, se trata de una simplificacin a la hora de codificar. Es decir, al


final, el compilador convierte el cdigo en una sentencia for convencional como la siguiente:

// Bsqueda.
boolean sw = false;
for(int i=0; i<saludos.length; i++)
{
if(saludos[i] != null && saludos[i].equals("Adios"))
{
System.out.println("Adios ha sido encontrado en la posicin: "
+ i);
sw = true;
break;
}
}

public void listar(int[] param)


{
int i = 0;
for(int j=0; j<param.length; j++)
i = param[j];
System.out.println(i);
}

}
}

1. 2 Arrays multidimensionales
Un array multidimensional es un array de arrays o desde un punto de vista
matemtico es una matriz. Es decir, una matriz de 4 x 2 en realidad en Java
est formada por 5 arrays: 1 array con 4 arrays.
Y si estuviramos hablando de tres dimensiones entonces tendramos un array
de arrays de arrays, aunque son bastante menos utilizados.

288

289

MODULO 3

Unidad 3.2 Estructura de datos

La sintaxis de la creacin de un array bidimensional es la siguiente:


modificador_acceso tipo[][] nombre = new tipo[long][long];
x

Ejemplo: private int[][] numeros = new int[4][2];

Pero podemos tener arrays bidimensionales no cuadradas. Es decir, que la segunda dimensin tenga longitud diferente para cada posicin de la primera
dimensin.
La sintaxis de la creacin de un array bidimensional no cuadrado es la siguiente:
modificador_acceso tipo[][] nombre = new tipo[long][];
x

Ejemplo:
private int[][] numeros = new int[4][];
numeros[0] = new int[2];
numeros[1] = new int[10];
numeros[3] = new int[1];

Ejemplo: private int[][] numeros = { {1,2,3} , {1,2,3} };

Ejemplo: Si seguimos la ejecucin del siguiente programa, obten-

dremos la salida mostrada

Al igual que ocurriera en los arrays de una dimensin, los arrays bidimensionales tambin se pueden inicializar en la creacin con un listado de valores.
x

Ejemplos: private int[][] numeros = { {1,2,3} , {1,2,3} };

public class Matriz


{
public static void main(String[] args)
{
int[][] matriz = new int[4][];
// Rellenar la matriz
for(int i=0; i<matriz.length; i++)
{
matriz[i] = new int[5];
for(int j=0; j<matriz[i].length; j++)
matriz[i][j] = i + j;
}

private String[][] dias = { {Lunes,Martes} , {Mircoles} };

Vemos como queda en memoria los arrays bidimensionales:

// Mostrar la matriz
for(int i=0; i<matriz.length; i++)
{
for(int j=0; j<matriz[i].length; j++)
System.out.print(matriz[i][j] + " ");
System.out.println();
}
}
}

290

291

MODULO 3

Unidad 3.2 Estructura de datos

2. Colecciones
Una coleccin es simplemente un objeto que agrupa varios elementos en uno solo.
Se utilizan para guardar y manipular datos as como transmitir informacin entre
mtodos.
En Java tenemos un framework de colecciones, implementado mediante:
x

Interfaces: representaciones abstractas de las colecciones

que permiten usarlas sin conocer sus detalles.

1. 3 El mtodo main usa Arrays

Implementaciones: colecciones concretas.

Algoritmos: mtodos que permiten realizar operaciones co-

mo bsquedas, ordenaciones, etc

El mtodo main recibe un array de Strings que contine los argumentos enviados en el arranque de la aplicacin. La sintaxis del mtodo main es la siguien-

A continuacin se muestra la organizacin jerrquica de este framework y una for-

te, y como podemos apreciar args es un array de elementos de tipo String:

ma rpida de saber cual podra ser la elegida a utilizar en cada caso. En el caso de

public static void main(String[] args)


x

Ejemplo:

los Collection, hay una clara diferenciacin en cuanto si permite duplicados accediendo por ndice java.util.List, o sin duplicados sin posibilidad de acceso va ndice,
java.util.Set

public class Test


{
public static void main(String[] args)
{
for(int i=0; i<args.length; i++)
System.out.println("Argumento " + i + : " + args[i]);
}
}

292

293

MODULO 3

Unidad 3.2 Estructura de datos

En el caso de los Map, se utilizan siempre que necesitemos trabajar con parejas de

datos clave/valor.

ese elemento.
x

boolean contains(Object element); // Indica s contiene

boolean add(Object element); // Aade un elemento.

Devuelve un boolean para indicar si ha tenido xito o ha tenido problemas.


x

remove(Object element); // Borra un elemento.

Iterator iterator(); // Devuelve una instancia de Iterator.

Los mtodos que corresponden a operaciones masivas son:


x

boolean containsAll(Collection c); // Indica s contiene

todos esos elementos.


x

boolean addAll(Collection c); // Aade todos los elemen-

tos del parmetro pasado. Devuelve un boolean para indicar si ha


tenido xito o ha tenido problemas.
x

boolean removeAll(Collection c); // Borra todos los ele-

mentos del parmetro pasado. Devuelve un boolean para indicar si


Todas las colecciones se encuentran en el paquete java.util.*; siendo ja-

ha tenido xito o ha tenido problemas.

va.util.Collection y java.util.Map las raices de la jerarqua de las colecciones.

Existirn especializaciones que permitan elementos duplicados o no, que permitan

mentos menos los pasados en el parmetro. Devuelve un boolean

ordenar los elementos o no, etc.

para indicar si ha tenido xito o ha tenido problemas.

Estas interfaces contiene la definicin de todos los mtodos genricos que deben

boolean retainAll(Collection c); // Borrar todos los ele-

void clear(); // Borra todos los elementos.

implementar las colecciones.


Los mtodos que corresponden a operaciones con arrays son:

2.1 java.util.Collection
Los mtodos bsicos de este interfaz son:
x
x

int size(); // Indica el nmero de elementos que contiene.

Object[] toArray(); // Devuelve un array con todos los

elementos.
x

Object[] toArray(Object a[]); // Devuelve un array con

todos los elementos. El tipo ser el del array enviado.


boolean isEmpty(); // Indica s no contiene ningn ele-

mento.

294

295

MODULO 3

Unidad 3.2 Estructura de datos

Hay que tener siempre en cuenta que las colecciones no permiten el uso de tipos primitivos. Por tanto, siempre que necesitemos trabajar con ellos habr
que hacer uso de los Wrappers de Tipos Primitivos.

2.2 java.util.Iterator
El interfaz Iterator representa un componente que permite iterar o recorrer
los elementos de una coleccin.
Todas las colecciones ofrecen una implementacin de Iterator por medio del

public boolean equals(Object o);


Existen distintas implementaciones de este interfaz:
x

orden de iteracin es impredecible.


x

public Iterator iterator();

java.util.LinkedHashSet: Es nueva en el SDK 1.4.x. Su

orden de iteracin es el orden de insercin.


x

mtodo:

java.util.HashSet: Es nueva en el SDK 1.2.x. Ofrece el ac-

ceso ms rpido cuando dicho acceso es aleatorio (no secuencial). Su

java.util.TreeSet: Es nueva en el SDK 1.2.x. Su orden de

iteracin depende de la implementacin que los elementos hagan del


interfaz java.lang.Comparable, mediante la implementacin del

Sus mtodos son:


x

mtodo public int compareTo(Object o);


boolean hasNext(); // Indica s tiene ms elementos des-

Ejemplo: Utilizacin de java.util.HashSet

de la posicin en la que se encuentra el iterador.


x

import java.util.*;

Object next(); // Devuelve el primer elemento y se queda

apuntando al siguiente. En la siguiente llamada, devolver el segundo elemento y apuntar al siguiente y as sucesivamente hasta el final de la coleccin que devolver un null.
x

public class TestHashSet


{
public static void main(String[] args)
{
HashSet ciudades = new HashSet();
ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add("Sevilla");
ciudades.add("Madrid"); // Repetido.

void remove(); // Elimina el primer elemento y se queda

apuntando al siguiente. En el caso de que no estemos en la primera


posicin, borrar el elemendo donde est el iterador y apuntar al siguiente.

Iterator it = ciudades.iterator();
while(it.hasNext())
System.out.println("Ciudad: " + it.next());

En el SDK 1.1.x exista otro interfaz, java.util.Enumeration, pero ya ha dejado de utilizarse.

}
}

2.2 java.util.Set
El interfaz Set hereda del interfaz Collection. Pero no aade la definicin de
ningn mtodo nuevo.
Representa colecciones que no permiten tener elementos duplicados. Para saber si un elemento est duplicado, hace uso del mtodo:

296

297

MODULO 3

Unidad 3.2 Estructura de datos

Ejemplo: Utilizacin de java.util.TreeSet


import java.util.*;
public class TestTreeSet
{
public static void main(String[] args)
{
TreeSet ciudades = new TreeSet();
ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add("Sevilla");
ciudades.add("Madrid"); // Repetido.
Iterator it = ciudades.iterator();

while(it.hasNext())
System.out.println("Ciudad: " + it.next());

Ejemplo: Utilizacin de java.util.LinkedHashSet

}
}

import java.util.*;
public class TestLinkedHashSet
{
public static void main(String[] args)
{
LinkedHashSet ciudades = new LinkedHashSet();
ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add("Sevilla");
ciudades.add("Madrid"); // Repetido.
Iterator it = ciudades.iterator();
while(it.hasNext())
System.out.println("Ciudad: " + it.next());
}
}

2.3 java.util.List
El interfaz List hereda del interfaz Collection. Representa colecciones con elementos en secuencia. Es decir, con orden.
Permite tener duplicados.
Es accesible mediante ndice, de manera que se puede:
x

298

Acceder a un elemento concreto de una posicin.

299

MODULO 3

Unidad 3.2 Estructura de datos

Insertar un elemento en una posicin concreta.

java.util.LinkedList: Es nueva en el SDK 1.2.x. Ofrece un

tiempo de acceso ptimo cuando dicho acceso es para aadir o eliLos mtodos que aade este interfaz, para acceso posicional son:
x

Object get(int index); // Devuelve el elemento de la posi-

minar elementos del comienzo y final de la lista (tpico para pilas).


x

java.util.Vector: Es como el ArrayList, pero sincronizado,

cin indicada en el parmetro.

lo que penaliza notablemente el rendimiento. La sincronizacin es

importante cuando ms de un thread (hilo de ejecucin) va a acceder

Object set(int index, Object element); // Reemplaza el

elemento de la posicin indicada en el parmetro, con el elemento


del parmetro.
x

a la coleccin (los threads se vern en ms detalle en la Unidad 3.7.


x

void add(int index, Object element); // Inserta el ele-

import java.util.*;

mento pasado por parmetro, en la posicin pasada por parmetro.


x

public class TestArrayList


{
public static void main(String[] args)
{
ArrayList ciudades = new ArrayList();

Object remove(int index); // Elimina el elemento de la

posicin indicada por parmetro. Devuelve el objeto borrado.


x

Ejemplo: Utilizacin de java.util.ArrayList y java.util.Iterator

ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add(1,"Sevilla");
ciudades.add("Madrid"); // Repetido.

boolean addAll(int index, Collection c); // Inserta todos

los elementos pasados por parmetro, en la posicin pasada por parmetro.

Iterator it = ciudades.iterator();

Los mtodos que aade este interfaz para operaciones de bsqueda son:
x

while(it.hasNext())
System.out.println("Ciudad: " + it.next());
}

int indexOf(Object o); // Devuelve la posicin de la pri-

mera ocurrencia del elemento pasado por parmetro.


x

int lastIndexOf(Object o); // Devuelve la posicin de la

ltima ocurrencia del elemento pasado por parmetro.


Los mtodos que aade este interfaz para obtener subcolecciones son:
x

List subList(int from, int to); // Devuelve una lista con

los elementos comprendidos entre las posiciones pasadas por parmetro.


A continuacin se enumeran las distintas implementaciones de este interfaz:
x

Ejemplo: Utilizacin de java.util.ArrayList

java.util.ArrayList: Es nueva en el SDK 1.2.x. Ofrece un

tiempo de acceso ptimo cuando dicho acceso es aleatorio.

import java.util.*;
public class TestArrayList2
{

300

301

MODULO 3

Unidad 3.2 Estructura de datos

public static void main(String[] args)


{
ArrayList ciudades = new ArrayList();
ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add(1,"Sevilla");
ciudades.add("Madrid"); // Repetido.
for(int i=ciudades.size()-1; i >=0; i--)
System.out.println("Ciudad: " + i + " es: " +
ciudades.get(i));
}
}

Ejemplo: Utilizacin de java.util.Vector


import java.util.*;
public class TestVector
{
public static void main(String[] args)
{
Vector ciudades = new Vector();

ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add(1,"Sevilla");
ciudades.add("Madrid"); // Repetido.
Ejemplo: Utilizacin de java.util.LinkedList
for(int i=ciudades.size()-1; i >=0; i--)
System.out.println("Ciudad: " + i + " es: " +
ciudades.get(i));

import java.util.*;
}
public class TestLinkedList
{
public static void main(String[] args)
{
LinkedList ciudades = new LinkedList();

ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add(1,"Sevilla");
ciudades.add("Madrid"); // Repetido.
Iterator it = ciudades.iterator();
while(it.hasNext())
System.out.println("Ciudad: " + it.next());
}
}

302

303

MODULO 3

Unidad 3.2 Estructura de datos

Los mtodos que realizan operaciones de obtencin de colecciones son:

2.4 java.util.Map
El interfaz Map no hereda del interfaz Collection. Representa colecciones con

parejas de elementos: clave y valor.

va.util.Set.

No permite tener claves duplicadas. Pero si valores duplicados.

public Set keySet(); // Devuelve las claves en un ja-

public Collection values(); // Devuelve los valores en un

java.util. Collection.
Para calcular la colocacin de un elemento se basa en el uso del mtodo:
A continuacin enumeramos las distintas implementaciones de este interfaz:
public int hashCode();
Los mtodos bsicos de este interfaz son:
x

Object put(Object key, Object value); // Inserta una

pareja de clave/valor pasados como parmetros.


x

Object get(Object key); // Accede al valor de una clave

pasada como parmetro.


x

Object remove(Object key); // Elimina una pareja de

clave/valor pasados como parmetros, devolviendo el objeto borrado.


x

boolean containsKey(Object key); // Comprueba la

boolean containsValue(Object value); // Comprueba la

existencia de un valor pasado como parmetro.


x

int size(); // Indica el nmero de pareja que contiene.

boolean isEmpty(); // Indica s no contiene ninguna pare-

ja.
Los mtodos que realizan operaciones masivas son:
x

void putAll(Map t); // Aade todas las parejas que existen

en el parmetro t.
x

304

java.util.HashMap: Es nueva en el SDK 1.2.x. Ofrece un

tiempo de acceso ptimo cuando dicho acceso es aleatorio. Su orden


de iteracin es imprevisible.
x

java.util.Hashtable: Es la versin sincronizada de Hash-

Map.
x

java.util.LinkedHashMap: Es nueva en el SDK 1.4.x. Su

orden de iteracin es el de insercin.


x

java.util.TreeMap: Su orden de iteracin depende de la

implementacin

existencia de una clave pasada como parmetro.


x

void clear(); // Elimina todas las parejas de clave/valor.

que

los

elementos

hagan

del

interfaz

ja-

va.lang.Comparable, mediante la implementacin del mtodo public int compareTo(Object o);


x

Ejemplo: Utilizacin de java.util.HashMap


import java.util.*;
public class TestHashMap
{
public static void main(String[] args)
{
HashMap codigos = new HashMap();
codigos.put("01","Urgente");
codigos.put("02","Importante");
codigos.put("03","Normal");
codigos.put("04","Baja prioridad");
System.out.println("Aleatorio 03: " + codigos.get("03"));
System.out.println("Aleatorio 01: " + codigos.get("01"));
Set s = codigos.keySet();
Iterator it = s.iterator();
while(it.hasNext())
{
String aux = (String)it.next();

305

MODULO 3

Unidad 3.2 Estructura de datos

System.out.println(aux + ": " + codigos.get(aux));


}
}
}

x
x

Ejemplo: Utilizacin de java.util.LinkedHashMap


import java.util.*;

Ejemplo: Utilizacin de java.util.HashTable


import java.util.*;
public class TestHashtable
{
public static void main(String[] args)
{
Hashtable codigos = new Hashtable();
codigos.put("01","Urgente");
codigos.put("02","Importante");
codigos.put("03","Normal");
codigos.put("04","Baja prioridad");

public class TestLinkedHashMap


{
public static void main(String[] args)
{
LinkedHashMap codigos = new LinkedHashMap();
codigos.put("01","Urgente");
codigos.put("02","Importante");
codigos.put("03","Normal");
codigos.put("04","Baja prioridad");
System.out.println("Aleatorio 03: " + codigos.get("03"));
System.out.println("Aleatorio 01: " + codigos.get("01"));
Set s = codigos.keySet();
Iterator it = s.iterator();
while(it.hasNext())
{
String aux = (String)it.next();
System.out.println(aux + ": " + codigos.get(aux));
}

System.out.println("Aleatorio 03: " + codigos.get("03"));


System.out.println("Aleatorio 01: " + codigos.get("01"));
Set s = codigos.keySet();
Iterator it = s.iterator();
while(it.hasNext())
{
String aux = (String)it.next();
System.out.println(aux + ": " + codigos.get(aux));
}

}
}

}
}

306

307

MODULO 3

Unidad 3.2 Estructura de datos

Ejemplo: Utilizacin de java.util.TreeMap


import java.util.*;
public class TestTreeMap
{
public static void main(String[] args)
{
TreeMap codigos = new TreeMap();
codigos.put("04","Baja prioridad");
codigos.put("01","Urgente");
codigos.put("03","Normal");
codigos.put("02","Importante");
System.out.println("Aleatorio 03: " + codigos.get("03"));
System.out.println("Aleatorio 01: " + codigos.get("01"));
Set s = codigos.keySet();
Iterator it = s.iterator();
while(it.hasNext())
{
String aux = (String)it.next();
System.out.println(aux + ": " + codigos.get(aux));
}
}
}

2.5 Generics
Se trata de una de las grandes novedades que introdujo Java SE 5.0
Permite tipar el contenido de las colecciones, de manera que se restringe el
tipo utilizado y se elimina el uso masivo de castings.
Para definir el tipo del contenido de una coleccin se utiliza <tipo>:
tipo_coleccion<tipo_contenido> identificador = null;
identificador = new tipo_coleccion<tipo_contenido>();
x

Ejemplo: List<String> lista = new ArrayList<String>();


En este caso, se trabajara utilizando Strings directamente sin
necesidad de casting alguno:
String elemento = lista.get(0);

En el caso de colecciones de tipo Map, se definira tanto el tipo de las claves


como el de los valores:
Map<Integer,String> mapa = new HashMap<Integer,String>();

308

309

MODULO 3

Unidad 3.2 Estructura de datos

3. Importancia de los mtodos equals() y hashCode()

Imaginemos que hacemos un get del Map y el compartimento correspondiente tiene


colisiones. Qu valor nos devuelve?

Siempre que creemos nuestras propias claves para el uso de los Map, debemos sobreescribir los mtodos equals() y hashCode().

Lo sabe mediante el uso del mtodo equals() de la clave. Va iterando por todas las
claves de ese compartimento para encontrar la que se ha pedido.

El motivo es que los Map utilizan estos dos mtodos para llevar a cabo tanto las
inserciones como las extracciones de valores.

Imaginemos que hacemos un put en el Map con una clave ya existente. Cmo sabe que ya existe y que hay que machacar el valor anterior?

Para entender mejor el uso de estos dos mtodos por parte de los Map, veamos un
poco ms en detalle la estructura interna de este tipo de coleccin.

Lo sabe mediante el uso del mtodo equals() de la clave. Itera para comprobar si
ya existe.

La estructura interna de un Map es la siguiente:


La implementacin del mtodo equals() debe cumplir las siguientes normas:
x

Reflexiva: x.equals(x) debe devolver true.

Simtrica: Si x.equals(y) devuelve true, y.equals(x) debe

devolver tambin true.


x

Transitiva: Si x.equals(y) devuelve true, e y.equals(z) de-

vuelve true, x.equals(z) debe devolver tambin true.


x

Consistente: Si x.equals(y) devuelve true, entonces las su-

cesivas invocaciones de x.equals(y) sin haber modificado el estado


de x o y deben seguir devolviendo true.

Un Map internamente contiene una secuencia de compartimentos (buckets) donde


se van almacenando todos los valores (clave/valor).
Para decidir en qu compartimento se almacena un valor, se llama al mtodo hashCode() del objeto utilizado como clave.

Null: x.equals(null) siempre debe devolver false.

Ejemplo: Sobreescritura del mtodo equals


public class TestEquals
{
private int valor1;
private Integer valor2;
public boolean equals(Object o)
{
if(this == o) // Primer paso.
return true;
if(!(o instanceof TestEquals)) // Segundo paso.
return false;
TestEquals param = (TestEquals)o; // Tercer paso.
return param.valor1 == valor1 &&
param.valor2.equals(valor2);
}

Pero pueden ocurrir colisiones, es decir, que un compartimento ya est utilizado por
una pareja clave/valor. Esto puede ser debido a que:
x

Dos objetos distintos devolvieron el mismo cdigo hash.

Dos cdigos hash distintos correspondieron al mismo com-

partimento.
310

311

MODULO 3

Unidad 3.2 Estructura de datos

public class TestHashCode


{
private int valor1;
private Integer valor2;

public static void main(String[] args)


{
TestEquals test1 = new TestEquals(1, new Integer(2));
TestEquals test2 = new TestEquals(1, new Integer(2));
System.out.println(test1.equals(test2));
}

public int hashCode()


{
StringBuffer buffer = new StringBuffer();
buffer.append(Integer.toString(valor1));
buffer.append(valor2.toString());
return buffer.toString().hashCode();
}
}

public static void main(String[] args)


{
TestHashCode test1 = new TestHashCode(1, new Integer(2));
TestHashCode test2 = new TestHashCode(1, new Integer(2));
System.out.println(test1.hashCode());
System.out.println(test2.hashCode());
}

La implementacin del mtodo hashCode() debe cumplir las siguientes normas:


x

La ejecucin sucesiva del mtodo hashCode() sobre un

mismo objeto sin haber modificado su estado interno entre medias,


debe devolver siempre el mismo cdigo hash.
x

Si x.equals(y) devuelve true, entonces tanto x como y de-

ben generar el mismo cdigo hash.


x

Sin embargo, si x.equals(y) devuelve false, no es obligato-

rio que tanto x como y deban generar un cdigo hash distinto. No

El mtodo equals() tambin es importante para el resto de Colecciones.

obstante es lo deseable para evitar en la medida de lo posible las colisiones en los Map y por tanto ofrecer un mejor rendimiento.

Por ejemplo, cmo funcionan los mtodos contains(), add() y remove() de las colecciones?

La implementacin del mtodo hashCode() no es una tarea tan trivial. No obstante,


aqu proponemos dos sugerencias bastante sencillas:
x

equals() de todos los objetos de la coleccin. Para borrarlo de una coleccin, se le


Convertir a String los valores de los distintos atributos de la

clase. Concatenarlos y delegar la generacin del cdigo hash en el


mtodo hashCode() del String resultante (la clase String posee una
implementacin bastante eficaz del mtodo hashCode()).
x

Sumar el cdigo hash de cada uno de los atributos de la

clase (los wrappers de tipos primitivos tambin tienen sobreescrito el


mtodo hashcode()).
x

312

Para saber si un objeto est contenido en una coleccin se va llamando al mtodo

Ejemplo: Sobreescritura del mtodo hashcode

busca de igual forma. Y para aadirlo en un Set que no permite duplicados, lo mismo.
x

Ejemplo: Sobreescritura del mtodo equals


public static void main(String[] args)
{
TestEquals test1 = new TestEquals(1, new Integer(2));
List list = new ArrayList();
list.add(test1);
TestEquals test2 = new TestEquals(1, new Integer(2));
System.out.println(list.contains(test2));
}

313

MODULO 3

Unidad 3.2 Estructura de datos

PRCTICA A: Desarrollar, tanto en la JDK de Sun como en Eclipse, un sistema de


gestin de un garaje siguiendo estas especificaciones.

4. Arrays vs. Colecciones

En el garaje se cambian las ruedas tanto de coches como de motos. El precio del
cambio de una rueda se fija al abrir el garaje, al igual que la capacidad mxima de

A continuacin mostraremos un resumen de las caractersticas vistas en esta Uni-

vehculos, ya sean motos o coches. Si no hubiese hueco para registrar un vehculo

dad tanto de los Arrays como de las Colecciones, que nos permitirn poder discernir

nuevo, habr que tener contemplado un sistema de aviso para quien est dejando

cuando utilizar un tipo u otro.

su vehculo.

Las caractersticas de los Arrays son:

El sistema de gestin del garaje requiere un mecanismo para ingresar y retirar los

Tamao esttico.

Su tamao se conoce mediante el atributo length.

Puede almacenar tanto tipos primitivos como tipos comple-

vehculos, conocer el nmero total de vehculos recibidos en ese momento, el precio

medio de todos ellos.


La informacin que manejaremos de los coches entre otras cosas es la marca y el
nmero de puertas. Mientras que de las motos ser la marca y la cilindrada.

jos.
x

que supondra cambiar todas las ruedas de todos los vehculos, y el kilometraje

Solo pueden albergar elementos de un tipo.

Las

clases

relacionadas

con

los

vehculos

se

guardarn

en

el

paquete

es.java.aula.mentor.practicas31.vehiculos mientras que el Garaje y PracticaA se

Las caractersticas de las Colecciones son:

guardarn en el paquete es.java.aula.mentor.practicas31.

Tamao dinmico.

Su tamao se conoce mediante el mtodo size().

toda la informacin general del garaje as como la informacin de cada vehculo.

Solo puede almacenar tipos complejos.

NOTA: Realizar esta prctica mediante Arrays.

Puede albergar elementos de distinto tipo.

Solucin con la JDK De Sun

La clase PracticaA tiene un mtodo main en el que se crea un Garaje, una serie de
vehculos que se irn recibiendo en el garaje y por ltimo se imprimir por pantalla

En el caso de que no est puesta la variable de entorno PATH, abrir una sesin DOS
y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar
las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le
aadimos %PATH%.
314

315

MODULO 3

Unidad 3.2 Estructura de datos

Creamos un directorio de trabajo donde guardar el programa Java.

Creamos los directorios donde van a estar nuestras clases


es\java\aula\mentor\\practicas31 y es\java\aula\mentor\\practicas31\vehiculos

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

Desde el directorio es\java\aula\mentor\practicas31\vehiculos, con un editor de


texto (por ejemplo Notepad) vamos a escribir el cdigo fuente de nuestras clases
java; el nombre del fichero de la clase debe ser exactamente igual (incluyendo maysculas y minsculas) al de la clase Java que vamos a desarrollar.

316

Empezamos con la clase Vehiculo.java

317

MODULO 3

Unidad 3.2 Estructura de datos

El cdigo del interface podra quedar como sigue:

Ahora toca el turno a la clase Moto que tambin implementa el interface Vehiculo

Seguimos con la clase Coche que implementa el interface Vehiculo

Ya

podemos

implementar

la

clase

Garaje,

desde

el

directorio

es\java\aula\mentor\practicas31

318

319

MODULO 3

Unidad 3.2 Estructura de datos

Para compilar un posible orden sera el siguiente:

Para ejecutar la aplicacin

Por ltimo la clase PracticaA, que contiene el mtodo main podra quedar como sigue:

Ahora realizaremos la misma prctica con Eclipse

Arrancar Eclipse, ejecutando c:\eclipse3.5.2\eclipse.exe


Seleccionar la ubicacin del workspace (o rea de trabajo).

320

321

MODULO 3

Unidad 3.2 Estructura de datos

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


ella

Aparecer la pantalla para empezar a trabajar.

Crear un proyecto nuevo de nombre Practicas31

Darle el nombre y seleccionar Finish.


Crear un interface Java nuevo llamado Vehiculo, especificando el paquete
es.java.aula.mentor.practicas31.vehiculos

322

323

MODULO 3

Unidad 3.2 Estructura de datos

La interface quedara como sigue:

A continuacin creamos la clase Coche, en el mismo paquete que el interface Vehiculo e indicamos que vamos a implementar dicho interface

324

325

MODULO 3

Unidad 3.2 Estructura de datos

// Constructores.
public Garaje(int param1, int param2)
{
vehiculos = new Vehiculo[param1];
precio = param2;
}
// Mtodos.
public boolean ingresarVehiculo(Vehiculo param)
{
boolean sw = false;
for(int i=0; i<vehiculos.length; i++) {
if(vehiculos[i] == null) {
sw = true;
vehiculos[i] = param;
break;
}
}
return sw;
}

Realizamos el mismo proceso para la clase Moto

public void retirarVehiculo(Vehiculo param)


{
for(int i=0; i<vehiculos.length; i++) {
if(vehiculos[i] == param) {
vehiculos[i] = null;
break;
}
}
}
public Vehiculo[] getVehiculos()
{
Vehiculo[] temp = new Vehiculo[this.getNumVehiculos()];
for(int j=0, i=0; j<temp.length && i<vehiculos.length; i++) {
if(vehiculos[i] != null) {
temp[j] = vehiculos[i];
j++;
}
}
return temp;
}
public double getKilometrajeMedio()
{
int cont = 0;
double acum = 0;
for(int i=0; i<vehiculos.length; i++) {
if(vehiculos[i] != null) {
cont++;
acum += vehiculos[i].getKilometraje();
}
}
return acum / cont;
}

Creamos la clase Garaje en el paquete es.java.aula.mentor.practicas31, que es la


que va a contener a los distintos vehiculos
package es.java.aula.mentor.practicas31;
import es.java.aula.mentor.practicas31.vehiculos.Vehiculo;
public class Garaje {
// Atributos.
private Vehiculo[] vehiculos = null;
private int precio = 0;

326

public int getCosteTotal()


{
int acum = 0;
for(int i=0; i<vehiculos.length; i++) {
if(vehiculos[i] != null)
acum += vehiculos[i].getNumRuedas();
}
return acum * precio;
}
public int getNumVehiculos()
{
int cont = 0;
for(int i=0; i<vehiculos.length; i++) {

327

MODULO 3

Unidad 3.2 Estructura de datos

if(vehiculos[i] != null)
cont++;
}
return cont;
}
}

Finalizamos creando la clase PracticaA, marcando que nos cree el mtodo main

Verificar que todas las clases estn grabadas. Para ello utilizar Ctrl + S en cada clase o en File -> Save All
Para ejecutar la aplicacin, seleccionar encima de la clase PracticaA con el botn
derecho del ratn Run As -> Java Application

quedando la clase de la siguiente manera:

328

329

MODULO 3

Unidad 3.2 Estructura de datos

PRCTICA B: Desarrollar, tanto en la JDK de Sun como en Eclipse, un sistema de


gestin de pacientes.
Tendremos un archivador donde iremos guardando todas las fichas de los pacientes. Las fichas contienen la siguiente informacin: nombre, apellidos y edad.
Todas las fichas que vayamos creando, se podrn guardar o eliminar del archivador. Al archivador tambin le podremos pedir un listado. Este listado consistir en
imprimir por pantalla el nmero de fichas guardadas, as como el contenido de las
fichas.
Todas las clases se guardarn en el paquete es.java.aula.mentor.practicas31.
La clase PracticaB tiene un mtodo main en el que se crea un archivador, dos o
tres fichas que se guardarn en el archivador, se listar el contenido, se eliminar
alguna ficha y se volver a listar su contenido.
NOTA: Realizar esta prctica mediante Colecciones.
Reutilizaremos los directorios, paquetes .... realizados en la PracticaA.
Solucin con la JDK De Sun
En el directorio es\java\aula\mentor\practicas31\, mediante el notepad, creamos la
clase Ficha

330

331

MODULO 3

Unidad 3.2 Estructura de datos

A continuacin nos creamos la clase Archivador, que es la que va a contener a las


fichas
El orden de compilacin debe de ser el siguiente:

Por ltimo nos creamos la clase PracticaB con el main.

332

Ejecutamos la prctica

333

MODULO 3

Unidad 3.2 Estructura de datos

Y finalmente con la clase PracticaB


Ahora realizaremos la misma prctica con Eclipse. Arrancar Eclipse, ejecutando
c:\eclipse3.5.2\eclipse.exe
Seleccionar la ubicacin del workspace (o rea de trabajo).
Ya tenemos creado el proyecto Practicas31, utilizado en la Prctica A. Vamos a
crear la clase Ficha, perteneciente al paquete es.java.aula.mentor.practicas31

Ejecutamos la clase, obteniendo la siguiente salida

Continuamos con la clase Archivador

334

335

MODULO 3 JAVA AVANZADO

Unidad 3.1 Estructura de datos

En esta Unidad hemos visto como trabajar con los conjuntos de datos, como una sola variable u objeto. Los dos grandes grupos que permiten tratar con conjuntos de

java.util.Map que trabaja con elementos del tipo clave/valor. Se clasifican


a su vez en:
-

datos son:

java.util.HashMap: Ofrece un tiempo de


acceso ptimo cuando dicho acceso es

aleatorio.

Arrays:
-

Tienen un tamao esttico

Su tamao se conoce mediante el atributo length.

Puede almacenar tanto tipos primitivos como tipos


complejos.

Solo pueden albergar elementos de un tipo.

Tienen un tamao dinmico

Su tamao se conoce mediante mtodo size().

Puede almacenar solo tipo complejos, ya sean del

Colecciones:

mismo o distinto tipo.

Las Colecciones se clasifican en dos grandes grupos:


x

java.util.Collection que trabaja con elementos de tipos complejos de forma conjunta. Se clasifican a su vez en:
-

java.util.Set: Representa colecciones que no permiten tener elementos duplicados. java.util.HashSet se


utiliza para acceso aleatorio, java.util.LinkedHashSet
se utiliza para el acceso segn su orden de insercin
y java.util.TreeSet depende de la implementacin del
mtodo public int compareTo(Object o);

java.util.List: Representa colecciones que pueden

tener elementos duplicados. java.util.ArrayList utilizado para accesos aleatorios, java.util.LinkedList utilizado cuando se necesita aadir o eliminar elementos del comienzo y final de la lista y java.util.Vector
que es como el ArrayList, pero sincronizado.

java.util.Hashtable: Es la versin sincronizada de HashMap.

Anda mungkin juga menyukai