Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
de programacin
Java
Jordi Brnquez Jimnez
PID_00161680
FUOC PID_00161680 3 El lenguaje de programacin Java
ndice
Introduccin
Objetivos ................................................................................................... 6
Resumen .................................................................................................... 52
Actividades ............................................................................................... 53
Solucionario ............................................................................................. 54
Glosario ..................................................................................................... 54
Bibliografa .............................................................................................. 55
FUOC PID_00161680 5 El lenguaje de programacin Java
Introduccin
Objetivos
Desde 1996, cuando sali la versin 1.0, hasta la actualidad (ya existe la
versin 6.0), han aparecido varias versiones, y varias subversiones para
cada una de ellas que arreglaban posibles errores. Pero no slo han surgido
versiones para el desarrollo de aplicaciones de escritorio, sino que tambin
existe desde hace tiempo una versin reducida y adaptada, tanto del len-
guaje como de la mquina virtual, para ejecutar aplicaciones en dispositi-
FUOC PID_00161680 8 El lenguaje de programacin Java
Recordad
El lenguaje Java se considera un lenguaje de alto nivel. Java facilita mu-
Este nivel indica el grado de
cho las tareas de programacin, ya que permite programar sin tener en proximidad del lenguaje con la
cuenta la plataforma en la que ejecutan las aplicaciones. mquina.
Algunas de las caractersticas que podemos mencionar del lenguaje Java son
las siguientes:
Esta potencia que ofrece, junto con la facilidad de aprendizaje, han provocado
que Java sea uno de los lenguajes de programacin ms utilizados hoy en da,
tanto en entornos acadmicos como en entornos empresariales.
Aunque el lenguaje de programacin Java es un lenguaje pensado para el Podis ver los lenguajes orientados a
a
objetos puros e hbridos en el mdulo
paradigma de la programacin orientada a objetos, no lo podemos clasifi- Clases y objetos de esta asignatura.
car como un lenguaje orientado a objetos puros, dado que sus tipos b-
sicos no son objetos (aunque en las nuevas versiones los compiladores los
transforman en objetos directamente, sin la necesidad de realizar conver-
siones explicitas).
Esto significa que no podemos utilizar ciertas palabras para dar nombres ni a va-
riables ni a funciones. Veamos cuson las palabras reservadas del lenguaje Java.
Estas reglas son las que impone el lenguaje, pero para hacer lo ms inteligible
posible la utilizacin de las variables y funciones, es recomendable seguir los
criterios siguientes:
ventas S
No
aux2 Es mejor utilizar nombres ms descriptivos.
recomendable
ventasEnero S
ventasenero S
Cabe tener en cuenta que el lenguaje Java diferencia las maysculas de las
minsculas*. Por lo tanto, los dos ltimos identificadores son diferentes y * Un lenguaje que diferencia
maysculas y minsculas se dice
no identifican el mismo elemento. Hay que ir con cuidado y utilizar unos que es case sensitive.
Llegado a este punto y antes de continuar con las peculiaridades de Java, quiz
es conveniente ver qu aspecto tiene un programa sencillo para ir acostum-
brndonos a este lenguaje.
Observacin
public class HelloUOC {
public static void main(String[] args) { Aunque hay palabras que no
System.out.println("Welcome to UOC") entendemos (como public o
} static), s que se puede en-
} tender aproximadamente el
funcionamiento del programa.
1.2.1. Nmeros
qu tipos de datos tenemos y el rango de los valores que stos pueden al-
macenar.
Nmeros enteros
Los nmeros enteros son los que utilizamos normalmente para contar objetos,
por ejemplo: tres manzanas.
En Java tenemos diferentes tipos de datos para representar los nmeros ente-
ros. La principal diferencia es el rango numrico que podemos representar con
los diferentes tipos. En la tabla siguiente los vemos todos:
El modificador unsigned denota que los valores que se almacenan son nica-
mente positivos. Por lo tanto, tenemos el doble de espacio y podemos aprove- Para nmeros mayores
char el espacio reservado a los nmeros negativos para almacenar nmeros Si necesitramos nmeros ma-
yores, deberamos utilizar cla-
mayores. ses como, por ejemplo,
BigInteger, que permiten
almacenar nmeros de cual-
quier tamao.
De todos los tipos de los que disponemos para representar los enteros, el tipo
int ser el que utilizaremos normalmente, pero hay que tener en mente que
los otros existen por si debemos construir algn programa que los requiera.
Igual que nos sucede con los nmeros enteros, en Java tenemos ms de una
Notacin de Java
manera de representar los nmeros reales. En la siguiente tabla vemos un re-
sumen de los tipos bsicos disponibles. La notacin que utiliza Java
para la representacin de
nmeros decimales es la
propuesta por el IEEE 754.
Tipos Tamao en bytes Rango
Como podis ver en esta tabla, se pueden representar nmeros muy grandes
y, al mismo tiempo, nmeros muy pequeos con el mismo tipo de dato. En
este caso las posibles notaciones son dos:
1.2.2. Caracteres
Este tipo de datos suelen utilizarse para asociar valores constantes a nombres
y hacer ms inteligible el cdigo. Un ejemplo claro de tipo enumerado seran
los das de la semana o los meses del ao.
enum months {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP,
OCT, NOV, DEC};
Las enumeraciones en Java se tratan como las cadenas de texto que se utilizan
para identificar los elementos. Se puede obtener su traduccin a un valor de
tipo entero que nos indique la posicin, pero para nosotros eso resulta com-
pletamente transparente. Por lo tanto, las podemos utilizar como si fueran
nuevos tipos bsicos.
Observacin
days d = SUN;
... La notacin que utilizaremos
aqu no es exactamente la pro-
if (d == THU) { puesta porque la mayora de
... las enumeraciones se definirn
dentro de una clase. Retomare-
}
mos esta cuestin cuando vea-
mos las clases.
1.2.4. Constantes
Las constantes por s mismas no son ningn tipo de datos, pero vale la pena
mencionarlas en este apartado.
Para la declaracin de las constantes hay que utilizar la palabra final con el
fin de denotar que una vez asignado el valor ya no se podr cambiar; y poste-
riormente el tipo de dato que almacenaremos.
El tipo de dato booleano es aquel que puede tomar los valores cierto
o falso.
Al contrario que en otros lenguajes, en Java hay un tipo de datos que nos ayuda
a representar este concepto y no es necesario utilizar enteros para su representa-
cin. Los posibles valores que puede tomar son true (cierto) y false (falso).
1.3. Operadores
Los operadores son smbolos del lenguaje que nos permiten realizar
operaciones con los elementos implicados (tambin denominados ope-
randos). Los operadores pueden ser de distinto tipo segn su funciona-
lidad y el nmero de operandos que reciben.
Un concepto que hay que tener claro antes de empezar a ver qu operadores
tiene el lenguaje Java es el concepto de expresin. Una expresin es una com-
binacin de valores, funciones, operadores y otras expresiones que, utilizando
las reglas de precedencia de los operadores que las forman, generan un resul-
tado (otra expresin).
operator op1
FUOC PID_00161680 15 El lenguaje de programacin Java
En Java, este operador se simboliza con un smbolo de igual (=). Las asigna-
ciones pueden ser entre una variable y un valor o entre dos variables:
int var1;
int var2;
var1 = 3;
var2 = var1;
En las asignaciones entre dos variables hay que evitar que se pierda informa-
cin en la asignacin o que puedan producirse desbordamientos: Efectos no deseados
Hay que puntualizar que cualquier operacin que resulte en un valor entero
(suma, resta, multiplicacin y mdulo de nmeros enteros) siempre ser de
tipo int si el valor resultante puede ser representado por entero; en caso con-
trario, se utilizar el tipo long.
== Igual que 3 == 3 3 == 4
!= Diferente de 2 != 7 2 != 2
Los operadores lgicos son los que utilizamos para operar con valo-
res booleanos. El resultado de estas operaciones es siempre un valor
booleano.
FUOC PID_00161680 17 El lenguaje de programacin Java
Una curiosidad sobre los operadores lgicos && y || es que evalan las expre-
siones por orden (lo que no sucede con los otros operadores), de modo que el
resultado de la operacin, dejamos de valorar la expresin. Es decir, en el
ejemplo anterior, el operador && evaluara primero expresion1 y, en caso de
que fuera cierta, como todava no podemos garantizar el resultado, evaluara
el segundo operando (expresion2). En caso contrario, se dejara de evaluar
la expresin y se dara directamente el resultado de falso. En el caso de una
OR, la expresin se deja de evaluar cuando uno de los operandos produce un
resultado de cierto.
La operacin XOR lgica no est contemplada dentro del lenguaje Java, pero
se puede escribir fcilmente como:
En un ordenador todos los datos se transforman en ceros (0) y unos (1). Por lo
Trabajar a nivel de bit...
tanto, se necesitan algunas operaciones para trabajar a nivel de bit con los va-
lores de los datos. ... significa que las operaciones
se ejecutan bit a bit y que el re-
sultado de la operacin es el
valor de concatenar todos los
De las 6 operaciones existentes para trabajar a nivel de bit, hay tres formatos bits.
~ complemento a 1 ~5 = 65530 ,
Los operandos que utilizaremos para estos ejemplos sern nmeros enteros de
8 bits sin signo con el fin de facilitar los clculos. stos son:
1 0 1 0 1 1 1 1 = 175
& 0 0 1 1 0 0 0 1 = 49
0 0 1 0 0 0 0 1 = 33
Estos mtodos utilizan las tablas de verdad como las operaciones lgicas, que
podemos resumir en:
0 0 0 0 0 1 0 0 1 0 1
1 0 1 1 1 1 1 1 0 1 0
Veamos un ejemplo de esto para eliminar dudas. Haremos 175 >> 3, 49 << 1,
y 8 >>> 2: Desplazamiento del bit
Los operadores que acabamos de ver sirven para evaluar una o dos expresiones
(dependiendo del operador) y devuelven el valor resultante.
FUOC PID_00161680 19 El lenguaje de programacin Java
En Java existen una serie de operadores que nos permiten realizar algunas ope-
Los operadores ++ y
raciones sin haber de escribir tanto, pero que a menudo ayudan a hacer el c-
digo ms claro. Los operadores ++ i se de-
nominan postincremento y
postdecremento cuando se
Notacin larga escriben a la derecha de la va-
Operador Ejemplo Resultado riable y suelen utilizarse mu-
(equivalente)
chas veces en los incrementos
+= i = 3; i += 5 i = 3; i = i + 5 i = 8 de los bloques iterativos.
Cuando se escriben a la iz-
-= i = 3; i -= 5 i = 3; i = i - 5 i = -2 quierda de la variable, se deno-
minan operadores de
*= i = 3; i *= 5 i = 3; i = i * 5 i = 15 preincremento y predecre-
mento.
/= i = 3; i /= 5 i = 3; i = i / 5 i = 0
%= i = 3; i %= 5 i = 3; i = i % 5 i = 3
|= i = 3; i |= 5 i = 3; i = i | 5 i = 7
^= i = 3; i ^= 5 i = 3; i = i ^ 5 i = 6
++ i = 3; i++ i = 3; i = i + 1 i = 4
-- i = 3; i-- i = 3; i = i - 1 i = 2
No todas estas abreviaciones suelen ser de uso comn dentro de los progra-
mas, pero es interesante conocerlas para poder entender el cdigo de otros
programadores.
En Java existe un operador especial, ya que recibe tres operandos, con el for-
mato siguiente:
Este operador evala op1 (que debe ser una expresin booleana) y dependien-
do del resultado devuelve como valor resultante el valor de la expresin op2
(en caso de que op1 sea cierto) o el valor de la expresin op3 (en caso de que
sea falso).
Hasta ahora las expresiones que hemos escrito han sido muy sencillas y no he-
mos tenido ningn problema para averiguar su resultado final, pero se pueden
escribir expresiones tan complejas como se quiera.
En ocasiones no hace falta que las operaciones sean muy complejas para llegar
a perderse a la hora de saber qu resultado dar. Por ejemplo, esta operacin:
i = - 3 + 4 * 5
i = -((3 + 4) * 5) i = -35
i = -(3 + (4 * 5)) i = -23
i = (-(3 + 4)) * 5 i = -35
i = (-3 + 4) * 5 i = 5
i = -3 + (4 * 5) i = 17
frmula matemtica. Por lo tanto, es necesario que el lenguaje defina un Siempre podemos utilizar los
parntesis para deshacer la
mtodo para deshacer la ambigedad de estas frmulas (sin la necesidad de ambigedad de cualquier ex-
presin.
utilizar parntesis).
Multiplicacin %, *, /
Aditivos +, -
&
Bit a bit ^
&&
Lgicos
||
Ternario ? : precedencia
i = 3;
i = ++i + i * j;
i = 3;
i_aux = i * j;
i = ++i + i_aux;
FUOC PID_00161680 22 El lenguaje de programacin Java
Para definir una matriz en Java, hay que indicar el tipo de datos que se alma-
cenarn, el nombre con el que se identificar y el nmero mximo de elemen-
tos que se quieren almacenar. Si queremos definir una matriz que se denomine
days para almacenar un nmero para cada da de la semana, lo haramos de
la siguiente manera:
int j;
int days[7];
...
days[3] = 5;
j = days[5];
Hay que tener en cuenta que en Java, como en otros lenguajes de programa-
cin, las matrices empiezan en la posicin 0. a
Los bloques condicionales son aquellos que sirven para tomar decisiones
y, segn el resultado de stas, ejecutar una serie u otra de instrucciones.
En el lenguaje Java, hay tres estructuras sintcticas que nos permiten escribir sen-
tencias condicionales: los bloques if-else, else-if y switch. En realidad, las
tres estructuras son equivalentes, es decir, las dos ltimas no dejan de ser una ma-
nera ms cmoda de expresar una composicin de sentencias if-else, pero pro-
porcionan ms claridad al cdigo.
1) Bloque if-else
El bloque if-else sirve para denotar dos bloques de instrucciones que se de-
ben ejecutar de manera excluyente, segn la evaluacin de una expresin l-
gica. Por ejemplo, podemos expresar trminos como si es el lunes hacer... en
caso contrario....
cionales que slo sirven para delimitar un bloque de instrucciones que se de- ... utilizar siempre llaves para
hacer ms inteligible el cdigo.
ben ejecutar segn el resultado de la expresin.
if (expression) {
// true expression
}
2) Bloque else-if
El bloque anterior nos sirve si queremos discriminar entre el valor cierto y falso
de una expresin, pero resulta incmodo si queremos ejecutar un bloque de ins-
trucciones diferente segn el valor de diversas condiciones, como por ejemplo,
expresar condiciones del tipo si es lunes hacer... si es martes... si es mircoles....
Si nos fijamos un poco, veremos que esta construccin no deja de ser una cons-
truccin if-else en la que los segundos bloques de acciones (los del else) no
tienen claves. a
FUOC PID_00161680 25 El lenguaje de programacin Java
3) Bloque switch
El bloque switch nos ayuda a escribir condiciones en las que queremos eva-
luar una expresin y realizar una serie de operaciones u otras segn el resulta-
do. En realidad, estas condiciones se pueden escribir tambin con una
sucesin de bloques if-else, pero resulta mucho ms cmodo hacerlo con
la construccin switch.
switch (expression) {
case (value1) :
// Code for value1
break;
case (value2) :
// Code for value2
break;
...
default :
// Code for other values
}
La expresin tiene que devolver un valor de tipo char o cualquier tipo de da-
if y switch
tos que se pueda convertir en un entero sin perder precisin (byte, short,
int), que se compara con los valores de las clusulas case y se ejecuta el c- Al contrario que la instruccin
if, en el bloque switch la ex-
digo de la clusula que corresponda. Todos los valores de las clusulas case presin no se evala a cierto
o falso.
deben ser diferentes. En caso de que no se cumpla ninguna de las clusulas, se
ejecutara el cdigo de la clusula default, que se considera la accin por de-
fecto, en caso de que la haya. Si esta clusula no existe, no se ejecutar ningn
bloque y se continuar con la instruccin siguiente.
Una vez que se haya encontrado un valor que sea igual al resultado de la ex-
presin, se ejecutar el cdigo hasta encontrar la sentencia break. Entonces
se sale de la ejecucin del bloque condicional y se contina a partir de la ins-
truccin siguiente. Si queremos ejecutar un mismo bloque de instrucciones
para diferentes valores, habr que escribir las instrucciones case una detrs de
la otra sin la palabra clave break.
switch (expression) {
case (value1) :
// Code for value1
case (value2) :
// Code for value1 & value2
break;
...
default :
// Code for other values
}
FUOC PID_00161680 26 El lenguaje de programacin Java
Las tres estructuras sirven para lo mismo, pero cada una tiene unas caracters-
ticas diferentes. Las veremos con ms detenimiento a continuacin.
1) Bloque while
El bloque while funciona de modo que las instrucciones dentro de este blo-
que se ejecutan de manera continuada mientras la condicin sea cierta. Cuan- Sabais que...?
do la evaluacin de la condicin de falso, entonces se pasar a ejecutar las Para crear un bucle infinito
basta slo con escribir:
instrucciones que hay a continuacin del bloque iterativo. La condicin se while(true)
evala antes de cada iteracin. a
FUOC PID_00161680 27 El lenguaje de programacin Java
Hay que ir con mucho cuidado con el fin de no codificar bucles infinitos, es
Funciones de cota
decir, trozos de cdigo que no dejan nunca ejecutarse. Los bucles infinitos son
Una funcin de cota es aquella
producidos principalmente por funciones de cota mal elegidas. que utilizamos para asegurar-
nos de que un bloque iterativo
se ejecutar siempre un nme-
ro fijo de veces.
2) Bloque do-while
do {
// actions
} while (condition);
En este caso tambin pueden aparecer bucles infinitos. Por lo tanto, hay que
tener cuidado al definir las funciones de cota.
3) Bloque for
Finalmente, para terminar con los bloques iterativos, tenemos el bloque for.
Utilizaremos esta construccin principalmente cuando queramos repetir cier-
tas instrucciones un nmero determinado de veces, por ejemplo recorrer los
elementos de una matriz.
La sintaxis que siguen los bloques iterativos que se construyen con la senten-
cia for es la siguiente:
Como hemos visto, el bloque for est compuesto por tres partes. Estas partes pue-
den estar vacas, pero recomendamos que siempre se pongan las sentencias de ini-
cializacin, condicin de control e incremento con el fin de hacer ms inteligible
el cdigo y evitar posibles problemas en la ejecucin.
Recordad
La sentencia break sirve para interrumpir la ejecucin de un bloque
La sentencia break tambin se
iterativo en cualquier momento. utiliza en el bloque switch.
1.6. Funciones
Todos los conceptos que hemos visto hasta ahora nos han permitido tener una
visin profunda del lenguaje de programacin Java para poder programar apli-
caciones sencillas que utilizan bloques iterativos, bloques condicionales y
operaciones matemticas.
Las funciones evitan al programador tener que repetir el mismo cdigo va-
rias veces y hacen ms inteligible el funcionamiento de un programa. Por
ejemplo, podramos tener una funcin que calculara la media aritmtica de
los valores de un vector de enteros, o el valor mximo, etc. (cualquier tarea
que se nos ocurra que hubiramos de utilizar varias veces dentro de nuestro
programa).
Para poder utilizar algo tan til para el programador como una funcin, antes
hay que definirla. La instruccin que define una funcin tambin se denomi-
na cabecera de la funcin.
Lo primero que deberemos decidir para una funcin es su nombre. Las funcio-
Podis ver las mismas convenciones de
a
nes, igual que las variables, siguen las mismas convenciones de nomenclatura. nomenclatura en Java en el
subapartado 1.1.4 de este mdulo.
As pues, intentaremos ponerles un nombre esclarecedor que nos permita in-
tuir qu tarea ejecuta la funcin. Por ejemplo, para nombrar una funcin que
calcule el mximo de dos nmeros enteros podemos utilizar max, int_max, o
cualquier otro nombre, pero es aconsejable utilizar un nombre bastante claro
(no sera adecuado utilizar como nombre min).
Otros puntos que habr que decidir para definir una funcin son el valor que
devuelve y los parmetros que recibe, lo cual veremos en los subapartados si-
guientes.
FUOC PID_00161680 30 El lenguaje de programacin Java
Como podis observar, no slo se pone el tipo del parmetro, sino tambin un
nombre identificativo del parmetro. Estos nombres son los que deberemos
utilizar dentro del cdigo de esta funcin para referirnos a los parmetros,
como si se tratara de variables declaradas normalmente. Estos nombres nica-
mente nos servirn dentro de la funcin.
Una funcin suele realizar un clculo o cualquier tarea que devuelve un resul-
tado. Hay que indicar de alguna manera cul es el tipo de datos que devuelve.
Como hemos visto en la definicin de funciones, el tipo de datos que ser de-
vuelto se indica antes de especificar el nombre que tendr y ste puede ser
cualquier tipo de datos de entre los que hemos explicado: int, double, char,
etc., o un objeto de una clase.
En el ejemplo del punto anterior, la funcin max devuelve un valor de tipo int.
return expression;
Aqu, expression puede ser cualquier expresin que genere un valor del
tipo definido en la cabecera de la funcin. Tan pronto se ejecuta una senten-
cia return, se retorna al punto del cdigo donde la funcin ha sido llamada.
Hay funciones que no devuelven ningn valor, ya sea porque modifican variables
globales, ya sea porque llevan a cabo tareas como la escritura en un archivo y/o
por pantalla. Estas funciones se pueden declarar de la misma manera que las otras,
nicamente hay que indicar que devuelven un elemento de tipo void.
FUOC PID_00161680 31 El lenguaje de programacin Java
Para aclarar las ideas sobre las funciones, veamos cmo sera una funcin que
calcula el mximo de dos enteros que se pasan como parmetro.
Esta funcin recibe dos parmetros de entrada, a y b, los dos enteros, y devuel-
ve el valor mximo.
int i;
i = max(3, 4);
if (8 < max(9,3)) {
...
}
Las variables locales son las que slo son accesibles desde dentro de un
bloque de instrucciones.
Las variables globales son aquellas que son accesibles desde cualquier
punto de la ejecucin del programa, incluso desde dentro de funciones
diferentes.
Como hemos visto, Java se puede utilizar para crear programas utilizando el
paradigma de la programacin estructurada pero, en realidad, donde se consi-
gue aprovechar al mximo la potencia del lenguaje es con la programacin
orientada a objetos. En este apartado veremos las posibilidades que nos ofrece
Java para el trabajo utilizando clases, concepto primordial de la programacin
orientada a objetos. Primero veremos cmo se define una clase, sus mtodos
y atributos. A continuacin, cmo esta clase se relaciona con otras clases con
el fin de modelar la realidad necesaria y resolver el problema planteado. Des-
pus, trataremos algunos temas avanzados para no quedarnos en la superficie,
pero dado que esto no es un manual de Java, sino slo una introduccin para
poder aprender los conceptos de la programacin orientada a objetos, otros te-
mas como la explicacin exhaustiva de la API de Java, o el diseo de interfaces
grficas quedarn excluidos del presente manual.
2.1.1. La clase
Para describir una clase en Java hay que definir y codificar todos los mtodos y
atributos que la componen. Crearemos un archivo con extensin .java en el Recordad
que escribiremos tanto la definicin de la clase, como su cdigo (en Java no hay En Java, la clase Person
tiene que estar en el archivo
otra manera de hacerlo). Veamos, en primer lugar, cul es la estructura del ar- Person.java; si no lo hace-
mos as, el compilador dar un
chivo de una clase y despus ya veremos cmo la llenamos de contenido. error.
MyFirstClass.java
La clase se define como public
para que se pueda utilizar desde
public class MyFirstClass { otros programas.
private int myVar;
Por una parte, se denotan los atributos y posteriormente las firmas de los m-
Para recordar el concepto de visibilidad,
todos, teniendo en cuenta su visibilidad. Aunque esta estructura no est im- podis repasar el mdulo Abstraccin y
clasificacin de esta asignatura.
puesta por el lenguaje, es una buena prctica para ganar en claridad en el
cdigo y permitir una mejor lectura a terceras personas.
Para mejorar nuestro cdigo se recomienda que todos los atributos sean priva-
dos y que slo se expongan mediante mtodos consultores y/o modificadores
aquellos que sean imprescindibles; de esta manera utilizamos el concepto de
ocultacin de informacin y el encapsulamiento.
Para declarar un atributo, basta describir cul ser su visibilidad, seguida del
tipo (puede ser tanto un tipo de dato bsico como cualquier objeto) y poste-
riormente su nombre.
Donde, como ya hemos comentado antes, hay que indicar inicialmente la visibi-
lidad que tendr el atributo, posteriormente el tipo y a continuacin el nombre
de ste (siguiendo las convenciones del subapartado 1.1.3 de este mdulo).
Person.java
Llegados a este punto, ya somos capaces de crear una clase con sus atributos.
Nuestro objetivo es tener una clase plenamente funcional con la que podamos
interaccionar invocando mtodos tanto para consultar datos de sta como
para modificar su estado.
Veamos cmo se debe llevar a cabo con el fin de poder definir mtodos en una
clase.
El mtodo constructor debe tener el mismo nombre que la clase que se define,
pero puede tener cualquier nmero de parmetros, segn se requiera.
Person.java
De la misma manera que tenemos un mtodo para crear una instancia de una
clase, hay un mtodo para destruir una instancia de una clase.
Person.java
En este caso no hemos efectuado ninguna tarea dentro del mtodo destructor,
dado que en el mtodo constructor no hemos pedido recursos, pero es algo
que debemos tener en cuenta para crear aplicaciones correctas.
Los dos tipos de mtodos anteriores nos han servido para iniciar una nueva
instancia de la clase y para liberar recursos una vez que se deje de utilizar esta
instancia. Ahora hemos de ver cmo definir el resto de mtodos de la clase: los
mtodos consultores y los mtodos modificadores.
Del mismo modo que hemos hecho con el mtodo constructor y el destructor,
hay que indicar la signatura de las operaciones: el nombre, el tipo del valor de
retorno (en caso de que no devuelva ningn valor hay que indicarlo mediante
la palabra void), y el nombre y tipo de cada parmetro.
Person.java
Person.java
...
public void setName(String pName) {
name = pName;
}
...
Person.java
...
public void setName(String name) {
name = name;
}
...
Por lo tanto, tenemos un problema dentro del mtodo setName, ya que no po-
demos diferenciar de manera clara el atributo name del parmetro name. Esta di-
ferenciacin se puede alcanzar mediante la palabra reservada this. a
FUOC PID_00161680 39 El lenguaje de programacin Java
Person.java
...
public void setName(String name) {
this.name = name;
}
...
La palabra reservada this tambin sirve para denotar que el mtodo que in-
vocamos est definido dentro de la misma clase. a
Los mtodos que hemos definido hasta ahora retornaban o modificaban in-
formacin en lo referente a la instancia de la clase sobre la que se invocaba el
mtodo. Ahora bien, nos puede interesar tener un mtodo que no dependa del
estado de la instancia sobre la que se ejecuta. Es decir, que devuelva un mismo
resultado para unos mismos parmetros, sin importar sobre qu instancia con-
creta se invoque. Estos mtodos se denominan mtodos static.
Un ejemplo de esto podra ser un mtodo que, dada una fecha, sumara o res-
Accesibilidad de los
tara una cierta cantidad de das. Lo normal sera implementarlo en una clase
mtodos
Date y definirlo de esta manera:
Un mtodo esttico slo puede
acceder a atributos estticos;
en cambio, un mtodo no es-
Data.java ttico puede acceder a atribu-
tos tanto estticos como no
public class Date { estticos.
...
public static Date addDates(Date pDate, int days) {
// some code here
}
}
MathOperation.java
MathOperation.java
As, el usuario sabe que esta clase le permite calcular sumas de nmeros y que
el mtodo utilizado siempre se denomina add.
2.2.1. Cardinalidad
Dado que hay diferentes tipos de cardinalidad (nmero exacto, rango de valo-
res y cardinalidades indefinidas), son necesarias maneras diferentes para cada
tipo. Veamos cmo se implementa cada una de estas tipologas.
Observamos que una instancia de ClassB siempre est relacionada con una
(1) nica instancia de ClassA. Por lo tanto, definiramos en ClassB el si-
guiente atributo del tipo ClassA para representar esta relacin:
ClassB.java
En este caso habra que crear un vector con capacidad para el nmero de ins-
Otra posibilidad
tancias con las que estar relacionado e insertar cada una de las instancias en
Otra manera de solucionar este
una posicin de ste. problema es utilizando la solu-
cin que propondremos para
los valores indefinidos
(subapartado 2.2.4).
Para hacerlo, habr que usar clases auxiliares que permitan un crecimiento di- Tenis informacin sobre listas y
a
vectores en el mdulo Estructuras de
nmico del nmero de elementos del vector. Con esta intencin, podemos objetos de esta asignatura.
utilizar cualquiera de las clases contenedoras que nos ofrece el API de Java. En
nuestro caso proponemos utilizar ArrayList, pero en otros casos y segn las
necesidades que tengamos en la busca de instancias de la relacin podremos
utilizar otras clases.
ClassA.java
La clase ArrayList
import java.util.ArrayList;
La clase ArrayList es una
clase parametrizada, lo que
class ClassA { nos permite indicar en tiempos
private ArrayList<ClassB> v; de compilacin el tipo de obje-
... tos que almacenar.
}
2.2.5. Navegabilidad
2.2.6. Roles
El rol de las clases en las asociaciones slo nos indica el nombre del atributo
que utilizaremos.
Aunque los atributos pueden tener el nombre que nos parezca ms adecuado,
es recomendable utilizar el nombre del rol con el fin de mantener una cierta
coherencia con el diagrama UML.
Hay muchas bibliotecas de clases diferentes que permiten realizar desde tareas
sencillas hasta tareas muy complejas, como la encriptacin, el tratamiento de
imgenes, el trabajo con interfaces grficas, etc.
En primer lugar, veremos cmo utilizar la clase String, que nos sirve para tra- Para completar la informacin sobre
a
cualquier clase de la API de Java,
tar cadenas de caracteres, y a continuacin daremos tambin una ojeada a la podis visitar la siguiente pgina web:
http://java.sun.com/reference/api/
clase ArrayList, que nos permite almacenar objetos de cualquier tipo.
FUOC PID_00161680 44 El lenguaje de programacin Java
Para poder trabajar con objetos de la clase String, no hay que hacer nada espe-
cial, ya que esta clase se encuentra dentro de la biblioteca java.lang, y esta bi-
blioteca se utiliza por defecto en todos los programas Java. Por lo tanto, lo primero
que debemos hacer es declarar un objeto de tipo String y, a continuacin, crear
el objeto. Esto se puede realizar de varias maneras, tantas como mtodos construc-
tores tenemos (13 en estos momentos) ms la asignacin de una cadena de carac-
teres delimitados entre comillas dobles que tiene la misma funcionalidad.
Una vez ya tenemos un objeto de tipo String creado, podemos ejecutar muchas
operaciones. Entre otras, hay operaciones de asignacin, u operaciones que nos Observacin
muestran la longitud de la cadena, que nos permiten efectuar bsquedas, etc. No es el objetivo de este apar-
tado ver todas las posibilida-
des, pero hay que saber que
existen sobrecargas de los m-
Veamos algunas de las opciones en forma de operaciones que esta clase nos todos aqu presentados.
ofrece:
TestString.java
Las operaciones que hemos utilizado tienen ms de una sobrecarga, por lo tan-
to hay que echar un vistazo a la documentacin de la clase String con el fin
de conocer todas las opciones que esta clase nos ofrece.
FUOC PID_00161680 46 El lenguaje de programacin Java
va, tambin hemos introducido los ArrayList; por lo tanto, iremos directa-
mente a cmo podemos hacer para trabajar con ella.
ArrayList<Person> persons;
...
persons = new ArrayList<Person>();
Ahora hay que ver cules son las operaciones que podemos realizar sobre un
ArrayList. Dado que ste implementa la interfaz List, podremos realizar las
mismas operaciones que sta define, ms las propias de la clase.
Del mismo modo como hemos hecho con la clase String veremos tambin
un subconjunto de las operaciones que la clase ArrayList tiene definidas, ya
que si queremos verlas todas, siempre podemos utilizar la API de Java.
Un iterator es un objeto
En el trozo de cdigo siguiente tenis unas cuantas de las operaciones que se que nos ayuda a recorrer los
elementos de un conjunto de
pueden efectuar con ArrayList. Como esta clase almacena clases, utilizare- manera ms simple.
FUOC PID_00161680 47 El lenguaje de programacin Java
TestArrayList.cpp
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
parents.add(p3);
parents.add(p4);
persons.add(p1);
persons.add(p2);
persons.addAll(parents);
parents.clear();
if (parents.remove(p4)) {
System.out.println("On the parents list there's only the dark side");
}
else {
System.out.println("Something went wrong!!");
}
Iterator it1 = persons.iterator();
while (it1.hasNext()) {
System.out.println("The force is strong on : " + ((Person)it1.next()).getName());
}
}
}
Dado que en Java todo son clases, necesitamos una clase que represente la ex-
cepcin y un mecanismo del lenguaje que nos permita capturar los errores y
tratarlos en caso de necesidad.
Por el hecho de ser objetos, las excepciones nos ofrecen un nuevo abanico de
posibilidades para el tratamiento de errores, ya que nos permiten encapsular
todos los datos referentes al error dentro de una estructura y trabajar con ellos
de manera ms sencilla. Si una excepcin no es tratada, la ejecucin del pro-
grama se aborta inmediatamente. Por ello es importante tratarlas todas. a
MyException.java
Como podemos observar, no hay que incluir ningn atributo o mtodo, pero
entonces tenemos una excepcin que no transmite ninguna informacin adi-
cional a la que nos ofrece la propia clase Exception.
Como la propia clase Exception ya tiene un atributo de tipo String para al-
macenar el mensaje que dar, una buena costumbre es definir mensajes per-
sonalizados que informen de la misma manera sobre el mismo error y, en caso
de que fuera necesario, algn otro atributo para poder pasar alguna informa-
cin que sea til despus para tratar los errores.
MyException.java
Fijaos en que podemos aadir cualquier atributo y mtodo que se nos ocurra,
El mtodo super invoca al mtodo
pero normalmente con esta definicin ya tendremos suficiente para nuestras constructor de la clase padre.
aplicaciones.
Una vez que tengamos definida una clase que representa nuestras excepcio-
nes, habr que poder utilizarlas para indicar las situaciones anmalas que se
producen durante la ejecucin del cdigo.
En este caso estamos lanzando una excepcin del tipo MyException con el
texto dado. Para lanzar una excepcin hemos de crear una instancia de la clase
Exception con los parmetros necesarios y, posteriormente, con el uso de la
palabra reservada throw indicamos que se ha producido el error indicado.
Hasta ahora hemos visto cmo podemos crear excepciones y lanzarlas. Ahora
debemos aprender cmo podemos tratarlas en caso de que stas se hayan pro-
ducido en mtodos que nosotros utilizamos en nuestro cdigo.
Para poder tratar las excepciones correctamente hay que tener en cuenta el lu-
gar en el que se pueden producir, es decir, es necesario que tengamos docu-
mentados todos los mtodos de las clases que utilicemos, y que esta
documentacin informe de las excepciones que puede generar.
try {
// Code that could throw an exception
}
catch (ExceptionType exceptionVar) {
// Code that handles an exception
}
Escribiremos el cdigo que puede generar una excepcin entre las llaves que
siguen a la palabra reservada try. Dentro de la sentencia catch indicaremos
qu tipo de excepcin se puede generar; le daremos un nombre de variable
(para poder recuperar datos ms tarde) y escribiremos el cdigo que tratar
esta excepcin.
Cuando cualquiera de los mtodos dentro del bloque try lance una excepcin
del tipo declarado al bloque catch, el programa pasar a ejecutar inmediata-
mente el cdigo dentro de este bloque.
try {
createException();
}
catch (MyException m) {
// Code that handles an exception
System.out.println(m.getMessage());
}
Resumen
Una vez hemos tenido una visin general de los tipos de datos y las operacio-
nes que podemos realizar con stos, nos hemos adentrado en el mundo de las
instrucciones y las secuencias de instrucciones (los bloques condicionales e
iterativos). En este punto hemos visto las diferentes estructuras que existen
para escribir estos bloques y las peculiaridades de cada una.
Para acabar el primer apartado, hemos tratado las funciones, con los parme-
tros de entrada y salida, y la visibilidad de las variables, dos conceptos que van
muy ligados.
Actividades
2. Ya habis visto que los operadores en el lenguaje de programacin Java tienen preceden-
cias diferentes. Decid cul sera el resultado de evaluar las expresiones siguientes:
a) 3 + 5 4 / 2 1
b) 21 15 > 3 9
c) 0 / 3 + 2 4 3 7
Podis ver los vectores en el
a
subapartado 1.4 y los tipos
3. Hemos visto cmo definir un vector de un tipo de datos bsico (hemos utilizado los int). enumerados en el subapartado 1.2.3
Cmo se definira este vector si se utilizara un tipo enumerado? de este mdulo.
FUOC PID_00161680 54 El lenguaje de programacin Java
Solucionario
1.
a) Para contar personas utilizaremos el tipo de datos int, ya que para contar unidades se
debe utilizar un tipo entero. Dependiendo de la cantidad de personas que se contaran se po-
dra utilizar un tipo de dato que permitiera almacenar nmeros ms pequeos (short).
b) Para medir el peso de la fruta utilizaremos un tipo de dato real; como se trata de fruta, no
es necesaria mucha precisin, por lo tanto, un float.
c) Para trabajar con los das de la semana podemos hacer dos cosas: utilizar un tipo enume-
rado o tomar la convencin de enumerar los das, 0 = lunes, 1 = el martes, etc. Es mejor el
tipo enumerado.
d) Para almacenar las horas de un da, como en el caso anterior, tambin se puede utilizar un
tipo enumerado o un nmero entero, y continuamos prefiriendo el tipo enumerado por la
claridad que ofrece.
e) Para almacenar el saldo de una cuenta bancaria necesitamos un nmero real, ya que las
cuentas bancarias utilizan fracciones (el cntimo) de unidades (los euros, en nuestro caso);
por lo tanto, utilizaramos un tipo float (o un tipo double en un caso muy exagerado).
2.
a) 3 + 5 * 4 / 2 1 = 3 + (5 * 4 / 2) 1 = 3 + 10 1 = 12
c) 0 / 3 + 2 * 4 3 * 7 = (0 / 3) + (2 * 4) - (3 * 7) = 0 + 8 21 = 13
d[0] = MON;
d[1] = TUE;
...
Glosario
array m Agrupacin ahitada de elementos de un mismo tipo.
atributo m Representacin de una cualidad de los elementos del mundo real dentro de una
clase.
biblioteca de clases f Conjunto de clases implementadas por otros que permiten la reu-
tilizacin del cdigo.
mtodo m Accin que se puede realizar sobre un elemento del mundo real, que tiene un
smil en la programacin orientada a objetos.
nmero entero m Tipo de dato que representa los valores numricos enteros.
nmero de coma flotante m Tipo de dato que representa los valores numricos de coma
flotante.
operador m Elemento del lenguaje que permite definir una operacin sobre los datos a los
que afecta.
Bibliografa
Sierra, Kathy. Java 2 SUN Certified Programmer & Developer. McGraw-Hill.