Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Practicas Java
Practicas Java
Fundamentos de Programacin:
Prcticas de Java
ii
Fundamentos de Programacin: Prcticas de Java by Gorka Prieto is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License. To view a copy of this license, visit
licenses/by-sa/3.0/us/;
http://creativecommons.org/
Fundamentos de Programacin: Prcticas de Java por Gorka Prieto est licenciado bajo una licencia Creative Commons Reconocimiento-Compartir bajo la misma licencia 2.5 Espaa License. Para ver una copia de esta licencia, visita
http://creativecommons.org/licenses/by-sa/2.5/es/;
o, (b) man-
da una carta a Creative Commons, 171 2nd Street, Suite 300, San Francisco, California, 94105, USA.
Resumen
Con las siguientes prcticas se pretende aanzar los conceptos de programacin orientada a objetos (POO) que se han visto en las clases de teora con Java. Tras la realizacin de las prcticas, se habr implementado en Java una aplicacin que permita al usuario elegir entre diferentes juegos sencillos de consola y ejecutarlos. Para ello se partir de un programa sencillo y se ir incluyendo en cada prctica un concepto nuevo de los vistos en teora comprobando la mejora que aporta sobre la versin anterior del programa. Salvo en la primera prctica de familiarizacin con el entorno, en el resto de prcticas se realizar una copia del directorio con todos los cheros de la prctica anterior y sobre esos cheros se incluirn las nuevas funcionalidades.
iii
iv
RESUMEN
ndice general
Resumen 1. Familiarizacin con el Entorno
1.1. 1.2. 1.3. 1.4. 1.5. El workspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hola Mundo desde Consola . . . . . . . . . . . . . . . . . . . . . . . Hola Mundo desde Eclipse Lectura de Teclado . . . . . . . . . . . . . . . . . . . . . . .
iii
1
1 1 2 3 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Depuracin de Aplicaciones
2. Clases y Objetos
2.1. 2.2. Clase Juego . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ocultacin de Atributos
7
7 8
3. Herencia y Polimorsmo
3.1. 3.2. Ejercicio 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicio 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
11 12
4. Interfaces y Arrays
4.1. 4.2. Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
15 16
5. Paquetes
5.1. 5.2. Paquetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Classpath 5.2.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
19 20 20
Desde la Consola
vi
NDICE GENERAL
5.2.2.
Desde Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
6. El API
6.1. 6.2. 6.3. Clase Random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clase String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clase Vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
23 24 24
7. Excepciones
7.1. 7.2. Ejercicio 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicio 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
27 27
1.1.
El workspace
home
del
En primer lugar creamos un directorio con nuestro nombre dentro del partir de ahora nos vamos a referir a l como
usuario alumno. En este directorio ser donde guardemos todas las prcticas y a
workspace. workspace
a una memoria USB a modo de backup, ya que los ordenadores del centro de clculo pueden ser formateados en cualquier momento a lo largo del curso y sin previo aviso.
1.2.
public class HolaJava { public static void main( String args[] ) { System.out.println( "Hola Java!" ); } }
A continuacin guardar el chero fuente en el directorio
workspace
1 Si
con el nombre
HolaJava.java.
Practica1-1 de vuestro
se usa un procesador de textos como OpenOce, habr que asegurarse de guardar el chero en modo texto en lugar de en formato binario.
1
PRCTICA 1.
El siguiente paso consiste en compilar este programa de ejemplo. Para ello abrimos la consola y nos situamos en el directorio que contiene el cdigo fuente y que ser el directorio
Practica1-1
dentro del
workspace
$ cd tu_nombre $ cd Practica1-1
Podemos comprobar los cheros disponibles en este directorio con el comando:
$ ls
Desde este directorio invocamos el compilador de java pasndole como parmetro el chero que queremos compilar:
$ javac HolaJava.java
Si volvemos a hacer un
ls
tado por una mquina virtual java. Para invocarlo, escribimos lo siguiente:
Como se puede observar, el parmetro que se le pasa no es el nombre del chero java, sino que es el nombre de la clase que contiene el mtodo invocar este programa ser que se muestre por pantalla:
main. El resultado de
Hola Java!
1.3.
A continuacin realizamos un proceso equivalente desde Eclipse. En primer lugar debemos indicar a Eclipse cul es nuestro hace con la opcin
File/Switch Workspace ..., y le indicamos que es el directorio /home/alumno/tu_nombre. Es importante hacer esto al principio de cada prctica
ya que puede que otra persona de otro grupo haya cambiado Eclipse a su propio
workspace.
Esto se
workspace.
Ya podemos crear un nuevo proyecto con deseamos crear un
Java Project
y le damos el nombre
File/New Project. Indicamos que Practica1-2 al proyecto. separados dentro del workspace. HolaJava a esta nueva clase y a conti-
Desde el rbol del proyecto, hacemos click con el botn derecho y damos a la opcin de aadir una nueva clase. Llamamos nuacin vemos que automticamente se crea un chero fuente sobre el que podemos
1.4.
LECTURA DE TECLADO
escribir el fragmento de cdigo mostrado anteriormente. Escribimos el cdigo y guardamos el chero. Finalmente lo compilamos y ejecutamos sin ms que ir al men opcin mostrar en la ventana
Run As/Java Application. El resultado de la ejecucin del programa se nos Console de Eclipse.
Run
y dar a la
Para el resto de las prcticas el alumno podr usar el entorno de desarrollo que ms cmodo le resulte.
1.4.
Lectura de Teclado
Para los programas que se van a realizar en el resto de prcticas, resulta necesario el uso de la entrada por teclado. Como estos conceptos no se han explicado en la teora, usaremos el siguiente cdigo creado por el profesor y que proporciona los mtodos Estos
Teclado.LeeCaracter(), Teclado.LeeEntero() y Teclado.LeeCadena(). mtodos devuelven un char, un int o un String respectivamente con la Teclado.java
dentro de un nuevo di-
entrada introducida por el usuario en el teclado. Copiar el siguiente cdigo en un chero rectorio
Practica1-3:
import java.io.*; public class Teclado { public static char LeeCaracter() { char ch; try { ch = LeeCadena().charAt(0); } catch( Exception e ) { ch = 0; } } return ch;
public static String LeeCadena() { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; try { str = br.readLine(); } catch( Exception e ) { str = "";
PRCTICA 1.
} } return str;
public static int LeeEntero() { int num; try { num = Integer.parseInt( LeeCadena().trim() ); } catch( Exception e ) { num = 0; } } return num;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
public class HolaTeclado { public static void main( String args[] ) { String nombre; int edad; System.out.print( "Dime tu nombre: " ); nombre = Teclado.LeeCadena(); System.out.print( "Dime tu edad: " ); edad = Teclado.LeeEntero(); System.out.println( "Hola " + nombre + ", tienes " + edad + " aos" );
1.5.
Depuracin de Aplicaciones
Eclipse permite depurar aplicaciones de una forma muy cmoda desde la interfaz grca. Para que funcione la depuracin de cdigo java en Eclipse, debemos asegurarnos de que se est usando un JRE que soporte la depuracin de aplicaciones. Para ello en
Window/Preferences/Java/Installed JREs
1.5.
DEPURACIN DE APLICACIONES
est presente y activado el JRE de SUN. Si no est presente, lo aadimos indicando el siguiente path:
/usr/lib/jvm/java-6-sun-1.6.0.03/jre.
Teclado.java
Toggle Breakpoint,
o bien
hacer doble click con el izquierdo en el borde de la lnea. Lo mismo para quitar un
Una vez puestos los breakpoints, depuramos el programa sin ms que ir al men
Run
y dar a la opcin
El programa se detendr
cuando llegue a la lnea 6. Si pulsamos la tecla F6, se ejecutar esa instruccin y se quedar detenido en la siguiente. Si a continuacin pulsamos F8, el programa se continua ejecutando hasta llegar al siguiente breakpoint. Repetir el procedimiento anterior pero pulsando F5 en lugar de F6 y comentar las diferencias observadas.
PRCTICA 1.
2.1.
Clase Juego
Juego
con las siguientes caractersticas:
Tiene como atributo pblico un entero que indica el nmero de vidas que le quedan al jugador en la partida actual.
Mtodos
Tiene como mtodo el constructor que acepta un parmetro de tipo entero que indica el nmero de vidas iniciales con las que parte el jugador. Tiene un mtodo
MuestraVidasRestantes
nmero de vidas que le quedan al jugador en la partida actual. Adems esta clase tiene tambin el mtodo siguiente:
main
Juego
MuestraVidasRestantes Juego
Resta una vida al valor del atributo con las vidas y vuelve a llamar a
MuestraVidasRestantes.
indicando que el nmero de
MuestraVidasRestantes
de la nueva instancia y
PRCTICA 2.
CLASES Y OBJETOS
2.2.
Ocultacin de Atributos
En el ejercicio anterior no se ha prestado atencin a la forma en que se permite que alguien modique el atributo con las vidas de la clase cambios:
Juego.
En este ejercicio
se utilizar un acceso controlado a ese atributo. Para ello se realizarn los siguientes
Atributos
Debe ocultarse a cualquier otra clase el atributo con las vidas. Para poder modicar este atributo, se crearn los dos nuevos mtodos que se explican ms adelante.
Crear un nuevo atributo tambin privado que guarde el nmero de vidas que inicialmente se le pasaron al constructor del objeto. Este atributo se utilizar para poder reiniciar el juego.
Crear otro atributo tambin privado y de tipo entero que guarde el rcord. A diferencia de los anteriores (que son atributos de instancia) ste es un atributo de clase, por lo que ser comn a todos los juegos que se implementen. Inicialmente este atributo tendr el valor 0.
Mtodos
QuitaVida que disminuya en 1 el nmero de vidas del jugador y devuelva un boolean indicando si al jugador le quedan ms
Aadir un mtodo vidas o no. En caso de que al jugador no le queden ms vidas, este mtodo debe mostrar un mensaje
Juego Terminado
por pantalla.
Aadir un mtodo
ReiniciaPartida
mero de vidas que se haban indicado al llamar al constructor del objeto. Para ello utilizar el nuevo atributo que se ha aadido.
Aadir un mtodo
ActualizaRecord
Si el nmero de vidas restantes es igual al rcord, mostrar un mensaje indicando que se ha alcanzado el rcord. Si el nmero de vidas restante es mayor que el rcord, actualizar el rcord y mostrar un mensaje diciendo que ste se ha batido y cul es su nuevo valor.
Aplicacion
en un chero
main se va a poner ahora en una clase aparte Aplicacion.java dentro del mismo directorio:
Antes de modicar esta funcin, comprobar que ahora el compilador nos muestra un mensaje de error al intentar modicar directamente el atributo con las vidas. A continuacin proceder con las modicaciones que siguen.
2.2.
OCULTACIN DE ATRIBUTOS
Llamar al mtodo
continuacin al mtodo
de la clase
Juego
y de nuevo al mtodo
MuestraVidasRestantes.
Llamar al mtodo
ActualizaRecord
de la primera instancia de
Juego
y a
continuacin llamar a este mismo mtodo pero en la segunda instancia. Explica los mensajes mostrados.
10
PRCTICA 2.
CLASES Y OBJETOS
3.1.
Ejercicio 1
1
tenga que
adivinar un nmero que conoce el programa. El cdigo correspondiente a cada clase que se implemente deber estar en un chero java separado y que tenga el mismo nombre que la clase.
Clase
Juego
main
Clase
JuegoAdivinaNumero Juego.
Deriva de la clase
Tiene un constructor que toma dos parmetros de tipo entero. El primero es el nmero de vidas que, a su vez, se lo pasar al constructor de la clase base. El segundo parmetro es un nmero a adivinar entre 0 y 10.
teclado
1 Usando
Implementa el mtodo
Juega
de la clase base:
la clase de entrada por teclado copiada en el primera prctica, se leer un entero del
11
12
PRCTICA 3.
HERENCIA Y POLIMORFISMO
Llama al mtodo
ReiniciaPartida
que ha heredado.
Muestra un mensaje al usuario pidiendo que adivine un nmero entre el 0 y el 10. Lee un entero del teclado y lo compara con el valor predenido por el programador: Si es igual, muestra un mensaje
ActualizaRecord,
Si el mtodo
Acertaste!!
y, tras llamar a
le que-
dan ms vidas al jugador por lo que se muestra un mensaje indicando si el nmero a adivinar es mayor o menor y se le pide que lo intente de nuevo. Si el mtodo
QuitaVida
devuelve
false
signica que ya no le
Juega.
Aplicacion
que se ha creado, llama al mtodo
Contiene un mtodo main que, tras crear una instancia de la nueva clase
JuegoAdivinaNumero
Juega.
3.2.
Ejercicio 2
A partir del juego anterior, se aadirn dos juegos ms, uno de adivinacin de nmeros pares y otro de adivinacin de nmeros impares.
Clase
JuegoAdivinaNumero ValidaNumero
que toma como parmetro el
true. En el mtodo Juega pedir un nuevo nmero por teclado si el ValidaNumero devuelve false y, en este caso, no restar vida.
Clase
boolean
que, en este
mtodo
Clase
JuegoAdivinaImpar
si el nmero es im-
false.
3.2.
EJERCICIO 2
13
Clase
Aplicacion
y
El mtodo main crea una instancia de cada uno de los tres juegos creados:
JuegoAdivinaNumero, JuegoAdivinaPar
JuegoAdivinaImpar.
Como
nmero de vidas de cada juego se pondr 3 y como nmero a adivinar un nmero cualquiera, otro par y otro impar respectivamente, todos comprendidos entre el 0 y el 10.
Llama al mtodo
Juega
14
PRCTICA 3.
HERENCIA Y POLIMORFISMO
4.1.
Interfaces
Jugable
que implementarn
los juegos desarrollados hasta ahora y nuevos que se desarrollen. Esta interfaz nos permitir especicar una serie de operaciones comunes que deben implementar todos los juegos y que nos permitirn manejarlos de forma genrica posteriormente.
Clase
Juego Juega,
pero la clase se seguir mante-
Interfaz
Se incorporar un mtodo
MuestraNombre
tro y que obligue a las clases que implementen la interfaz a mostrar un mensaje por pantalla con el nombre del juego.
Se incorporar un mtodo
que obligue a las clases que implementen la interfaz a mostrar un mensaje por pantalla con una descripcin de cmo jugar al juego. Clase
JuegoAdivinaNumero Jugable
15
PRCTICA 4.
Redene el mtodo
Clase
Redene el mtodo
Clase
Aplicacion main
crear un objeto de cada uno de los juegos mencio-
En el mtodo nados.
4.2.
Arrays
Para comprender la utilidad de las interfaces, implementamos en este ejercicio un array de interfaces que permitir invocar a cualquiera de los tres juegos de forma genrica.
Clase
Mtodo
Mtodo pblico y esttico que no toma parmetros y devuelve un objeto del tipo
Crea un objeto de cada uno de los tres juegos implementados. Crea un array de tres elementos de tipo interfaz
Rellena este array con los objetos creados para los distintos juegos. A partir de este momento, slo se trabajar con este array de tipo interfaz
Jugable
Muestra un men por pantalla con el nombre de los tres juegos y pide al usuario que elija un juego introduciendo un nmero entre 0 y 2. Si el nmero introducido no es vlido, seguir pidiendo al usuario un nmero vlido.
4.2.
ARRAYS
17
Mtodo
MuestraNombre de este juego. A continuacin llama al mtodo MuestraInfo del juego. Llama al mtodo Juega del mismo para comenzar una nueva partida.
Llama al mtodo Finalmente, tras concluir la partida, pregunta al usuario si desea jugar de nuevo y en caso armativo vuelve a repetir los pasos anteriores.
18
PRCTICA 4.
Prctica 5 Paquetes
El nmero de clases y cheros usados en la prctica ya va creciendo, por lo que vamos a estructurarlos en directorios y paquetes.
5.1.
Paquetes
Se trata de organizar en diferentes paquetes las clases empleadas hasta ahora y de utilizarlos desde los diferentes cheros de cdigo.
Paquete
juegos, Juego
Clase
Paquete
interfaces Jugable
y
Paquete
Contiene la interfaz
Paquete
numeros
profesor Teclado
Contiene la clase
Tener en cuenta que al estructurar el cdigo en paquetes diferentes, el modicador por defecto
friendly
ste lo ofrezca como pblico. Por lo tanto se debern actualizar los modicadores de acceso de clases, mtodos y atributos que se consideren necesarios. De la misma forma, al estar el cdigo ahora en paquetes diferentes, ser necesario hacer los correspondientes. Para crear un nuevo paquete desde Eclipse, basta con hacer click con el botn derecho sobre el proyecto y dar a
import
New/Package.
19
20
PRCTICA 5.
PAQUETES
del paquete y, tras introducirlo, crear un directorio con el nombre del paquete que nos aparecer en el rbol del proyecto. Ahora ya podemos hacer click con el derecho sobre este paquete e ir aadiendo clases. Eclipse se encarga de poner por nosotros las directivas
package
5.2.
5.2.1.
Classpath
Desde la Consola
workspace: $ $ $ $
JAR
Java/JAR file
y damos a siguiente.
3. A continuacin seleccionamos los cheros java que nos interese meter en el paquete, en nuestro caso slo
Teclado.java.
4. En esta misma pantalla indicamos que el nombre del chero que queremos generar es
profesor.jar
y damos a terminar.
5.2.
CLASSPATH
21
profesor.jar
en el directorio de nuestro
workspace.
profesor de nuestro rbol de proyecto haciendo click con el derecho sobre l y dando a Delete. Al borrarlo se puede ver que Eclipse
Ahora borramos el paquete muestra varios errores en el resto de nuestro cdigo, esto es debido a que no encuentra el paquete
profesor. classpath
el chero
JAR
que aca-
profesor.jar
y damos a aceptar.
Ahora comprobamos cmo desaparecen los errores de Eclipse y que podemos volver a ejecutar la aplicacin sin problema. Esto es debido a que con el nuevo
classpath
22
PRCTICA 5.
PAQUETES
Prctica 6 El API
En esta prctica se trata de que el alumno sea capaz de leer documentacin referente a un paquete externo y de utilizarlo. Para ello se utilizarn las clases
Random, String
Vector
6.1.
Clase Random
Random del paquete
java.util
ello:
para que el nmero que hay que adivinar en los juegos de nmeros sea
Clase
JuegoAdivinaNumero
Ahora el constructor ya no necesitar como parmetro el nmero a adivinar. Aade como dato miembro un objeto de tipo
Random
generar nmeros aleatorios. A la hora de construir este objeto, es conveniente pasarle una semilla que evita que se genere siempre la misma secuencia de nmeros pseudoaleatorios. Para ello puede usarse la clase
Date
de paquete
java.util.
ReiniciaPartida para que, adems de ejecutar el cdigo denido en la clase Juego, asigne un valor aleatorio al dato miembro
Redene el mtodo que contiene el nmero a adivinar.
Clase
AdivinaNumeroPar
ReiniciaPartida para que ejecute el cdigo denido en la clase JuegoAdivinaNumero y adems transforme el nmero aleatorio
Redene el mtodo generado por sta en un nmero par entre 0 y 10.
1 http://java.sun.com/javase/reference/api.jsp
23
24
PRCTICA 6.
EL API
Clase
AdivinaNumeroImpar
ReiniciaPartida para que ejecute el cdigo denido en la clase JuegoAdivinaNumero y adems transforme el nmero aleatorio
Redene el mtodo generado por sta en un nmero impar entre 0 y 10.
6.2.
Clase String
String
se va a implementar un nuevo juego
JuegoAhorcado
Clase
Tomar comoprimer parmetro del constructor el nmero de vidas y como segundo parmetro la cadena a adivinar. Implementar la interfaz
Jugable. Juega
se recomienda seguir los siguientes
Llamar al mtodo
ReiniciaPartida
de la clase base.
Crear una cadena del mismo tamao que la cadena a adivinar pero en la que todos sus caracteres sean un '-'. Mostrar al usuario la cadena con los '-'. Pedir al usuario que introduzca un carcter y comprobar si est en la cadena a adivinar. Si est en la cadena, reemplazar los '-' por el carcter en las posiciones que corresponda. Comparar esta cadena con la cadena a adivinar y, si son iguales, indicrselo al usuario y terminar la partida.
QuitaVida
comprobando
si se ha terminado la partida o no. Si no se ha terminado la partida, volver a mostrar la cadena con '-' al usuario y repetir el proceso. Clase
Aplicacion EligeJuego
el nuevo juego que se acaba de crear.
Aadir al mtodo
6.3.
Clase Vector
Vector del paquete java.util, vamos a substituir el Aplicacion por un vector.
6.3.
CLASE VECTOR
25
Clase
Aplicacion InfoVector
que tome como parmetro un vector e
Aadir un mtodo
EligeJuego
InfoVector.
Aadir los tres juegos de nmeros a este vector y volver a llamar al mtodo
InfoVector.
A continuacin aadir al vector el objeto correspondiente al juego del ahorcado y volver a llamar al mtodo
InfoVector.
Modicar el resto de la funcin para que trabaje con el vector en lugar de con el array de interfaces.
26
PRCTICA 6.
EL API
Prctica 7 Excepciones
En esta ltima prctica se incluir el manejo de excepciones para validar los datos introducidos por el usuario.
7.1.
Ejercicio 1
LeeEntero
de la clase
El mtodo
Teclado
que se introduzca no sea un nmero. Modicar este mtodo para que si se recibe una excepcin del tipo
NumberFormatException,
introducir un nmero vlido y se vuelva a leer la entrada. En caso de recibir cualquier otra excepcin, sigue devolviendo un 0.
7.2.
Ejercicio 2
El constructor de las clases no puede devolver ningn cdigo de retorno para indicar si ha funcionado bien o no. Una opcin es que genere una excepcin en caso de fallo.
Clase
Su constructor toma como parmetro una cadena de caracteres con la descripcin del motivo de la excepcin.
Constructor de la clase
JuegoAhorcado Character.
Debe comprobar que ninguno de los caracteres de la palabra a adivinar sea un nmero, para ello puede valerse de los mtodos de la clase Si hay un nmero, lanzar una excepcin
JuegoException noticndolo.
27
28
PRCTICA 7.
EXCEPCIONES
Clase
Aplicacion EligeJuego
no captura la excepcin y la pasa hacia arriba.
El mtodo El mtodo
de fallo antes de terminar. Tanto en caso de que ocurra una excepcin como de que no ocurra ninguna, el programa debe terminar mostrando el mensaje
Probar a compilar y ejecutar el programa empleando como palabra a adivinar una con nmero y otra sin ningn nmero.