Manual Java I
Manual Java I
Índice
1. Introducción ........................................................................................................................ 11
2. Lenguajes de programación ................................................................................................ 12
2.1 Tipos ............................................................................................................................ 12
2.2 Programación estructurada ........................................................................................ 15
3. Lo primero que tenemos que aprender .............................................................................. 17
4. ¿Qué es Java? ...................................................................................................................... 18
5. Preparación de nuestro entorno de desarrollo................................................................... 19
5.1 Instalando Java ............................................................................................................ 19
5.1.1 JDK ....................................................................................................................... 19
5.1.2 Geany .................................................................................................................. 25
6. Comenzando ....................................................................................................................... 29
7. Conceptos iniciales .............................................................................................................. 35
7.1 Variables ...................................................................................................................... 38
7.2 Constantes................................................................................................................... 42
7.3 Operaciones ................................................................................................................ 42
7.4 Operadores de asignación........................................................................................... 45
7.5 Operadores unarios aritméticos ................................................................................. 45
7.6 Prioridad de operadores ............................................................................................. 46
7.7 Casting ......................................................................................................................... 47
7.8 Ejercicios...................................................................................................................... 48
8. Estructuras de control ......................................................................................................... 49
8.1 Estructuras condicionales ........................................................................................... 49
8.1.1 if ........................................................................................................................... 49
8.1.2 switch .................................................................................................................. 59
8.2 Estructuras de repetición ............................................................................................ 62
8.2.1 while .................................................................................................................... 62
8.2.2 do......................................................................................................................... 64
8.2.3 for ........................................................................................................................ 65
8.2.4 ¿Cuál debo de usar? ............................................................................................ 66
8.2.5 Break y continue.................................................................................................. 68
8.3 Ejercicios...................................................................................................................... 69
9. API ....................................................................................................................................... 70
10. Entrada por teclado ......................................................................................................... 73
10.1 Ejercicios...................................................................................................................... 78
11. Vectores .......................................................................................................................... 79
2
José A. Navarro Java desde 0. Programación I
3
José A. Navarro Java desde 0. Programación I
4
José A. Navarro Java desde 0. Programación I
Índice de imágenes
Ilustración 1. Ejemplo código máquina ....................................................................................... 12
Ilustración 2. Ejemplo ensamblador............................................................................................ 12
Ilustración 3. Ejemplo Python ..................................................................................................... 13
Ilustración 4. Compilador C ......................................................................................................... 14
Ilustración 5. Interprete Python .................................................................................................. 14
Ilustración 6. Compilador Java .................................................................................................... 15
Ilustración 7. Instalador JDK ........................................................................................................ 20
Ilustración 8.Instalación JDK........................................................................................................ 21
Ilustración 9.Instalación JDK 2..................................................................................................... 21
Ilustración 10. Fin instalación JDK ............................................................................................... 21
Ilustración 11. Carpeta BIN ......................................................................................................... 22
Ilustración 12. Propiedades equipo ............................................................................................ 22
Ilustración 13. Configuración avanzada ...................................................................................... 23
Ilustración 14. Variables de entorno ........................................................................................... 23
Ilustración 15. Variables de entorno 2 ........................................................................................ 24
Ilustración 16. Añadir variable de entorno ................................................................................. 24
Ilustración 17. Classpath ............................................................................................................. 25
Ilustración 18. Classpath 2 .......................................................................................................... 25
Ilustración 19. Instalación de Geany ........................................................................................... 26
Ilustración 20. Instalación de Geany 2 ........................................................................................ 26
Ilustración 21. Icono de Geany .................................................................................................... 26
Ilustración 22. Entorno del IDE.................................................................................................... 26
Ilustración 23. Crear una nueva clase ......................................................................................... 27
Ilustración 24. Comandos de construcción ................................................................................. 27
Ilustración 25. Configuración de los comandos .......................................................................... 28
Ilustración 26. Creación de un nuevo programa ......................................................................... 30
Ilustración 27. Código predefinido .............................................................................................. 30
Ilustración 28. Botones de Geany ............................................................................................... 31
Ilustración 29. Compilación ......................................................................................................... 31
Ilustración 30. Resultado de ejecución ....................................................................................... 32
Ilustración 31. Comentarios ........................................................................................................ 32
Ilustración 32. Salida comentarios .............................................................................................. 32
Ilustración 33. Comentarios 2 ..................................................................................................... 33
Ilustración 34. Bloque de código ................................................................................................. 33
Ilustración 35. Punto y coma ....................................................................................................... 34
Ilustración 36. Primer ejemplo .................................................................................................... 35
Ilustración 37. Tipos de datos ..................................................................................................... 35
Ilustración 38. Tabla ASCII ........................................................................................................... 36
Ilustración 39. Nueva línea .......................................................................................................... 37
Ilustración 40. Ejemplo nueva línea ............................................................................................ 37
Ilustración 41. Ejemplo rango de datos....................................................................................... 38
Ilustración 42. Ejemplo rango de datos 2.................................................................................... 38
Ilustración 43. Variables no inicializadas..................................................................................... 38
Ilustración 44. Variables no inicializadas 2 .................................................................................. 39
Ilustración 45. Variables inicializadas 2 ....................................................................................... 40
Ilustración 46. Variables inicializadas .......................................................................................... 40
5
José A. Navarro Java desde 0. Programación I
6
José A. Navarro Java desde 0. Programación I
7
José A. Navarro Java desde 0. Programación I
8
José A. Navarro Java desde 0. Programación I
9
José A. Navarro Java desde 0. Programación I
Índice de tablas
Tabla 1. Variables, memoria 1 ..................................................................................................... 40
Tabla 2. Variables, memoria 2 ..................................................................................................... 40
Tabla 3. Variables, memoria 3 ..................................................................................................... 40
Tabla 4. Variables, memoria 4 ..................................................................................................... 41
Tabla 5. Ejemplos de tipos letra .................................................................................................. 41
Tabla 6. Operadores aritméticos ................................................................................................. 42
Tabla 7. Operadores de asignación ............................................................................................. 45
Tabla 8. Operadores de incremento ........................................................................................... 45
Tabla 9 Prioridad de operadores ................................................................................................. 47
Tabla 10. Operadores de comparación ....................................................................................... 51
Tabla 11. Operadores lógicos ...................................................................................................... 55
Tabla 12. Tabla de verdad AND y OR........................................................................................... 55
Tabla 13.Tabla NOT ..................................................................................................................... 55
Tabla 14. Tabla XOR..................................................................................................................... 56
Tabla 15.Ejemplo parámetros por valor 1................................................................................... 94
Tabla 16. Ejemplo parámetros por valor 2 .................................................................................. 95
Tabla 17. Ejemplo parámetros por valor 3 .................................................................................. 95
Tabla 18. Ejemplo parámetros por valor 4 .................................................................................. 95
Tabla 19. Ejemplo parámetros por valor 5 .................................................................................. 95
Tabla 20. Ejemplo parámetros por valor 6 .................................................................................. 96
Tabla 21. Ejemplo parámetros por referencia 1 ......................................................................... 97
Tabla 22. Ejemplo parámetros por referencia 2 ......................................................................... 97
Tabla 23. Ejemplo parámetros por referencia 3 ......................................................................... 97
Tabla 24. Ejemplo parámetros por referencia 4 ......................................................................... 97
Tabla 25. Modificadores de acceso ........................................................................................... 109
Tabla 26. Clase Math ................................................................................................................. 149
Tabla 27. Métodos ArrayList ..................................................................................................... 152
10
José A. Navarro Java desde 0. Programación I
1. Introducción
Este manual ha sido realizado en base a la experiencia en la explicación de la asignatura
de programación en CGFS a alumnos que no han programado nunca y se encuentran con un
lenguaje orientado a objetos. No trato de que los alumnos no atiendan las explicaciones de sus
profesores, sino de darles una base aclaratoria desde 0.
El manual está basado en una serie de aproximaciones hasta llegar a comprender la POO.
Para ello está dividido en tres grandes partes:
Obviamente al explicar un lenguaje orientado a objetos nos encontramos con que hay
cosas que hay que explicar pero que no es el momento por la dificultad que comportan. Sólo
cuando se ha visto todo se cierra el círculo y tenemos una visión completa.
He usado aproximaciones hasta llegar a la solución final de forma que el alumno vea todo
lo que sucede, de ahí la cantidad de ejemplos.
11
José A. Navarro Java desde 0. Programación I
2. Lenguajes de programación
2.1 Tipos
Un lenguaje de programación es un lenguaje que puede ser utilizado para controlar el
comportamiento de una máquina, particularmente una computadora. Permite especificar de
manera precisa sobre qué datos se tiene que operar, cómo deben ser estos almacenados,
transmitidos y qué acciones se debe tomar bajo una variada gama de circunstancias.
Lenguaje ensamblador: Usa códigos mnemotécnicos haciendo más fácil de leer los
programas. Siguen siendo difíciles y dependientes de la máquina.
12
José A. Navarro Java desde 0. Programación I
Ej. Python
En este ejemplo, sin tener conocimientos de python igualmente podemos entender que
se pide un número y que dependiendo de si es mayor o menor de 0 se muestra un mensaje
distinto.
Dentro de los lenguajes de alto nivel también nos podemos encontrar con varios tipos
según el paradigma que usen: procedimentales, declarativos, funcionales…
Este manual se centra en Java que es un lenguaje orientado a objetos (en adelante POO).
Estos lenguajes estrechan la relación entre código y datos. Ofrecen un mayor nivel de
abstracción. Desde que comenzaron a salir lenguajes con POO se han ido añadiendo distintas
características, pero hay tres que, bajo mi punto de vista, hacen que se le pueda llamar POO o
no. Estas son:
Encapsulación: Damos a conocer solo aquellos detalles de los objetos que son
pertinentes, ocultando como se han implementado.
Independientemente del tipo de lenguaje según las características vistas, estos pueden
ser interpretados o compilados, dependiendo del proceso de traducción que se realice. La CPU
solo entiende código máquina, por lo que hay que traducir el programa fuente, programado en
uno de los lenguajes existentes, en código máquina para que pueda ser ejecutado.
Cada uno tiene sus pros y sus contras. Un lenguaje compilado traduce una sola vez todo
el código y son más rápidos en ejecución. Los interpretados si una instrucción se repite varias
veces la interpretan cada vez ya que va traduciendo línea a línea mientras se ejecuta. Por el
contrario son más fáciles de depurar. Hoy en día, dada la capacidad de computo de los
ordenadores, no es tan importante la velocidad de ejecución, de hecho cada vez surgen más
lenguajes interpretados o mixtos como es Java.
13
José A. Navarro Java desde 0. Programación I
Ilustración 4. Compilador C
Java: Java es un lenguaje que compila generando un código intermedio (bytecode) que se
ejecuta en un entorno interpretado llamado Máquina Virtual Java. Un programa realizado en
Java se puede ejecutar en cualquier ordenador tenga el sistema operativo que tenga siempre
que este instalada la máquina virtual.
14
José A. Navarro Java desde 0. Programación I
Las distintas partes de las que consta un programa deberán ser modificadas o cambiadas
sin que esto afecte al resto del programa.
15
José A. Navarro Java desde 0. Programación I
16
José A. Navarro Java desde 0. Programación I
No hay ningún lenguaje mejor que otro: No perdáis el tiempo en guerras inútiles entre
lenguajes. Hay lenguajes más nuevos o más populares, pero no mejores. Cada lenguaje
es adecuado para un contexto o tipo de aplicación determinado. No hay ninguno que
sea mejor que todos los demás de forma absoluta. No dejéis que el marketing os engañe.
Tú no eres tu código: Tendemos a relacionar nuestra valía personal con la calidad del
código que escribimos. Y eso es un error. Si mi autoestima dependiera de lo bueno que
es el código que yo escribo, hace tiempo que me hubiera tirado a la vía del tren. Esto se
aplica también a la inversa. No vayas tan rápido en evaluar la calidad de un programador
mirando su código. No sabes en qué condiciones tuvo que escribirlo (a lo mejor parte lo
heredó de otro, el tiempo asignado...)
Leerás más código del que nunca vas a programar: Pocas veces tendrás la oportunidad
de programar algo de cero. Incluso en esos casos dependerás de librerías y servicios de
terceros.
Programar es mucho más que escribir código: Programar es una actividad social. Eso
del programador encerrado en su cubículo es un mito. Programar requiere entender
bien los requisitos de lo que vas a programar, el contexto en que se va a utilizar el
programa, el perfil del usuario, ... Para ser un buen programador tienes que desarrollar
no sólo código sino también habilidades sociales.
17
José A. Navarro Java desde 0. Programación I
4. ¿Qué es Java?
Java es un lenguaje orientado a objetos de propósito general. Aunque Java comenzara a
ser conocido como un lenguaje de programación de applets que se ejecutan en el entorno de
un navegador web, hoy en día se puede utilizar para construir cualquier tipo de proyecto.
Su sintaxis es muy parecida a la de C y C++ pero hasta ahí llega el parecido. Java no es una
evolución ni de C++ ni un C++ mejorado.
Los padres de Java son James Gosling (emacs) y Bill Joy (Sun). Java desciende de un
lenguaje llamado Oak.
Independiente de la máquina.
Otra característica de Java es que está preparado para la programación concurrente sin
necesidad de utilizar ningún tipo de biblioteca.
Finalmente, Java posee un gestor de seguridad con el que poder restringir el acceso a los
recursos del sistema.
18
José A. Navarro Java desde 0. Programación I
Compilador.
Intérprete.
Herramientas de automatización.
Depurador.
Refactorización.
Autocomplementado de código.
Entre los IDE más usados para programar con Java están: Netbeans, Eclipse, IntelliJ…
El problema de usar uno de estos IDE para aprender y dar los primeros pasos es que hacen
muchas cosas solos, nosotros conseguimos que nuestros programas funcionen pero no sabemos
cómo ni porqué ya que ha sido el IDE el que nos ha corregido errores o nos ha dicho como
escribirlo. Por ello nosotros vamos a usar otro IDE más liviano pero muy conocido, compatible
con Java, C, C++, PHP, Python… que es Geany. A Geany se le pueden añadir plugins para
ayudarnos en todo lo comentado anteriormente, cosa que no haremos.
javac: El compilador.
19
José A. Navarro Java desde 0. Programación I
Con Java 9, Oracle se comprometió a lanzar una nueva versión de Java cada 6 meses, y de
momento lo está cumpliendo. Con el lanzamiento de Java 11 hay cambio de licencia y el
soporte a largo plazo (LTS) asegurado para el JDK. Por tanto, los JDK no son gratuitos. El JDK
11 inicia una nueva era en la licencia de uso. Hasta ahora podías descargar y programar con
el Kit de Desarrollo de Java oficial de Oracle y luego poner tu aplicación en producción o
distribuirla sin tener que pagar nada al gigante del software. Sin embargo, a partir de Java
11 y del JDK 11, aunque puedes seguir desarrollando con él, tendrás que pagar una licencia
a Oracle si quieres utilizarlo para poner las aplicaciones en producción. El coste es de 2,5
dólares al mes por cada usuario de escritorio, y de 25 dólares por procesador en el caso de
aplicaciones de servidor. Esto no afecta a versiones anteriores del JDK, por lo que, si usas
Java 8, 9 o 10 sigue siendo gratuito.
Sin embargo, sabiendo los cambios de licencias que estaban preparando, Oracle ha
trabajado para hacer que el OpenJDK se haya equiparado en todos los aspectos al JDK, hasta
el punto de que se puede decir que el OpenJDK y el JDK son idénticos desde un punto de
vista técnico, desde la versión 11. Por tanto podemos usar OpenJDK.
Nosotros vamos a usar el JDK 8 que es más que suficiente para aprender a programar y
para nuestros intereses, Es una versión LTS y que además sigue siendo gratuita.
La podéis descargar en este enlace:
https://www.oracle.com/es/java/technologies/javase/javase8-archive-downloads.html
Es importante descargar la adecuada para nuestro sistema operativo (32 o 64 bits). Se nos
pedirá que nos registremos, no hay problema es gratuito y podemos desactivar las
notificaciones.
20
José A. Navarro Java desde 0. Programación I
21
José A. Navarro Java desde 0. Programación I
Una vez instalado debemos de modificar dos variables de entorno para que Geany
encuentre la MVJ y el compilador, así como la carpeta de clases.
1. Copiamos la ruta hasta la carpeta bin del JDK:
22
José A. Navarro Java desde 0. Programación I
23
José A. Navarro Java desde 0. Programación I
Ahora solo nos queda indicar la carpeta de librerías. Si la variable CLASSPATH no existe la
creamos (lo normal) si existe añadimos la carpeta lib. En este caso con poner un simple “.” es
suficiente, Geany la encontrará.
24
José A. Navarro Java desde 0. Programación I
5.1.2 Geany
Para instalar el IDE que usaremos lo primero es descargar la última versión:
https://www.geany.org/download/releases/
La ejecutamos:
25
José A. Navarro Java desde 0. Programación I
Archivo
ss
Donde escribimos el código
26
José A. Navarro Java desde 0. Programación I
Podemos ver como en los comandos de ejecución de llama al comando javac para
compilar y java para ejecutar. Todo está correcto.
27
José A. Navarro Java desde 0. Programación I
28
José A. Navarro Java desde 0. Programación I
6. Comenzando
Como ya hemos visto Java es un lenguaje orientado a objetos. En este manual no voy a
comenzar a explicar directamente POO sino que vamos a realizar una serie de aproximaciones
hasta llegar a la POO pura. Primero usaremos Java como si fuera un lenguaje sin métodos o
funciones y aprenderemos las estructuras básicas de la programación estructurada
“cuadriculando” nuestra mente, pensando en soluciones a problemas desde un punto de vista
algorítmico. Luego introduciremos el concepto de métodos, clases y objetos acercándonos ya a
la POO. Una vez visto esto añadiremos los conceptos de herencia, polimorfismo, interfaces,
clases abstractas y alguna estructura dinámica de la API.
Este manual no está pensado como un texto extremadamente largo de teoría sino más
bien como un manual práctico que cualquiera desde cero puede seguir.
El hecho de que Java sea un leguaje orientado a objetos puro hace imposible no usar
objetos desde el principio como en Python o PHP y luego ver la POO, por eso voy a hacer una
introducción bastante simple del funcionamiento, que ya en la segunda parte explicaré más
detenidamente. También me gustaría aclarar que NO todo lo que voy a explicar es la verdad y
voy a omitir ciertos aspectos hasta su momento. ¿Por qué? Muy simple, para aquella gente que
no ha programado nunca y comienza con la POO les resultan confusos algunos términos, estos
los voy explicando poco a poco formando un circulo virtual que sólo cuando se cierra se tiene
una comprensión completa.
Como ya he dicho sólo hay una forma de aprender a programar: haciendo muchos
ejercicios y enfrentándote a ellos sin copiar la solución. Debéis de tener en cuenta que a la hora
de aprender a programar tenéis dos problemas: el primero es conseguir la idea feliz que resuelve
el problema (cuadricular la mente) y el segundo es aprender la sintaxis del lenguaje que vais a
usar, en este caso Java. En cada capítulo os dejaré ejercicios para practicar. ¿Cómo afrontar un
problema? Con lápiz y papel. Primero debéis de haceros un esquema en papel, usando
diagramas, pseudocódigo o Java de cómo pensáis resolver el ejercicio. Después repasad la hoja,
encontrareis errores, corregidlos. Solo cuando hayáis pasado estas dos fases podéis codificar el
problema en el ordenador. Es imposible codificar la solución a un problema si no sabéis como
abordarlo.
Bien, como suele ser habitual comencemos por hacer el famoso “hola mundo” y a partir
de ahí iré explicando las cosas que debemos de saber desde el principio.
La forma más rápida para crear un programa en java es partir de la pestaña nuevo
seleccionando main.java:
29
José A. Navarro Java desde 0. Programación I
30
José A. Navarro Java desde 0. Programación I
En el panel de la izquierda podemos ver las clases que tenemos abiertas junto con la línea
en la que se declara y donde se encuentra el main.
En java todo el código se crea en unas “plantillas” llamadas clases1. Estas clases se tienen
que corresponder con un fichero. El fichero y la clase se deben de llamar igual. El main es un
método especial de Java, de momento le llamaremos “programa principal”. Todo lo que
queramos que Java ejecute debe de estar dentro del main.
2. En la línea 26 se declara el main o programa principal siempre comienza por public (todo
el mundo lo puede ejecutar) seguido de static final, que explicaré en próximos capítulos
(de momento se pone siempre). Después aparece en rojo la palabra void (sin retorno, lo
veremos más adelante) seguida de main. Siempre debe de llamarse main si no Java no
sabrá que ejecutar. Después del main vienen unos argumentos entre paréntesis que
entenderéis más adelante. Lo que se encuentra entre llaves en el main es lo que Java
ejecuta.
3. En la línea 28 se encuentra el código que muestra por pantalla la frase “hola mundo”.
Ese código lo veremos más adelante, pero veamos lo que sucede.
Primero pulsamos en el botón compilar para que Java compruebe si hay errores de
sintaxis y si todo está correcto.
En la pestaña compilador nos aparece la orden javac y nos dice que ha compilado
correctamente sin encontrar ningún problema. Si pulsamos ahora en ejecutar lo ejecutará
1
Veremos esto con más detenimiento en la segunda parte del manual
2
Una palabra reservada es una palabra que tiene sentido para Java y que el compilador entiende. En
Geany suelen pintarse de azul.
31
José A. Navarro Java desde 0. Programación I
mediante el comando java mostrando el resultado en una ventana de consola y esperando hasta
pulsar intro o que la cerremos.
Se muestra el resultado de la ejecución que no es más que mostrar por pantalla la frase
“Hola Mundo”.
Lo primero que nos llama la atención son un montón de líneas rojas. Esas líneas son
comentarios que añade Geany al crear un fichero nuevo usando el método que os he
comentado, las podemos borrar. Pero, ¿Qué es un comentario? Un comentario es cualquier
código al cual el compilador no hará ni caso. Sirve para poner anotaciones que nos ayuden a
entender el código más adelante o a que lo entienda otra persona. Los comentarios en Java se
escriben de la siguiente forma:
Usando /* y */ lo que hace que lo que se encuentra entre esos caracteres se tome
como un comentario.
Veamos un ejemplo:
El compilador no va a ejecutar la línea 1, 2, 8 ni 10. Fijaros que la línea 10 pese a que tiene
código valido el compilador no la ejecuta al ser un comentario.
32
José A. Navarro Java desde 0. Programación I
De esto podemos deducir que si estamos intentando buscar un error podemos comentar
líneas para que no se ejecuten en vez de borrarlas y tenerlas que volver a escribir. Cuando en
Geany usamos la forma multilínea y pulsamos intro en cada una suele añadir un * para resaltarla.
Otro símbolo que podemos ver en el código son las llaves {}. Todo lo que se encuentra
entre llaves es un bloque de código. De momento nos sobra con saber que después de declarar
una clase se abren llaves al igual que con el main, al finalizar se cierran.
En Java todas las líneas, excepto declaraciones y otras especiales que veremos, terminan
con ;
33
José A. Navarro Java desde 0. Programación I
34
José A. Navarro Java desde 0. Programación I
7. Conceptos iniciales
Una de las primeras cosas que podemos realizar en un programa son operaciones.
Veamos un ejemplo de una suma:
Los números aparecen en verde porque son literales: el número 2 y el número 3, y siempre
serán esos dos números. En Java los literales pueden ser tipos de datos primitivos, cadenas de
texto o el valor null3.
Los tipos primitivos son tipos de datos que forman parte del propio lenguaje, están
definidos en él y no necesitan de importar ninguna librería. Los tipos primitivos de Java son:
Tenemos cuatro tipos de enteros y dos tipos de números reales o decimales. Cuando más
bits más grandes pueden ser.
Como podemos ver un carácter no es más que un entero de tipo short, de ahí que sea
muy fácil pasar de carácter a entero y viceversa. Un carácter no es más que un símbolo asociado
a un número entero. En Java se usa Unicode no obstante voy a mostrar el ejemplo con la tabla
ASCII ya que es más fácil de entender y es totalmente compatible:
3
Lo veremos más adelante
35
José A. Navarro Java desde 0. Programación I
Como podéis ver al carácter ‘A’ le corresponde el número 65, a la ‘a’ el 97 y luego hay una
serie de caracteres “extraños” y no imprimibles que también tienen su equivalencia en entero.
En Java un carácter siempre va entre comillas simples: ‘a’
Existe un tipo especial y muy importante en programación llamado booleano y que solo
puede contener dos posibles valores: verdadero o falso. No puede haber otra opción. En Java se
escriben en inglés: true o false.
En Java existe un tipo de datos NO primitivo, realmente es una clase pero se usa tanto
que quiero introducirlo aquí y es el String (la S en mayúscula). Esta clase es tan usada que Java
permite crear String’s de una forma similar a un tipo primitivo. Un String no es más que una
cadena de texto (uno o más caracteres) y se ponen entre comillas dobles, por ejemplo “hola
mundo”.
Caracteres de escape: Java al igual que otros lenguajes tiene una serie de caracteres
especiales que se pueden usar anteponiendo el carácter de escape \ (contrabarra):
Veamos un ejemplo con el más usado que es nueva línea y de paso comprenderemos
mejor la línea que uso para imprimir por pantalla.
36
José A. Navarro Java desde 0. Programación I
Pensemos que en Java existe “algo” llamado System que nos permite hacer algunas cosas.
Una de ellas es la comunicación con el exterior existiendo tres subapartados de ese System:
Por tanto, cuando usamos System.out lo que estamos diciendo es que dirija la información
a la pantalla. Dentro de ese System.out existen una serie de métodos4 que nos permiten imprimir
por pantalla, uno de ellos el println. Veamos:
Línea 7: Muestra “hola” y luego introduce una nueva línea al usar println.
Línea 9: Muestra “Pepe” y luego no introduce una nueva línea al usar print.
Línea 10: Muestra “Pedro” y luego no introduce una nueva línea al usar print. Como
antes no hemos introducido una línea nueva se escribe en la misma sin separación.
Línea 13: Muestra “Eva” y luego introduce una nueva línea al usar “\n”. Como antes no
hemos introducido una línea nueva se escribe en la misma sin separación.
Línea 14: Muestra “Pablo” y luego introduce una nueva línea al usar “\n”. Como antes
hemos introducido una línea nueva se escribe debajo.
Cuando Java ve la contrabarra sabe que viene un carácter especial y lo interpreta. Los
caracteres especiales como son texto también se pueden concatenar como luego veremos.
4
Un programita que ya viene hecho en Java y que podemos usar.
37
José A. Navarro Java desde 0. Programación I
Cuidado:
Esto funcionará sin ningún problema, pero lo siguiente no compilará pues un byte no tiene
suficiente precisión como para guardar el número 300:
Como hemos visto en la tabla de tipos el byte sólo llega hasta 127.
7.1 Variables
Antes hemos hablado de literales, pero obviamente no tiene sentido hacer un programa
que sólo sepa sumar 2+3, para ello existen las variables. Las variables no son más que porciones
de memoria a las que Java da un nombre y que guardan un dato.
Para declarar una variable primero se pone el tipo al que pertenece y luego su nombre.
<tipo> nombre;
Una variable, siempre debe iniciar con una letra (mayúscula o minúscula) o un
guión bajo (_).
Una variable puede contener números siempre que no comience por uno.
No pongáis acentos.
5
Palabras que tienen un significado para Java
38
José A. Navarro Java desde 0. Programación I
nombrePaterno
IdCliente
numero8
_conteoCiclos
Ejemplo de nombres no validos:
3puesto
numero Telefono
int
39
José A. Navarro Java desde 0. Programación I
Dirección
Nombre de la Línea de
de Contenido
variable código
memoria
0x00F2 x 6
0x00F4 y 7
0x00F6
0x00F8
Tabla 1. Variables, memoria 1
Dirección
Nombre de la Línea de
de Contenido
variable código
memoria
0x00F2 x 2 6
0x00F4 y 3 7
0x00F6
0x00F8
Dirección
Nombre de la Línea de
de Contenido
variable código
memoria
0x00F2 x 2 6
0x00F4 y 3 7
0x00F6 suma 10
0x00F8
40
José A. Navarro Java desde 0. Programación I
Dirección
Nombre de la Línea de
de Contenido
variable código
memoria
0x00F2 x 2 6
0x00F4 y 3 7
0x00F6 suma 5 10
0x00F8
Tabla 4. Variables, memoria 4
Varias variables también se pueden declarar en una misma línea: int x,y,z; o int x=2, y=3;
char letra=’aa’; Esto dará un error de compilación ya que un char sólo puede
contener un carácter.
String Aunque solo contenga una letra sigue siendo un String, una
letra=”a”; cadena de texto.
String Esto es el símbolo 5 no el número 5, por tanto “5”+2 no es 7
letra=”5”;
Tabla 5. Ejemplos de tipos letra
41
José A. Navarro Java desde 0. Programación I
7.2 Constantes
Java no tiene constantes como tal, pero se pueden simular usando unos modificadores
que veremos más adelante, pero de momento debéis de saber que podéis declarar una variable
cuyo contenido una vez asignado no pueda ser cambiado nunca, por tanto, se vuelve constante.
La sintaxis es:
7.3 Operaciones
Entre las operaciones aritméticas que podemos realizar con datos primitivos están:
+ Operador de Suma
- Operador de Resta
* Operador de Multiplicación
/ Operador de División
% Operador de Resto
Tabla 6. Operadores aritméticos
42
José A. Navarro Java desde 0. Programación I
El % ¿Qué es eso? El % no tiene nada que ver con porcentajes, ese símbolo
representa el módulo o lo que es lo mismo, el resto de una división.
7 5
5 1 Resto
2
Ahora mismo no le encontrareis sentido a lo del módulo. Tiempo al tiempo, posiblemente
es uno de los operadores más usados en programación.
Pero ¿Y la división? ¿Cómo lo solucionamos? La solución pasa por que uno de los
operandos sea decimal, solo con que uno sea decimal Java ya actúa como división decimal. Una
posible solución, de ir por casa, podría ser esta: (luego veremos una mejor)
43
José A. Navarro Java desde 0. Programación I
Fijaros como lo único que he hecho es cambiar uno de los números de int a double.
Ya funciona correctamente pero claro ahora todos los demás cálculos añaden el 0
decimal. Luego lo solucionamos.
Hay otro operador que se suele usar mucho y es el + ¿el +? A ver José, ¿Qué te has
fumado? Me has dicho que el + es suma. Sí, pero es un operador sobrecargado lo que significa
que puede hacer distintas operaciones dependiendo de los tipos con los que se encuentre y si
esos tipos son cadenas de texto el + significar concatenar o lo que es lo mismo unir dos textos:
String texto1=”hola “;
String texto2=”Mundo”;
texto1+texto2 es igual a “Hola Mundo”
44
José A. Navarro Java desde 0. Programación I
En la línea 12 está concatenando dos String, los une. Pero claro el operador + solo
une con lo que queda un poco feo todo junto.
El operador + se encuentra en la línea 14 con dos enteros por tanto actúa como suma.
Ilustración 57. Suma sin asignación Ilustración 56. Suma con asignación
Ambos códigos hacen exactamente lo mismo. Al principio, hasta que cojáis práctica podéis
usar el modo de la izquierda. El de la derecha no se ejecuta más rápido.
++ incremento
-- decremento
Tabla 8. Operadores de incremento
45
José A. Navarro Java desde 0. Programación I
Ilustración 61. Resultado Post incremento Ilustración 60. Resultado Pre incremento
Habrá muchos casos en los que da igual que forma uséis, por ejemplo, yo suelo usar
mucho x++, pero debéis de ir con cuidado porque en ocasiones no será lo mismo.
Está claro que era un ejemplo fácil, pero ¿a qué si hubiera escrito x=5+(8*2) nadie hubiera
dudado?
Con esto pasa como los comentarios, tan malo es pasarse como no llegar. Los paréntesis
ayudan a que el código sea más legible. Está claro que si yo hubiera querido que el resultado
fuera 26 tendría que haber escrito x=(5+8)*2 ya que el operador con más prioridad es el
paréntesis.
Huelga decir que si vais a hacer algo como esto uséis paréntesis: x=4+5*6/3.7-
5.9/9%67+23.
46
José A. Navarro Java desde 0. Programación I
() [] .
! ++ --
new (cast)
*/%
+-
< <= > >= instanceof
== !=
&&
||
?:
= *= /= %= += -=
Tabla 9 Prioridad de operadores
7.7 Casting
El casting son conversiones que se realizan entre tipos distintos. Existen dos tipos de
conversiones:
Hemos forzado a Java a que convierta un double a int. De esta forma podríamos solucionar
el ejemplo de la división: (double)x/y. Con transformas uno es suficiente.
47
José A. Navarro Java desde 0. Programación I
Hay que ir con mucho cuidado con los casting’s. En el primero si estuviera
al revés nos daría un error de compilación como vimos en el apartado de
los tipos. En el segundo no dará ningún error pero la y no valdrá 5.6 sino
solo 5 ya que en un int no se pueden representar decimales.
7.8 Ejercicios
int a=’a’;
System.out.println(a);
2. int pi=3.14;
System.out.println(pi);
6. Realizar un programa que dada una cantidad de dinero lo divida en billetes de 50,
20, 10, 5 y monedas de un euro (no hay céntimos)
48
José A. Navarro Java desde 0. Programación I
8. Estructuras de control
Como hemos visto, los programas contienen instrucciones que se ejecutan una a
continuación de la otra según la secuencia en la que hayamos escrito el código. Sin embargo,
hay ocasiones en las que es necesario romper esta secuencia de ejecución para hacer que una
serie de instrucciones se ejecuten o no dependiendo de una determinada condición o hacer que
una serie de instrucciones se repitan un número determinado de veces.
Las estructuras de control permiten modificar el orden natural de ejecución de un
programa. Mediante ellas podemos conseguir que el flujo de ejecución de las instrucciones sea
el natural o varíe según se cumpla o no una condición o que un bloque de instrucciones se repita
dependiendo de que una condición se cumpla o no.
Estructura Secuencial
Estructura Repetitiva.
Instrucciones de salto
Las primeras son las que hemos visto hasta ahora, después de la línea 1 se ejecuta la 2 y
luego la 3 y así todas.
49
José A. Navarro Java desde 0. Programación I
Ejemplo en Java:
Ilustración 65.Primer if
Todas las estructuras de Java solo permiten una única sentencia, para poder poner más
es necesario encerrarlas en un bloque entre llaves:
50
José A. Navarro Java desde 0. Programación I
== igual a
!= no igual a o distinto
Fijaros que a diferencia de otros lenguajes el igual no es “=” sino “==” y distinto o no igual
es “!=”.
51
José A. Navarro Java desde 0. Programación I
El if tiene otro compañero de viaje para cuando queramos que se haga algo si la condición
es falsa:
Cuando usamos un if-else siempre se ejecutará uno de los dos, siempre, pero jamás los
dos a la vez, o uno u otro.
52
José A. Navarro Java desde 0. Programación I
Cuando Java llega a la línea 8 primero hace la multiplicación y luego compara el resultado
con z. En este caso como es verdad mostrará el mensaje.
53
José A. Navarro Java desde 0. Programación I
Java sabe a qué if le corresponde un else por proximidad, se busca el if hacia arriba más
próximo que no esté ya asociado.
Importante: Fijaros como el código no lo he escrito todo alineado en vertical. Cada vez
que escribimos código que se encuentra dentro de un bloque hay que tabular hacia la derecha,
dejar unos espacios, a esto se le llama identación. Su usáis llaves al pulsar intro, Geany
automáticamente identa, si no lo tenemos que hacer nosotros. Hay lenguajes, como Python,
que si el código no está bien identado no compilan. A java le da igual que este identado o no,
como si queremos escribirlo todo en una línea, pero esto tiene un problema muy grande de
legibilidad, el código no se puede entender.
Esto no lo entiende nadie. A mis alumnos les suelo decir: “no hay identación, no hay
corrección”. Por favor, IDENTAD.
54
José A. Navarro Java desde 0. Programación I
La V representa verdad y la F falso. Veamos las tablas de verdad, con todas las
posibilidades de los operadores && y ||:
a b && ||
V V V V
V F F V
F V F V
F F F F
Tabla 12. Tabla de verdad AND y OR
a y b representan dos variables cuyo contenido puede ser verdadero o falso. Si analizamos
la tabla de verdad de ambos podemos llegar a las siguientes conclusiones. && (and) solo es
verdad cuando ambas variables lo son. || (or) sólo es falso cuando ambas variables lo son. Con
esto podemos concluir que al and da verdadero sí y solo sí todos sus operados son verdaderos.
Mientras que el or da verdadero sí y solo sí un operando sea verdadero, solo con uno verdadero
es suficiente, o lo que es lo mismo sólo puede dar falso sí y solo sí todos son falsos. Esto se
cumple para cualquier número de operandos.
a !a
V F
F V
Tabla 13.Tabla NOT
6
Las tablas de verdad se usan mucho en electrónica digital donde también existen estos operadores
llamándose puertas lógicas.
55
José A. Navarro Java desde 0. Programación I
a b a^b
V V V
V F F
F V F
F F V
Tabla 14. Tabla XOR
56
José A. Navarro Java desde 0. Programación I
Veamos lo sucedido:
1. Se ejecuta la línea 8: x==0 es verdad, y>2 es verdad, por tanto, V && V verdad.
Entra en el if y muestra “primero”.
2. Se ejecuta la línea 10: x==8 es mentira, y>2 es verdad, por tanto, F || V verdad.
Entra en el if y muestra “segundo”.
3. Se ejecuta la línea 12: x==8 es mentira, y>10 es mentira, por tanto, F && F falso.
No entra en el if.
4. Se ejecuta la línea 14: x==0 es verdad, y>10 es mentira, por tanto, V && F falso.
No entra en el if.
5. Se ejecuta la línea 16: x==0 es verdad, y>10 es mentira, por tanto, (x==0 && y>10)
es falso. z <10 es verdad, falso (del anterior) || verdad es verdad. Entra en el if y
muestra “quinto”.
Ver anexo III
Las líneas 9 y 10 hacen exactamente lo mismo. Es lo mismo comparar con true que poner
la variable sola, ya que si es verdadera es cuando entra.
57
José A. Navarro Java desde 0. Programación I
Las líneas 12 y 13 hacen lo mismo. Es lo mismo comparar la variable con false que negarla
ya que al escribir !temp le estamos diciendo no temp o sea falso, no entrará.
Ejemplo:
Hemos visto como los operadores de comparación son para tipos primitivos, entonces
¿Por qué funciona el == con String si este tipo no es primitivo sino una clase? Como
hemos visto los String (texto) son tan usados que Java permite un uso “cómodo” de
los mismos de forma que se declaran y se utilizan como un tipo primitivo. Por otro
lado, Java es muy listo y cuando ve que creamos dos variables con el mismo texto no
crea dos espacios de memoria distintos para cada una, sino que ambas variables
apuntan a la misma dirección de memoria.
Este modo de actuar puede causar algunos inconvenientes, como os explicaré en
capítulos posteriores. Por ello para ver si dos objetos son iguales existe otra forma que
nunca falla y es usar el método equals. equals (lo estudiaremos también) nos dice si
dos String son iguales, por tanto, la forma correcta de ver si dos textos son iguales no
es usando == sino equals y se usa de la siguiente forma: variable1.equals(varable2);
String texto1=”hola”;
String texto2=”pepe”;
if(texto1.equals(texto2))
…….
Como podéis observar una de las dos variables, da igual cuál, llama a equals y entre
paréntesis se pone la otra. Antes del equals siempre va un “.” que indica que queremos
usar ese método7.
Sé que esto es un poco complejo de entender ahora pero cuando veamos las clases lo
entenderéis del todo. Vamos a hacer lo que yo llamo un salto de fe.
7
Un pequeño programa para solucionar un problema que, en este caso, alguien ha hecho por nosotros.
58
José A. Navarro Java desde 0. Programación I
8.1.2 switch
Cuando queremos hacer cosas distintas dependiendo del valor que tenga una variable
podemos usar varios if comprobando el valor de la misma o usar la estructura switch.
3. Los distintos casos se ponen usando la palabra case y el valor que se espera
seguido de “:”.
4. Después de los “:” vienen las instrucciones que queremos que se ejecuten.
59
José A. Navarro Java desde 0. Programación I
¿Qué ha pasado? Muy simple, el switch se ejecuta todo seguido entrando en todos los
casos, para que esto no ocurra usamos la sentencia break que lo que hace es terminar el switch
y seguir con la ejecución del programa. De esta forma poniendo un break en cada caso solo
entrará en el correcto. El último break no es necesario pues después no hay más casos, yo
personalmente siempre lo pongo.
60
José A. Navarro Java desde 0. Programación I
Ahora podemos ver como ya funciona correctamente. Dentro de un case podemos poner
tantas sentencias como queramos entre sus “:” y el break. Existe una opción que se puede añadir
en un switch para que se ejecute en caso de que ninguna de las opciones se la correcta, default:
Como podéis ver al no existir el 8 entre los casos se ejecuta el por defecto.
En este caso como el tipo es char en los case se usan comillas simples.
61
José A. Navarro Java desde 0. Programación I
8.2.1 while
El while es el primer bucle que tenemos y su sintaxis es la siguiente:
while(condición)
<sentencias>
El while se repite mientras se cumpla la condición (sea verdadera). Lo que podemos poner
entre paréntesis es exactamente lo mismo que lo visto en el if (operadores de comparación,
lógicos y expresiones que den como resultado true o false) y al igual que este si hay más de una
sentencia se pueden usar llaves.
Veamos un ejemplo en el que vamos a mostrar los números del 0 al 9 por pantalla:
En la línea 8 podemos ver como la condición del while es “mientras numero <10” de forma
que hasta que numero no sea 10 no saldrá del bucle.
Veamos que sucede:
62
José A. Navarro Java desde 0. Programación I
Solo hacen que salir ceros sin parar ¿Por qué? Porque no hay nada dentro del while que
cambie el valor de la variable numero y por tanto la condición siempre es verdad.
63
José A. Navarro Java desde 0. Programación I
8.2.2 do
La estructura do es la prima hermana del while, la única diferencia es que la condición se
comprueba al final y no al principio.
En este caso son necesarias las llaves siempre y como excepción a la regla después de la
condición del while sí se pone “;”.
Hagamos el mismo ejemplo que con el while pero usando el do:
Ilustración 100. do
64
José A. Navarro Java desde 0. Programación I
8.2.3 for
El for es un bucle un poco más complejo, veamos:
La sintaxis es la siguiente:
for(valor inicial;condición;incremento)
<sentencias>
Las partes del for se separan por “;”.
1. Valor inicial: es el valor que tiene la variable que controla el for. Normalmente se
suele declarar en el propio for y por algún motivo que desconozco suelen usarse
las letras i, j , t.
2. Condición: nos indica cuantas veces se va a ejecutar el for. Para elegir una
condición podemos pensar en “mientras…” como si fuera un while.
65
José A. Navarro Java desde 0. Programación I
El for tiene muchas variaciones, por ejemplo, imaginad que quiero imprimir del 9 al 0, de
mayor a menor:
En este ejemplo se imprime por pantalla los números del 9 al 0. Fijaros en la inicialización
de la variable, la condición y que se ha sustituido el incremento por un decremento.
Cada parte del for puede tener más de una expresión. Un for puede
tener más de una variable, una condición con operadores lógicos y
más de un incremento o decremento. Este for sería correcto for(int
i=0,j=5;i<10 && j>0;i++,j--) si bien no es lo habitual.
8
Ejecución de las sentencias de un bucle
66
José A. Navarro Java desde 0. Programación I
Uso de char: Un char no es más que un entero que como ya hemos visto están codificados
mediante la tabla ascii o Unicode por tanto puedo hacer esto sin tener que recurrir a métodos
de transformación ni casting’s
No, la Ñ no está codificada después de la N. Si miráis en la tabla del capítulo anterior veréis
que es el número 165.
67
José A. Navarro Java desde 0. Programación I
Continue: hace exactamente lo mismo, pero en vez de salir del bucle fuerza la
siguiente iteración.
Si usáis el break, lo más probable es que no habéis pensado bien la condición. Cualquier
break se puede sustituir por una variable booleana para poder salir y cualquier for se puede
transformar en un while.
Ya sé lo que va a pasar ahora, seguro que tenéis algún amigo que os dice que esto es una
tontería y que no sé de lo que hablo, que con el break los programas van más rápidos… Me
parece perfecto, para él todos, arrieros somos y en el camino nos encontraremos. Yo enseño
programación no a codificar espaguetis.
¿Significa esto que jamás debemos de usar un break? NO. Obviamente como ya hemos
visto el break es necesario en un switch. Pero no solo eso, cuando programéis de forma
concurrente con threads y sockets pues sí, uno o dos break serán necesarios9.
9
Véase el servidor Apache
68
José A. Navarro Java desde 0. Programación I
8.3 Ejercicios
1. Realiza un programa que realiza la siguiente figura por pantalla
*
***
*****
2. Realiza un programa que muestre por pantalla los 5 primeros números naturales.
3. Realizar un programa que muestre los 100 primeros números primos.
4. Realizar un programa que muestre las tablas de multiplicar.
5. Realizar un programa que muestre por pantalla los números del 1 al 100 sin
mostrar los múltiplos de 5.
6. Realiza un programa que realiza la siguiente figura por pantalla.
*
***
*****
*******
*****
***
*
69
José A. Navarro Java desde 0. Programación I
9. API
Como ya vimos Java es un lenguaje orientado a objetos puro. Nosotros estamos evitando
el uso de la POO, pues la iremos viendo mediante aproximaciones, pero no podemos evitar tener
que usar clases, objetos o métodos que ya están hechos. Java cuenta con una extensa librería,
estructurada en paquetes, con un sinfín de clases y métodos que ya están hechos y podemos
usar. Lo único que debemos de saber es cómo se usan.
Lo primero es acceder a esta API, para ello basta con buscar API Java 8 en google y es el
primer resultado. No obstante os dejo el enlace a la API del JDK 8:
https://docs.oracle.com/javase/8/docs/api/
Paquetes Pantalla de
información
Clases, interfaces y
excepciones
Podemos ver como la clase String se encuentra en el paquete java.lang y tiene un método
para comprobar si dos String son iguales que devuelve un booleano. Si pulsamos sobre el
método nos da más información:
70
José A. Navarro Java desde 0. Programación I
71
José A. Navarro Java desde 0. Programación I
72
José A. Navarro Java desde 0. Programación I
La entrada por teclado se realiza mediante flujos de entrada llamados streams pero
gracias a la API podemos poner una capa de abstracción y usar una clase que nos va a facilitar
esta entrada. Esta clase es Scanner. Scanner se encuentra en el paquete java.util, por tanto lo
primero que debemos de hacer antes de poder usarla es importarla. Podéis ver en la API los
métodos que tiene, de todos ellos los que más vamos a usar son:
(Obviamente hay muchos más, pero para los fines de este manual con estos nos sobran)
Lo primero que debemos de saber es que todo lo que se introduce por teclado es texto.
Por tanto, si lo que se necesita es leer un entero lo que se hace es una conversión. Por ejemplo:
si uso nextLine() como es texto no hace ninguna conversión ni nada, pero si lo que quiero es leer
un entero al usar nextInt() lo que hace es leer como texto y luego transformarlo a entero.
Como he dicho antes para poder usar Scanner lo primero que debemos de hacer es
importar la clase:
import java.util.Scanner;
Esta línea se pone al principio de todo, antes de crear la clase principal. Con ella le decimos
que importe la clase Scanner que se encuentra en el paquete útil dentro de las librerías de java.
El camino hasta la clase en concreto se separa con puntos.
Una vez importada y ya dentro del programa debemos de crear un objeto (variable) que
represente a Scanner y podamos usarlo por el nombre que le demos. Scanner necesita para
poder crearse que le digamos de donde va a leer, si la salida estándar para imprimir es
System.out la entrada estándar es System.in:
Scanner sc=new Scanner(System.in);
Con esta línea lo que creamos es una “variable” llamada sc del tipo Scanner y luego con
el operador new le decimos que tiene que leer de la entrada estándar. “sc” es el nombre que le
damos, podríamos llamarle entrada lo que sucede es que es común ponerle sc de esta forma al
leerlo todos entienden que viene de un Scanner. En este manual y para la entrada estándar esta
línea siempre será la misma. Una vez creada la “variable” ya podemos usar sus métodos.
73
José A. Navarro Java desde 0. Programación I
Veamos un ejemplo:
3. En las líneas 8 y 9 creo dos variables para recibir lo que el usuario va a introducir.
4. En la línea 11 muestro un texto para que el usuario sepa que debe de hacer, fijaros
como uso print para que el cursor se quede esperando en la misma línea.
6. Con las líneas 13 y 14 pasa lo mismo solo que nextInt() lee el texto lo transforma
en un int y lo guarda en la variable número.
74
José A. Navarro Java desde 0. Programación I
Fijaros en la salida. Para que Java entienda que es un decimal hay que usar la “,” no él “.”
Mientras que cuando lo muestra lo hace con “.”. Esto sucede porque Java usa el punto decimal
pero como estás viendo estoy usando un entorno Windows y para este el decimal es la coma,
por ello en la entrada debemos de teclear “,” ya que depende de Windows, no de Java.
¿Qué sucede si usamos el punto o peor todavía, si el usuario teclea algo que no es
correcto?
75
José A. Navarro Java desde 0. Programación I
Cualquier next con conversión (nextInt, nextDouble…) lo que hacen es coger lo que
hay que transformar, el número por ejemplo, y devolverlo en una variable pero
dejan el intro que ha pulsado el usuario en el flujo de entrada. Cuando esto sucede
si intentamos leer otra vez del teclado nos da la sensación de que Java pasa de
nosotros y no pausa la ejecución para dejarnos escribir. Esto sucederá siempre que
usemos un next con conversión y después uno sin. Por ejemplo: nextInt() y después
un nextLine(). Solo sucede en este caso, no si primero hay nextLine() o si hay muchos
nextInt() y nextDouble() pero ningún nextLine(). Cuando esto suceda lo que hay que
hacer es antes de realizar el nextLine() limpiar el flujo de entrada y eliminar ese
retorno de carro y lo más rápido es usar un nextLine() sin guardar su resultado. Por
ejemplo:
Métodos de la clase String que nos pueden ser de utilidad y sí podemos usar:
Todos los caracteres de un String tienen un índice que comienza por 0. Por ejemplo: “hola”
tiene una longitud de 4 y sus índices son:
0 1 2 3
h o l a
Por tanto, para recorrer un String solo podemos llegar hasta longitud-1.
76
José A. Navarro Java desde 0. Programación I
En la línea 9 creamos un for que parta de 0 sin llegar hasta el final y que se incremente en
uno. Con charAt(i) vamos sacando el char de cada índice que se corresponde con la i. Si la palabra
es hola la i tomará los valores desde 0 hasta 3. ¿Qué sucede si en vez de <texto.length() pongo
<=texto.length(). Estaré intentando acceder al índice 4, que no existe y me dará una excepción:
77
José A. Navarro Java desde 0. Programación I
10.1 Ejercicios
1. Realizar una calculadora básica de 4 operaciones (+, -, *, /) con menú. Los
resultados deben de ser congruentes.
2. Realizar los cambios pertinentes a la calculadora para que controle los números
de opciones válidos y que se ejecute preguntando una opción hasta seleccionar
5-salir.
78
José A. Navarro Java desde 0. Programación I
11. Vectores
Hasta ahora hemos usado variables para guardar nuestros datos, pero imaginaros que
necesito guardar 100 enteros, crear una variable por cada uno no es inviable. Para esto existen
los vectores (arrays, matrices, arreglos…). Un vector es una estructura a la que se le da un
tamaño y un tipo y puede guardar tantos datos de ese tipo como su tamaño.
índices 0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
valores
Cada casilla del vector tiene un índice que es un entero y que comienza por 0 (similar a
los String). Podemos acceder a una casilla mediante su índice. Dado que los índices comienzan
por 0 si el vector es de 10 solo podemos llegar hasta el 9, si no nos salimos del vector y da una
excepción. Para saber la longitud de un vector podemos usar el nombre del vector seguido de
.length.
Para declarar un vector y acceder usamos los corchetes. Veamos varios ejemplos y lo
entenderemos mejor.
79
José A. Navarro Java desde 0. Programación I
1. En la línea 6 declaramos el vector, para ello ponemos primero el tipo del que va a
ser (todo el vector será de tipo int), luego para indicar que lo que estamos
declarando es un vector lo indicamos con corchetes, después viene el nombre del
vector. Una vez declarado le indicamos el tamaño usando el operador new
seguido del tipo y entre corchetes el tamaño. Hemos declarado un vector de
enteros de tamaño 5.
2. Para guardar un número en una casilla ponemos el nombre del vector y entre
corchetes el índice de la casilla donde queremos guardar el número y le
asignamos el valor (líneas de la 8 a la 11).
80
José A. Navarro Java desde 0. Programación I
Muchas veces nos va a suceder que a la hora de declarar un vector no sabemos su tamaño
porque depende de un cálculo o la entrada del usuario. Podemos declararlo arriba junto con las
demás variables y darle el tamaño cuando lo sepamos:
Se ponen los valores entre llaves separados por “,” sin usar el new. Java automáticamente
crea el vector con el tamaño necesario y asigna a cada índice su valor.
Para declarar un vector se puede usar la sintaxis C: int vec []. Donde el
nombre va antes de los corchetes. Yo os recomiendo usar la propia de
Java.
81
José A. Navarro Java desde 0. Programación I
3. Con el segundo for recorro el vector multiplicando lo que hay en cada casilla y
guardándolo en la misma.
4. El último for imprime por pantalla en horizontal y separados por un espacio los
números.
82
José A. Navarro Java desde 0. Programación I
Como veis al igual que el Scanner hay que importarla, una vez importada la forma más
fácil de crear un objeto “variable” para poder usarla es usar la sintaxis de la línea 7. Dentro del
primer for para generar un número aleatorio entre 0 y 9 llamo a nextInt(10) ya que el número
generado estará entre 0 y 10-1.
¿Y si quiero números entre 15 y 36 por ejemplo?: 36-15=21 dado que saca un aleatorio
menos 21+1=22. Me explico:
11.1 Ordenación
Una de las cosas más importantes que tienen que ver con vectores son los algoritmos de
búsqueda y ordenación. Dado que este manual no pretende enseñar estructuras de datos y que
Java ya tiene soluciones para esto no voy a explicarlas aquí, lo veré en el siguiente manual. No
obstante, si es importante probar, como mínimo, un algoritmo de ordenación y fijaros que he
dicho probar ya que este tipo de algoritmos ya están hechos y probados, simplemente hay que
conocerlos, pero no es necesario sabérselos de memoria.
Veamos el algoritmo de ordenación más simple que podemos encontrar, el de la burbuja.
El algoritmo de la burbuja sirve para ordenar cualquier tipo de vectores, si bien nosotros
83
José A. Navarro Java desde 0. Programación I
veremos el ejemplo con enteros. Este algoritmo lo que hace es ir desplazando los números
mayores hacia la derecha dejando los menores en la izquierda, como si fueran burbujas que van
subiendo. De ahí su nombre.
Ejemplo en Java:
Si es mayor se
intercambian con
la ayuda de aux
Como podéis ver el algoritmo funciona pero se puede mejorar. El problema de este código
es que, aunque llegue un momento en que el vector ya este ordenado el sigue iterando hasta
que el primer for lo recorra todo. Para evitar esto podríamos hacer este cambio:
84
José A. Navarro Java desde 0. Programación I
Añadimos una variable booleana que nos indica cuando hay un cambio, en el momento
que sea false se sale de while sin terminar de recorrer lo que queda del vector.
11.2 Matrices
Los vectores pueden tener más de una dimensión, una matriz es un vector de dos
dimensiones. Imaginad que dentro de una casilla de un vector creamos otro vector y lo
representamos en columnas. Una matriz de 5x5 se vería así:
Filas
Columnas
Para posicionarnos en una casilla no es suficiente con una coordenada, necesitamos dos
(fila, columna). Para declarar una matriz usamos dos corchetes, el primero indica las filas y el
segundo las columnas. Para acceder a ella lo hacemos igual:
matriz[1][3]=7;
x=matriz[5][3];
85
José A. Navarro Java desde 0. Programación I
3. Para mostrarla igual necesito los dos for, lo que hago es que para que salga por
pantalla de forma “bonita” cada vez que termina el for de las columnas imprimo
un retorno de carro.
Las matrices no tienen por qué ser cuadradas (filas=columnas) por ejemplo creemos una
de 10x4:
86
José A. Navarro Java desde 0. Programación I
¿What? Algo ha ido mal. Si nos fijamos en el error la línea 12 está intentando acceder a al
índice 4 pero ese índice no existe, el máximo es 3. Lo que está sucediendo es que en el segundo
for hemos puesto j<matriz.length y length devuelve 10, siempre devuelve el tamaño de la
primera dimensión. Como antes era cuadrada no ha pasado nada, pero ahora j no puede llegar
a 10 solo a 3. Para especificar la longitud de la segunda dimensión lo que debemos es fijarnos
en una fila de la primera, realmente cualquiera vale, pero lo más fácil es usar la 0. Para ello
llamaremos a length pero de una fila en la primera dimensión:
87
José A. Navarro Java desde 0. Programación I
Las matrices pueden tener las dimensiones que queramos, 3 sería un cubo. Cada
dimensión que queramos añadir es un corchete más y un for más para recorrerla.
11.3 Ejercicios
1. Rellenar un vector con números del 0 al 9 y mostrarlo por pantalla.
5. Realizar un programa que mantenga una pequeña base de datos básica usando
vectores sobre los alumnos matriculados y sus notas. El programa pedirá cuantos
alumnos van a haber y luego pedirá el nombre y la nota de alumnos hasta
introducir la letra ‘s’. Luego me permitirá consultar sus datos mediante el número
de referencia asignado a los alumnos (índice) hasta introducir -1, con lo que
terminará. Si se intentan matricular más alumnos de los permitidos el programa
avisará de que el cupo ya está lleno. Hay que controlar que los índices para
consultar sean válidos.
6. Crear y cargar dos matrices de tamaño 3x3 con números aleatorios. Mostrarlas.
Sumarlas y mostrar su suma.
88
José A. Navarro Java desde 0. Programación I
12. Métodos
Hasta ahora hemos usado métodos ya definidos en alguna clase de la API de Java
(nextLine, println…). Ahora vamos a aprender a crear nuestros propios métodos en la clase
principal, junto al main para luego ya poder crearlos en las clases que queramos.
Los métodos se distinguen por un nombre, pueden tener uno, varios o ningún parámetro
de entrada y devolver o no un resultado. También tienen un ámbito y siempre van entre llaves.
public [static] void sumar (int x, double z){
}
Parámetros de entrada
Sin instancia
Ejemplos:
1. Método que muestra por pantalla “hola”
public static void mostrar(){
System.out.println(“hola”);
System.out.println(“hola ”+ nombre);
return x+y;
89
José A. Navarro Java desde 0. Programación I
Cuando se llama a un método el programa se apunta la línea donde estaba y salta hasta
la dirección de memoria donde está el método. Cuando termina de ejecutar el método se vuelve
a la línea almacenada que es la siguiente a la de la llamada.
El programa salta hasta la dirección del método y lo ejecuta. Luego vuelve al main. Saldrá
por pantalla: “hola”.
Los métodos pueden devolver un resultado al main después de ejecutarse. Ese resultado
se puede guardar en el main en una variable.
Se llama por su nombre y entre paréntesis se le pasa lo que necesita para realizar su tarea,
en este caso un String. Fijaros como el siguiente código no tendría sentido:
int x;
x=mostrar(“pepe”);
El método está declarado como void, por lo que no devuelve ningún resultado, lo que
hace lo hace desde dentro sin devolver ningún dato al main. Mostraría por pantalla: “Hola pepe”.
Sigamos y lo entenderéis.
12.1 Static
Cuando declaramos un método como static en una clase significa que ese método va a
ser el mismo para todos los objetos que se creen. Esto es un poco complejo de explicar antes de
ver como declarar nuestras propias clases, de momento como vamos a crear todos los métodos
en la misma clase donde se encuentra el main, los declararemos como static. Cuando lleguemos
al capítulo de las clases lo entenderéis fácilmente. Se podría decir que se encuentra en un
entorno estático, no instanciable (no se necesita crear un objeto para usarlo).
10
Página 109
90
José A. Navarro Java desde 0. Programación I
12.3 Return
Veamos ahora el ejemplo 4: En el main el código, por ejemplo, sería este:
int x;
x=sumar(5,2);
Declaro la variable x.
Java ve que la segunda línea es una asignación, con lo que primero tiene que
resolver la parte de la derecha, se da cuenta que es un método y lo llama
pasándole los valores 5 y 2, ya que son los parámetros que necesita el método
para funcionar (dos parámetros de tipo int).
Al final la x vale 7.
91
José A. Navarro Java desde 0. Programación I
Ejemplos:
En el primer ejemplo el método está declarado como void, no devuelve nada, cuando
termina sigue con la siguiente línea donde se ha quedado en el main. Se le llama por su nombre
y no necesita nada:
En el segundo ejemplo vamos a realizar un método que calcule la media de dos números
enteros. Devuelve un double que lo recoge el main y lo imprime. El método ya no es void y tiene
un return indicando lo que va a devolver. También cuenta con dos parámetros que indican los
números de los que se quiera sacar la media. Divido por 2.0 para que haga la división decimal:
92
José A. Navarro Java desde 0. Programación I
Nos encontramos con dos tipos, los parámetros formales y los parámetros reales:
Parámetros formales: Son las variables que recibe el método, se crean al definir
el mismo, son los que se ponen entre paréntesis y se usan como variables locales
dentro del método. Su contenido lo recibe al realizar la llamada al método de los
parámetros reales. Cuando el método termina su ejecución, mueren.
Ejemplo:
Formales
Reales
93
José A. Navarro Java desde 0. Programación I
Por valor: se le pasa al método una copia del valor de la variable, de esta forma si
el parámetro sufre algún cambio dentro del método no se ve reflejado en la
variable del llamante.
El resultado es:
94
José A. Navarro Java desde 0. Programación I
95
José A. Navarro Java desde 0. Programación I
96
José A. Navarro Java desde 0. Programación I
Como Java ha pasado la variable vec por referencia, vec y vector son lo mismo, no es una
copia, sino que apuntan a la misma dirección de memoria.
Cambio el contenido de la posición 1 del vector, pero como son el mismo se cambia en el
original.
97
José A. Navarro Java desde 0. Programación I
12.5 Recursividad
La recursividad es una propiedad que tienen los métodos (funciones en otros lenguajes)
de llamarse a sí mismas para resolver un problema. En el cuerpo del método se encuentra una
sentencia que es una llamada al propio método. Veamos un ejemplo y su funcionamiento:
n!=n*(n-1)!
El factorial de 4 es: 4!=4*3*2*1 (no pongo el 0 cuyo factorial es 1). De forma que el
factorial es el producto del número por todos los anteriores hasta uno, por tanto podríamos
pensar que para calcular el factorial de n llamamos al método y desde el cuerpo de este se va
llamando a si mismo tantas veces como necesita con n-1. Obviamente esto tiene un peligro y es
crear un bucle infinito que produzca que no se salga nunca del método, incluso que acabemos
con la memoria disponible, para que esto no suceda debemos de asegurarnos de que en un
momento las llamadas terminarán, en este caso cuando n sea 1.
98
José A. Navarro Java desde 0. Programación I
Recordemos con lo aprendido en capítulos anteriores como sería el ejemplo del factorial
de forma iterativa y por ende menos costosa.
Los parámetros son los valores que el método necesita para hacer su cometido.
99
José A. Navarro Java desde 0. Programación I
Los métodos deben de realizar cosas simples, no muchas cosas en uno solo.
12.6 Ejercicios
1. Realizar un programa usando métodos que me diga si una frase introducida por
teclado es un palíndromo.
2. Realizar un programa usando métodos que me diga la letra de un DNI.
4. Crear un programa para jugar al tres en raya. Dividir el juego en métodos por
ejemplo: comprobarDiagonal, comprobarColumnas, tirada, etc.
100
José A. Navarro Java desde 0. Programación I
13. Clases
En este capítulo vamos a “pegar” todas las piezas que hemos ido viendo y utilizar la
orientación a objetos. Como comentaba al principio del manual, el mundo lo podemos ver como
objetos, todo son objetos (coches, personas, lápices, …), la programación orientada a objetos lo
que trata es de subir un nivel más la abstracción de forma que programar se aproxime más a
nuestra forma de interactuar en la vida real, dado que en la vida real tenemos una serie de
objetos y los usamos, en Java también. Por ejemplo, en la vida real existe un objeto llamado
coche que tiene unas propiedades (color, matricula…) y una serie de acciones que se pueden
realizar sobre él (conducir, repostar…), en programación orientada a objetos crearemos esos
objetos y los usaremos.
Identidad: Cada objeto es único y diferente de otro. Yo puedo tener dos coches,
pero no son el mismo, son dos coches distintos.
Estado: Son las propiedades o atributos que tiene ese objeto (color, peso,
matricula…)
Comportamiento: Las cosas que puede hacer, los métodos que tiene (repostar,
conducir, aparcar…).
Mensajes: Los objetos pueden interactuar entre ellos usando los métodos.
String, Scanner, Random son clases que ya hemos usado, aunque no sepamos
muy bien el funcionamiento. Aparte de entenderlas vamos a aprender a crear
las nuestras propias. Haciendo las nuestras entenderemos la API.
101
José A. Navarro Java desde 0. Programación I
Coche
Matricula
Bastidor
Color
Marca
Modelo
…
conducir(double km) //conduce unos Km
repostar(double litros) //pone gasolina
imprimir() //muestra los datos
En una clase definimos el nombre, las propiedades y los métodos (comportamiento) que
van a tener todos los objetos de tipo coche. Podríamos ver una clase como una plantilla de la
que se van a crear los objetos. Cuando nosotros creamos un coche concreto (instanciamos), por
ejemplo, un Ford Fiesta con matricula 1234CFV, bastidor: 1243gj4589839, de color rojo; eso es
un objeto. Realmente se dice que hemos instanciado un coche creando uno en concreto.
Lo mismo pasaría con la clase Persona, la clase definiría lo que es una persona, pero
cuando la instanciamos creando una persona en concreto, distinta de las demás, eso es un
objeto.
102
José A. Navarro Java desde 0. Programación I
Si en ese código creamos otra persona por ejemplo Pedro, las propiedades y métodos de
Pepe y Pedro están guardados en posiciones distintas de memoria, el cambiar algo o actuar
sobre uno de ellos no repercute sobre el otro, sólo usan la misma clase (plantilla) para crearse.
Java permite declarar más de una clase en un único fichero, pero ese es
tema del siguiente manual, de momento cada clase debe de guardarse en
un fichero con “exactamente” el mismo nombre. Si la clase se llama “Pepe”
se tiene que guardar en el fichero Pepe.java.
Es una buena práctica y denota conocimiento, que las clases comiencen
con la primera letra en mayúsculas.
Dado que estamos usando Geany en modo súper simple, para que cuando
instanciamos una clase la encuentre la guardaremos en la misma carpeta.
En próximos manuales veremos el uso de paquetes con otros IDE.
Todos los objetos se instancian con el operador new
103
José A. Navarro Java desde 0. Programación I
b. Inicializa propiedades.
d. Ejecuta el constructor.
Los inicializadores static son un bloque de código que se ejecutará una sola vez al usar la
clase, a diferencia del constructor que luego veremos.
Este tipo de inicializadores no devuelven ningún valor, son métodos sin nombre y entre
otras cosas se suelen usar para inicializar objetos complejos, inicializan propiedades static, y
permiten gestionar las excepciones.
13.3 Constructores
En la primera aproximación de la clase Persona hemos visto como se crea el objeto y luego
le damos valores a sus propiedades, pero sería interesante poder crear un objeto ya con los
datos que queremos.
Un constructor sirve para que Java reserve la memoria que necesita para el objeto e
inicializar este. Nos podemos encontrar con dos casos:
104
José A. Navarro Java desde 0. Programación I
En Java pueden existir, en una clase, más de un constructor con el mismo nombre siempre
y cuando el tipo y número de parámetros que recibe no sea el mismo, esto es muy útil pues nos
105
José A. Navarro Java desde 0. Programación I
permite crear objetos de distinta forma dependiendo de los datos que usemos como
parámetros.
Veamos un ejemplo:
Como se puede observar existen tres constructores, el primero necesita todos los datos,
el segundo solo el nombre y apellidos, el último nada. De esta forma pepe tiene todos sus datos,
luis solo el nombre y apellidos, no sabemos su edad ni si está jubilado, de pedro no sabemos
nada.
106
José A. Navarro Java desde 0. Programación I
Algunos lenguajes como C++ tienen destructores para liberar memoria, cerrar
conexiones, … antes de terminar el programa. Java NO tiene destructores, existe
un método llamado finalize con el fin de liberar memoria llamando al garbage
collector (recolector de basura), pero en Java no se puede predecir cuándo se va a
ejecutar ese proceso, podríamos decir que pasa cuando “le da la gana”, por todo
esto lo mejor es dejarlo en manos de la máquina virtual java.
A los parámetros formales les hemos puesto nombres distintos a las propiedades, pero la
mayoría de veces esto no es una buena práctica pues los nombres no son representativos y por
tanto no ayudamos a la legibilidad del código. Una mejor opción hubiera sido la siguiente:
Como podéis ver esto es más legible, pero tiene un pequeño problema: cuando hacemos
dentro del constructor nombre=nombre Java no sabe distinguir a que nos referimos en cada
parte de la asignación, de hecho, saberlo lo sabe, se cree que nos referimos a los parámetros.
Para resolver este problema usamos el this.
107
José A. Navarro Java desde 0. Programación I
Cuando java busca el nombre de una “variable” lo hace de fuera hacia dentro de los
métodos. Primero mira si el nombre es una variable local en el método, si existe
entiende que nos referimos a la variable, si no la encuentra busca en los parámetros,
si lo encuentra nos estamos refiriendo a ese parámetro, si no lo busca en las
propiedades. Si no lo encuentra es cuando ya da error. Con el this hacemos que
siempre sepa que nos referimos a alguna propiedad.
108
José A. Navarro Java desde 0. Programación I
109
José A. Navarro Java desde 0. Programación I
Como podemos ver en la clase Persona hemos añadido los modificadores de acceso. Las
propiedades son de tipo private, el modificador se pone a la izquierda del tipo. Al ser private no
puede ser accedido por ninguna otra clase. Los constructores son public de forma que pueden
ser accedidos desde cualquier clase, pensad que es lógico ya que se tienen que poder ejecutar
al construir un objeto. (en este caso no es necesario ponerlo ya que al no poner nada actúan de
igual forma. Es importante recalcar que, aunque es una práctica común no ponerlo en los
constructores, en los demás métodos es conveniente especificar siempre el modificador de
manera explícita).
Veamos ahora a la clase Prueba: las líneas de la 6 a la 8 se ejecutarán sin problemas, pero
la línea 10 está intentando acceder a una propiedad que es privada, el compilador se da cuenta
y nos avisa de que no puede hacerse, no dejando compilar la clase. Esto sucedería tanto para
guardar algo en una propiedad, como es el caso, como para leerla.
Por norma no se debe de tener acceso a la estructura interna de las clases, esto implica
que las propiedades serán privadas y aquellos métodos que no sea necesario usar desde fuera
de la clase también. Pero, si las propiedades de un objeto tienen que ser privadas ¿Cómo puedo
modificarlas o consultarlas?, muy simple, con los llamados getter’s y setter’s. Un getter es un
método, publico que me devuelve el valor de una propiedad y un setter es un método, también
publico, que me permite cambiar el valor de una propiedad. El nombre de estos métodos se
forma de la siguiente forma:
El prefijo set o get seguido del nombre de la propiedad teniendo en cuenta que el primer
carácter de esta se escribe en mayúsculas. Nosotros podríamos crear los métodos con los
nombres que quisiéramos, pero si hacemos eso el código será menos legible y opciones más
110
José A. Navarro Java desde 0. Programación I
avanzadas de Java SE o Java EE no funcionarán correctamente. Por tanto, sigamos las buenas
prácticas de Java, veamos un ejemplo:
13.6 Static
En Java no existen variables globales, esto significa que para que todos los objetos de una
clase compartan una única propiedad debe de ser declarada como static.
En el ejemplo anterior vemos como la propiedad numPajaros está declarada como static
(se pone después del modificador de acceso), esto hace que todos los objetos de tipo Pajaro
111
José A. Navarro Java desde 0. Programación I
El siguiente código crea tres pájaros y consulta el número de pájaros usando uno de ellos,
el resultado será 3:
Los métodos con static son llamados de clase y los métodos “normales” se llaman de
instancia.
Reglas:
Los métodos static no tienen referencia this.
Un método static no puede acceder a miembros que no sean static
Un método no static puede acceder a miembros static y no static
La clase Math del paquete java.lang donde se encuentran los métodos para
realizar operaciones matemáticas, se conoce como una clase estática, pues todos
sus métodos son static. Para calcular una raíz cuadrada no instanciamos un objeto
simplemente usamos el nombre de la clase y el método a usar: Math.sqrt(25).
Veremos esto en los anexos.
13.7 Final
Java no tiene constantes como tal, pero tenemos una forma de hacer que una propiedad
de un objeto no pueda cambiar. Para ello usamos el modificador final.
112
José A. Navarro Java desde 0. Programación I
Cuando usamos final después del modificador de acceso le estamos diciendo que esa
propiedad no puede ser cambiada. Cuando se declara no es necesario darle un valor siempre
pero sólo se puede hacer una única vez. Lo habitual es inicializarla en la misma declaración.
PATAS vale 2 para siempre. Es habitual usar static junto con final para que todos los objetos
compartan la misma dirección de memoria de esa propiedad ya que esta no va a cambiar. Es
habitual y de buena praxis escribir las propiedades final en mayúsculas.
14. Herencia
La Herencia es uno de los 4 pilares de la programación orientada a objetos (POO) junto
con la Abstracción, Encapsulación y Polimorfismo. La herencia es un mecanismo que permite la
definición de una clase a partir de la definición de otra ya existente. La herencia permite
compartir automáticamente métodos y datos entre clases, subclases y objetos. Otra forma de
ver la herencia es la de “sacar factor común” al código que escribimos.
113
José A. Navarro Java desde 0. Programación I
Como se puede observar, vemos que en las tres clases tenemos propiedades y métodos
que son iguales:
Lo que podemos ver en este punto es que estamos escribiendo mucho código repetido ya
que las tres clases tienen métodos y propiedades comunes, de ahí que decimos "sacar factor
común" para no escribir código repetido, por tanto lo que haremos será crearnos una clase con
el "código que es común a las tres clases" (a esta clase se le denomina en la herencia como
"Clase Padre o SuperClase") y el código que es especifico de cada clase, lo dejaremos en ella,
siendo denominadas estas clases como "Clases Hijas", las cuales heredan de la clase padre sus
propiedades y métodos.
Como podéis observar ahora queda un código mucho más limpio, estructurado, con
menos líneas de código, lo que lo hace más legible y reutilizable.
114
José A. Navarro Java desde 0. Programación I
En la primera clase, la padre, podemos ver que no hay nada nuevo simplemente tiene la
sintaxis de una clase normal y corriente. Para facilitar el código y centrarnos en lo que nos ocupa
he imprimido por pantalla desde dentro de las clases pero como ya sabéis esto no debe de
hacerse y es una muy mala praxis que va en contra del encapsulamiento y la reutilización. Lo
usamos sólo a modo de laboratorio.
En esta clase hemos puesto las propiedades y métodos que son comunes a todas. Tanto
un Futbolista como un Entrenador o Masajista deben de poder viajar y concentrarse. De todos
ellos queremos saber su id, nombre, apellidos y edad.
115
José A. Navarro Java desde 0. Programación I
Sólo declara las propiedades y métodos que necesita por ser Masajista, las demás
ya las ha declarado el padre.
El constructor recibe todas las propiedades que necesita sólo que unas las tiene
Masajista y otras su padre. Para indicar que las que no son del hijo se deben de
enviar al padre se usa la palabra reservada super y entre paréntesis las
propiedades de las que se encarga el padre. Esto ejecuta el constructor del padre
con esas propiedades. Fijaros como coinciden el número de parámetros y tipo con
el constructor del padre. El super debe de ser la primera línea del constructor.
Las demás clases hacen exactamente lo mismo. Envían al padre lo que es del padre y se
quedan con lo que es suyo.
116
José A. Navarro Java desde 0. Programación I
117
José A. Navarro Java desde 0. Programación I
En el main podemos ver como se crea un objeto de cada hijo. En la línea 10 imprimimos
el nombre del entrenador, en la 11 llamamos a que un jugador se concentre (dicho método no
está declarado en el jugador sino en su padre), en la línea 12 llamamos a entrenar.
¿Cómo encuentra Java los métodos donde corresponde? ¿Cómo podemos hacer que
actúen de forma distinta?
Cuando en el main se llama a un método Java lo busca en la clase que estamos buscando,
si está lo llama y si no lo busca en el padre, abuelo… hasta llegar a Object si entonces no lo
encuentra es cuando da error.
Ejemplo:
En este ejemplo podemos ver como tenemos tres tipos de animales que tienen en común
que son animales y por tanto tienen un nombre, una edad y un tiempo de vida. Cuando en el
main cree un Mamifero y llame a tiempoVida() Java no lo encontrará, por lo que buscará en su
padre Animal, lo encuentra y lo ejecuta.
14.1 Sobreescritura
Imaginemos que las aves tienen un tiempo de vida que se calcula de forma distinta al
resto de animales. Podemos sobreescribir el método en animales con su código:
118
José A. Navarro Java desde 0. Programación I
Hemos añadido un método en Ave. Cuando Java lo llame desde Ave lo encontrará y no
recurrirá al padre.
14.2 Sobrecarga
La sobrecarga es cuando podemos tener más de un método con el mismo nombre,
como vimos en los constructores.
Dependiendo de si le paso un int como parámetro se ejecutará uno u otro. No tienen por
qué estar en la misma clase:
119
José A. Navarro Java desde 0. Programación I
Reglas:
14.3 toString
El toString es un método especial que devuelve una representación como String del
objeto. Se suele usar para mostrar sus propiedades o como queremos representarlo como texto.
Lo veremos en más profundidad en el siguiente capítulo.
No se pueden instanciar.
120
José A. Navarro Java desde 0. Programación I
Por otro lado imaginemos lo siguiente: Todos los hijos deben de declarar un método
nivelCansancio() que dado las horas trabajadas me devuelva un entero que indique su nivel de
cansancio. Las clases abstractas también pueden declarar métodos abstractos, estos métodos
no se solucionan en ella, sino que obligan a los hijos a darle solución. Veamos el ejemplo
descrito:
Como se puede observar la clase se declara como abstract, sólo por eso ya no podemos
crear objetos de esta clase, no es instanciable. Independientemente de ello una clase abstracta
puede declarar métodos como abstractos. La sintaxis de los métodos abstractos sigue las
siguientes reglas:
No tiene cuerpo (llaves): sólo consta de signatura con paréntesis. Entre paréntesis
pueden tener parámetros como un método normal.
121
José A. Navarro Java desde 0. Programación I
Sólo puede existir dentro de una clase abstracta. Si una clase incluye un método
abstracto, forzosamente la clase será una clase abstracta.
Las clases que lo solucionan usan la sintaxis normal de los métodos siendo la
cabecera la misma.
Obviamente todos los métodos que había en este ejemplo siguen estando, no los he puesto por
acortar las imágenes.
14.5 Polimorfismo
En programación orientada a objetos, polimorfismo es la capacidad que tienen los objetos
de una clase en ofrecer respuesta distinta e independiente en función de los parámetros
(diferentes implementaciones) utilizados durante su invocación. Dicho de otro modo, el objeto
como entidad puede contener valores de diferentes tipos durante la ejecución del programa.
Como siempre veamos un ejemplo que se entenderá mejor. Imaginemos que tenemos
productos, por ejemplo trigo y leche. Ambos tienen cosas en común y tienen que solucionar un
método para calcular su precio. En el trigo a ese precio se le suma un tanto por cien, en la leche
dependiendo del tipo una cantidad fija. Veamos el código y luego lo explico.
122
José A. Navarro Java desde 0. Programación I
123
José A. Navarro Java desde 0. Programación I
Producto: Las propiedades de esta clase son las comunes a todos los productos.
Tienen un método abstracto para calcular el precio que deben de solucionar sus
hijas. También cuenta con un toString() para devolver una representación como
texto del objeto que se instancie.
Trigo: Es una clase que hereda de Producto. Añade el tanto por cien que hay que
sumarle al precio. Soluciona el método de calcular el precio y también tiene un
toString. Fijaros como el toString llama al del padre primero para poder mostrar
todos los datos.
Leche: Hereda de Producto, calcula el precio dependiendo del tipo de leche y
tiene un toString.
TestPoli: En esta clase se crean dos objetos, uno de trigo y otro de leche pero el
tipo de objeto es el del padre, Producto. Un padre quiere a todos sus hijos por
igual, en una variable de tipo Producto caben productos de tipo Trigo y Leche. Al
revés no se puede hacer pues perderíamos precisión. Dado que ambos tienen el
toString y calcular precio podemos llamarlos.
Para una única variable no tiene mucha utilidad, pero ¿y si nos piden guardar 50 productos
distintos en un vector? Puedo declarar el vector de tipo Producto e ir guardando productos ya
que todos caben.
124
José A. Navarro Java desde 0. Programación I
125
José A. Navarro Java desde 0. Programación I
¿Qué está sucediendo? Pese a que en la variable hay un producto de tipo Leche el tipo de
la variable es Producto y la clase Producto no tiene ningún método tipoLeche.
14.6 Ejercicios
1. Realiza una clase Minumero que proporcione el doble, triple y cuádruple de un
número proporcionado en su constructor (realiza un método para doble, otro
para triple y otro para cuádruple). Haz que la clase tenga un método main y
comprueba los distintos métodos.
2. Crear una clase que represente una tarjeta de crédito. La clase tendrá el atributo
saldo y tres métodos: pagar, ingresar y verSaldo. Pagar disminuye el saldo en la
cantidad que se le pase, ingresar lo aumenta y verSaldo lo muestra. Si al crear el
objeto no se le pasa nada como parámetro el saldo inicial será 0, sino el pasado
como parámetro. Realizar también una clase que muestre el funcionamiento de
la clase anterior.
126
José A. Navarro Java desde 0. Programación I
3. Crear una clase que implemente una pila de números enteros positivos. El
constructor pedirá el tamaño de la pila. La clase implementara un método put
para añadir un número a la pila, el método get para sacarlo, el método mostrar
para mostrarla y el método size para ver el tamaño actual de la pila. Uusar un
vector para implementar la pila).
4. Crea una clase “punto3d” que extienda la clase Point para trabajar con puntos en
tres dimensiones, implementar el método move, translate y printPoint para
mover el punto, trasladarlo e imprimir las coordenadas en pantalla
respectivamente.(java.awt.Point).
127
José A. Navarro Java desde 0. Programación I
15. Object
En Java cualquier clase que hagamos es una subclase de la clase Object, es como si las
clases se crearan a partir de una “plantilla maestra”. Todos los objetos creados heredan de
Object. De todos los métodos que tiene Object hay dos que son importantes para el fin de este
manual.
15.1 toString()
128
José A. Navarro Java desde 0. Programación I
¿Por qué imprime eso?, muy simple. En el main hemos llamado al toString pero en Pepe
no hay ningún toString por lo que ha ejecutado el por defecto de la clase Object (ya que es su
padre), dado que Object no sabe quién o qué es Pepe nos muestra los datos del Objeto, su
nombre y su código hash. Para que esto no suceda, en nuestras clases debemos de sobreescribir
el método toString() para que muestre los datos como nosotros queramos.
129
José A. Navarro Java desde 0. Programación I
15.2 equals()
El equals nos va a decir si dos objetos son iguales. Veamos un ejemplo:
Tenemos cuatro objetos de tipo Rectangulo (r1, r2, r3 y r4). Como podemos comprobar
del primer if r1 y r2 son distintos, no son el mismo objeto, aunque tengan los mismos valores.
Obviamente el tercer if (22) también son distintos, pues no tienen ni los mismos valores, pero
fijémonos en el segundo (17), los objetos son iguales, de hecho, son el mismo objeto ya que en
130
José A. Navarro Java desde 0. Programación I
la línea 10 hemos hecho r3=r1 y esto no hace una copia del objeto, sino que hace que r3 apunte
a la misma dirección de memoria donde se encuentra r1. Si cambio r3, cambio r1.
Con esto podemos ver que el equals se está comportando como un ==, entonces ¿Cómo
puedo hacer para que compare rectángulos por sus propiedades? Dos rectángulos son iguales
si sus propiedades lo son. Bien, pues aquí entra lo visto con el toString, sobreescribimos el
método equals en la clase Rectangulo añadiendo el siguiente método:
En la línea 14 aparece una cosa “extraña” que antes no habíamos visto pero que
suele añadirse a todos los métodos sobrescritos. El @Override indica que es un
método sobrescrito que ya existe en una clase superior, esto a parte de ayudarnos
a identificarlos enseguida hace que los IDE puedan generar documentación de
forma automática de nuestro código.
La siguiente línea tiene la cabecera del método donde se define que va a devolver
un booleano y que recibe un Object. Esto se hace para hacerla lo más general
posible.
De esta forma nosotros decidimos cuando dos objetos son iguales, si por una propiedad,
por varias, …
131
José A. Navarro Java desde 0. Programación I
Para cualquier referencia no nula del valor x, x.equals(null), debe regresar false.
La descripción correcta del método equals, es decir, la forma en cómo debe sobrescribirse
es la siguiente (podéis comprobarlo en la API):
Algunas colecciones usan el valor hashcode para ordenar y localizar a los objetos que
están contenidos dentro de ellas. El hashcode es un numero entero, sin signo, que sirve en
colecciones de tipo Hash* para un mejor funcionamiento en cuanto a rendimiento. Este método
debe ser sobrescrito en todas las clases que sobrescriban el método equals, si no se quiere tener
un comportamiento extraño al utilizar las colecciones de tipo Hash* y otras clases. Si dos objetos
son iguales según el método equals sobrescrito, estos deberían regresar el mismo hashcode.
Nosotros no vamos a reescribirlo ya que en los próximos manuales usaremos otros IDE
que los generan automáticamente.
132
José A. Navarro Java desde 0. Programación I
133
José A. Navarro Java desde 0. Programación I
Memoria
Memoria
pedro apunta a la misma dirección que pepe, por lo que son lo mismo. Si pepe cambia lo
hace pedro y viceversa. ¿Qué pasa con los datos de pedro?, cuando pasa el garbage collector se
eliminan.
Fijaros como en la línea 13 pedro pasa a ser pepe y sus datos son los mismos. Cuando le
cambio la edad a pedro en la línea 17, también se la cambio a pepe.
134
José A. Navarro Java desde 0. Programación I
Como podemos ver pepe y pedro tienen los mismos datos, pero no son lo mismo. Al
cambiar la edad de pedro no cambia la de pepe:
135
José A. Navarro Java desde 0. Programación I
15.5 Wrappers
Un wrapper es una clase que representa a un tipo primitivo. A diferencia del uso de tipo
primitivo son objetos por lo que se comportan como tal. Entre las ventajas de su uso se
encuentra la facilidad de conversión entre tipos primitivos (suelen tener métodos static). Entre
las desventajas, usan más memoria y hay que ir con cuidado con el paso de parámetros, siempre
se pasan por referencia. (ver tipos de paso por parámetros). Los wrappers se encuentran en el
paquete java.lang, por lo que no es necesario usar import.
Un uso de este tipo de clases podría ser eliminar la limitación de los vectores que dice que
solo pueden ser de un solo tipo. Con esto y el polimorfismo visto anteriormente los vectores
pueden ser Object pero contener cualquier tipo de dato.
136
José A. Navarro Java desde 0. Programación I
16. Interfaces
Una interfaz es una especie de plantilla para la construcción de clases. Normalmente una
interfaz se compone de un conjunto de métodos abstractos no pudiendo tener propiedades
instánciales.
Todos los métodos de una interfaz se declaran implícitamente como abstractos y públicos.
Una clase puede implementar varias interfaces, pero sólo puede tener una clase
ascendiente directa.
Una clase abstracta pertenece a una jerarquía de clases mientras que una interfaz
no pertenece a una jerarquía de clases. En consecuencia, clases sin relación de
herencia pueden implementar la misma interfaz.
Una interfaz declarada como public debe ser definida en un archivo con el mismo nombre
de la interfaz y con extensión .java. Las cabeceras de los métodos declarados en el cuerpo de la
interfaz se separan entre sí por caracteres de punto y coma y todos son declarados
implícitamente como public y abstract. Por su parte, todas las constantes incluidas en una
interfaz se declaran implícitamente como constantes públicas y es necesario inicializarlas en la
misma sentencia de declaración.
137
José A. Navarro Java desde 0. Programación I
Otro ejemplo: pueden construirse dos interfaces: Constantes y Variaciones, y una clase,
Factura, que las implementa:
Si una interfaz implementa otra, incluye todas sus constantes y declaraciones de métodos,
aunque puede redefinir tanto constantes como métodos.
138
José A. Navarro Java desde 0. Programación I
Fijaros como en las líneas 5, 6 y 7 se crean las clases que saben cómo imprimir, mostrar
por pantalla y conectar con la BBDD. Luego se pasan como parámetro al mismo método que las
puede aceptar ya que todas implementan la misma interface.
139
José A. Navarro Java desde 0. Programación I
16.5.1 Default
Si hasta ahora en una interfaz solo podíamos tener constantes y métodos abstractos
ahora tendremos la posibilidad de declarar métodos con un comportamiento por defecto en
una interfaz. Antes de Java 8 podíamos definir que toda clase que implementa a una interfaz
debe de dar cuerpo a los distintos métodos que contenga la interfaz. En cambio, en Java 8, toda
clase que implemente una interfaz debe declarar los distintos métodos que contenga la interfaz
salvo aquellos que estén definidos como métodos por defecto. Estos métodos se caracterizan
porque son métodos que están declarados en la propia interfaz y pueden ser utilizados
directamente en la clase si nos interesa su comportamiento por defecto.
140
José A. Navarro Java desde 0. Programación I
Parámetros
o Cuando hay un único parámetro no es necesario usar paréntesis
Cuerpo lambda
o Si está formado por una única línea no son necesarias las llaves ni el
operador return, si necesita devolver algo.
141
José A. Navarro Java desde 0. Programación I
Ejemplos
Ej2. Un parámetro
142
José A. Navarro Java desde 0. Programación I
143
José A. Navarro Java desde 0. Programación I
existente que comparemos con el objeto de entrada, que va ser del tipo especificado en la
implementación, lo sobrescribimos para cada caso.
if(Obj1.compareTo(Obj2)>0)
…
La clase Obj1 es la que llama a compareTo. Esa clase sobreescribe el método devolviendo
un número positivo, negativo o 0 (no os compliquéis la vida: 1, -1 o 0).
Si usáis un compareTo de alguna clase de la API veréis que devuelve un número a veces
grande, el número no importa sólo si es positivo, negativo o 0.
¡Ojo, no funciona como equals! Si cambiamos el orden hay que cambiar la condición
144
José A. Navarro Java desde 0. Programación I
16.6.5 Ejercicio
Realizar un programa que cree un vector de 10 manzanas. Las manzanas tienen
un color, variedad y peso. El color puede ser “verde”, “rojo” o “amarillo”. Las
manzanas se introducirán una a una, mezclando colores, pesos y variedades, en
el vector. Una vez creado el vector mostrar las propiedades de cada manzana por
pantalla. Ordenar el vector usando el método de la burbuja y luego volver a
mostrar por pantalla la información. Para ordenar el vector se tendrá en cuenta
que primero van las manzanas verdes de menor a mayor peso, luego las rojas de
menor a mayor peso y al final las amarillas de menor a mayor peso.
11
Estructuras con más de un objeto. Vectores.
145
José A. Navarro Java desde 0. Programación I
Veamos un ejemplo de los métodos más usados. Podéis consultarlos todos en la API de
Java.
Constructores:
o String cadena1=”Hola”;
o String cadena2= new String(“Hola”);
o String cadena3=new String(cadena2);
int length()
Muestra 4
String concat(String s)
String toString()
String trim()
Devuelve una cadena eliminando los espacios por delante y por detrás
String cadena=” hola como estás “;
System.out.println(cadena.trim());
146
José A. Navarro Java desde 0. Programación I
char charAt(i)
int indexOf(String s)
String valueOf(int n)
int compareTo(String s)
Este es un método que se usa en muchos tipos de objetos (ya veremos cómo). Sirve para
comparar dos objetos, en nuestro caso String’s, devuelve:
o Un número >0 sie el String llamante es mayor que el pasado por parámetro.
o 0 Si son iguales.
Para saber si es mayor o menor el método compara los String carácter a carácter de
izquierda a derecha según el alfabeto. Por ejemplo: la a es menor que la d.
String cadena1=”casa”;
String cadena2=”casi”;
System.out.println(cadena1.compareTo(cadena2));
147
José A. Navarro Java desde 0. Programación I
boolean equals(String s)
Como ya hemos visto con anterioridad, este método sirve para comprobar si dos objetos
son iguales, en este caso dos String. En caso de ser iguales el llamante que el parámetro
devuelve true, si no false.
String cadena1=”casa”;
String cadena2=”casi”;
System.out.println(cadena1.equals(cadena2));
Devuelve false.
Si introducimos por teclado la palabra “casa”, la salida de este código será: true false
Esto es debido a que el operador == está comparando le referencia de los objetos,
no su contenido. Hay una excepción, que no voy a mencionar para no liaros. Como
regla los String SIEMPRE se comparan con equals()
148
José A. Navarro Java desde 0. Programación I
Como podéis observar todas son static. Además, también se declaran dos constantes: PI y E.
149
José A. Navarro Java desde 0. Programación I
150
José A. Navarro Java desde 0. Programación I
La declaración <E> nos indica que es una clase genérica o parametrizada, este tipo de
clases permiten realizar operaciones sea cual sea el tipo que reciban. En este caso la E significa
elemento de una colección.
151
José A. Navarro Java desde 0. Programación I
Donde tipo es la clase a la cual pertenecen los objetos que se van a guardar. Termina con
() ya que estamos llamando al constructor por defecto.
Dado que no es un vector no podemos usar [], debemos de usar el método add para añadir
objetos. Los ArrayList, al igual que los vectores, comienzan por el índice 0.
Pero, ¿Por qué usar este constructor si el ArrayList puede crecer dinámicamente? Muy
simple. Cuando se crea un ArrayList sin especificar el tamaño, este se crea de forma
predeterminada para diez elementos, cuando insertamos uno más, internamente, Java lo que
152
José A. Navarro Java desde 0. Programación I
hace es realizar una copia del ArrayList en otro de tamaño once y añadir el siguiente elemento
y así sucesivamente, pero esto tiene un coste. Si desde el principio le indicamos el tamaño que
creemos más acertado para el uso que le vamos a dar, el coste es menor.
También podemos insertar elementos en una posición dada sin borrar el que hay en ella
y eliminar el de una posición dada, en ambos casos el ArrayList se redimensiona sin perder la
información.
153
José A. Navarro Java desde 0. Programación I
Este for recorre toda la colección (ArrayList), define una variable que va a tomar el valor
de todos los elementos de la colección:
154
José A. Navarro Java desde 0. Programación I
Se utiliza cuando:
Una clase necesita acceder al contenido de una colección sin llegar a ser
dependiente de la clase que es utilizada para implementar la colección, es decir
sin tener que exponer su representación interna.
La clase ArrayList tiene un método iterator() que me devuelve un iterador sobre dicha
clase y que tiene una serie de métodos:
155
José A. Navarro Java desde 0. Programación I
Ejemplo de uso:
Veamos un ejemplo en el que tenemos una serie de personas que tienen una edad y
queremos mostrar aquellas que están jubiladas:
156
José A. Navarro Java desde 0. Programación I
Dado que un ArrayList no permite el uso de tipos primitivos, debemos de usar sus
correspondientes clases o wrappers:
157
José A. Navarro Java desde 0. Programación I
Como vimos en su momento, se puede generar una excepción si el usuario escribe algo
que no es un numero cuando Java espera un número:
Las excepciones hay que tratarlas para que el programa no termine bruscamente y pueda
continuar. Java tiene la siguiente jerarquía en cuanto a las clases que tratan las excepciones:
Java nos permite hacer un control de las excepciones para que nuestro programa no se
pare inesperadamente, aunque se produzca una excepción. Para ello tenemos la estructura "try
- catch - finally”:
try{
<instrucciones que hay que controlar>
}catch (typeException e){
<instrucciones a ejecutar cuando se produce la excepción
} finally{
<instrucciones que se ejecutan tanto si hay excepción como si no>
}
Un try puede tener más de un catch para hacer una cosa u otra dependiendo del tipo de
excepción. La cláusula finally es optativa.
158
José A. Navarro Java desde 0. Programación I
Cuando en Java se produce una excepción se crea un objeto de una determina clase
(dependiendo del tipo de error que se haya producido), que mantendrá la información sobre el
error producido y nos proporcionará los métodos necesarios para obtener dicha información.
Veamos un ejemplo:
Podemos usar los métodos del objeto de la excepción para obtener información:
159
José A. Navarro Java desde 0. Programación I
Capturar una excepción es más costoso que evitarla. En este ejemplo, al igual que en
todos los de este manual, las excepciones se pueden evitar. Basta comprobar la y con un if antes
de hacer la división. Obviamente hay muchas veces que son inevitables, pero aquellas que son
fácilmente evitables hagámoslo. Hay gente que programa “orientado a excepciones”, en todo
usa excepciones, personalmente no me parece la mejor forma.
Obviamente del tema de excepciones me dejo muchas cosas (que Java las ignore,
personalización de excepciones, …), eso lo dejo para futuros manuales de mayor dificultad.
160
José A. Navarro Java desde 0. Programación I
1. Propiedad conmutativa: A + B = B + A y A · B = B · A
Las condiciones vistas en el if, while y do cumplen estas propiedades, por tanto podemos
afirmar los siguientes teoremas:
A||!A&&B = A||B
A&&(!A||B)=A&&B
161
José A. Navarro Java desde 0. Programación I
Teorema 8 (asociatividad): cada uno de los operadores binarios (+) y (·) cumple la
propiedad asociativa:
Y quizá lo más importante para nosotros, porque nos permiten transformar condiciones
en otras sin variar el resultado: las leyes de Demorgan:
162
José A. Navarro Java desde 0. Programación I
22. Bibliografía
https://www.discoduroderoer.es
http://puntocomnoesunlenguaje.blogspot.com
https://ingenieriadesoftware.es/
163
José A. Navarro Java desde 0. Programación I
23. Ejercicios
Considera el sistema que gestiona los préstamos y devoluciones de libros de una
biblioteca. Cuando un usuario quiere tomar prestado un libro y no existe ningún
ejemplar disponible en ese momento, el sistema permite realizar una reserva de ese
libro. A medida que los libros solicitados vuelvan a estar disponibles, el sistema irá
atendiendo las reservas según el orden en que se realizaron. (Solo hay que hacer el
módulo de reservas)
Para ello, el sistema dispone de la clase Reserva, en la que se definen los siguientes
atributos y métodos:
Atributos:
private Usuario usr, que almacena el usuario que realiza la reserva.
private int idLibro, que almacena un identificador numérico del libro reservado.
Métodos:
public Reserva(Usuario usr, int unIdLibro),Realiza la reserva de un libro para un usuario
La clase Usuario es la siguiente. Hay que terminarla. Los usuarios se tienen que poder
ordenar por edad. (No hay que implementar setter’s ni getter’s)
private String dni; //se da por supuesto que es único para cada usuario
private String nombre;
private int edad;
...
Queremos implementar una clase ReservasBiblioteca para gestionar las reservas de libros
en la biblioteca. De momento, disponemos de la siguiente definición parcial:
164
José A. Navarro Java desde 0. Programación I
public ReservasBiblioteca() {
// para 10 reservas
Para añadir la reserva, primero debes comprobar si el vector está lleno, en cuyo
caso debes duplicar su longitud. Después, debes añadir la reserva en la primera posición libre
del vector.
String servirLibro(int idLibro)
Para eliminar una reserva del vector, todas las reservas posteriores a la misma deben
desplazarse una posición a la izquierda en el mismo vector, de modo que se respete su orden de
llegada.
String usuarioMasReservas()
Elimina todas las reservas que existan para el usuario dado y devuelve la cantidad de
reservas anuladas. Si no hay ninguna reserva para ese usuario, el método debe devolver
cero. Al igual que en el método servirLibro, los desplazamientos necesarios se realizarán
165
José A. Navarro Java desde 0. Programación I
sobre el propio vector (es decir, sin crear vectores auxiliares de reservas).Ejemplo:
https://www.discoduroderoer.es/ejercicios-propuestos-y-resueltos-basicos-java/
http://puntocomnoesunlenguaje.blogspot.com/p/ejercicios.html
166