Manual JavaI
Manual JavaI
UNIDADES DIDÁCTICAS:
1. Introducción
interfaz, clase
herencia y polimorfismo.
MÓDULO A
Introducción
Tema 1.1
Índice de la unidad:
1. Historia
1. Historia
Todos los objetos del mismo tipo pueden recibir los mismos
mensajes.
1
MÓDULO 1
No hay que olvidar, que la Orientación a Objetos aplica también al Análisis y Diseño
de las soluciones. El método más utilizado a día de hoy es el UML (siglas de Unified
Modeling Language) sucesor de los métodos de Análisis y Diseño Orientado a
Objetos de finales de los 80 y comienzo de los 90, tales como: Booch, Rumbaugh
(OMT) y Jacobson.
2
Unidad 1.1 Introducción
Facilita la reutilización
3
MÓDULO 1
El sistema de abstracción del mundo real, permite centrarnos por una parte
en cuales son las entidades del dominio, qué información de toda la posible es
la que ayuda a solventar nuestro problema, que tipo de acciones u
operaciones son relevantes en estas entidades, etc. para una vez que
tengamos toda esta información, ver las interrelaciones entre todos ellos y su
convivencia.
4
Unidad 1.1 Introducción
5
MÓDULO 1
6
Unidad 1.1 Introducción
Es una diferencia a tener en cuenta, con respecto a C++ que sí que necesita
saber en que topología se va a ejecutar.
7
MÓDULO 1
Tema 1.2
Índice de la unidad:
1. Conceptos básicos
2. Objeto
3. Clase
Unidad 1.2 Conceptos básicos
En esta unidad veremos cuales son los conceptos básicos en los que se apoya la
Orientación a Objetos, tanto a nivel de Análisis y Diseño, como en la Programación.
1. Conceptos básicos
Objeto
Atributo
Método
Interfaz
Clase
2. Objeto
Hay muchas definiciones que pueden darse de un objeto, entre las cuales se en-
cuentran:
11
MÓDULO 1
12
Unidad 1.2 Conceptos básicos
13
MÓDULO 1
14
Unidad 1.2 Conceptos básicos
Cuando se habla del aspecto de los objetos, no nos estamos refiriendo a los
conceptos de buen o mal aspecto visual. Nos referimos a como el objeto se ve
internamente o aspecto interno y como ven al objeto desde otros objetos
también llamado aspecto exterior.
15
MÓDULO 1
Es posible que exista algún método que solo pertenezca al aspecto interno pe-
ro no pertenezca al interfaz. En este caso, estos métodos no pueden ser lla-
mados desde otros objetos, sino que solamente pueden ser llamados desde
métodos del propio objeto.
Ejemplo: Para el objeto unReloj, el interfaz estaría formado por los métodos
getHora, getDia, incrementarHora e incrementarDia. Los métodos limpiarPan-
talla y traducirFrecuencia solamente pertenecen (conjuntamente con los que
forman el interfaz) al aspecto interno. Así el método limpiarPantalla, es llamado
por getHora y getDia antes de mostrar la información pedida en el método
16
Unidad 1.2 Conceptos básicos
3. Clase
Hasta ahora hemos visto que define a un objeto. Una de las definiciones más senci-
llas es algo del mundo real, tangible o visible.
Hemos visto que los objetos están formados por atributos y métodos. La definición
de estructura y comportamiento de un objeto es a lo que se denomina clase. Es por
tanto un patrón para la definición de atributos y métodos para un tipo particular de
objetos.
Todos los objetos de una clase dada son idénticos en estructura y comportamiento
pero son únicos (aunque tengan los mismos valores en sus atributos).
Instancia es el término utilizado para referirse a un objeto que pertenece a una cla-
se concreta.
Una clase, por tanto es solamente la definición. Mientras que un objeto o instancia
es algo real con la estructura y comportamiento de la clase a la que pertenece.
La estructura de una clase, por tanto, viene determinada por un nombre, los atribu-
tos que contiene y los métodos que realiza.
17
MÓDULO 1
Frecuencia
Todos los objetos de una clase dada son idénticos en estructura y comporta-
miento, pero tienen identidad única.
18
Unidad 1.2 Conceptos básicos
Así para la clase Reloj descrita anteriormente, tendremos los objetos unReloj
(dia=”01-03-2010”, hora=”13:01:03”, modelo=”Rolex”, numSerie=”123456”)
y otroReloj (dia=”01-03-2010”, hora=”13:01:03”, modelo=”Swatch”, numSe-
rie=”Sab748”).
Pero si nos paramos a pensar, ¿qué surge antes? ¿La clase y por lo tanto
creamos los objetos del mundo real? O partiendo de los objetos del mundo re-
al ¿podemos definir su estructura y comportamiento?.
19
MÓDULO 1
20
Título de unidad didáctica
Paradigmas de la OO
Tema 1.3
Índice de la unidad:
2. Abstracción
3. Encapsulación y ocultamiento
4. Relaciones
5. Polimorfismo
Unidad 1.3 Paradigmas de la Orientación a Objetos
En esta unidad veremos cuales son los paradigmas en los que se apoya la Orienta-
ción a Objetos, tanto a nivel de Análisis y Diseño, como en la Programación.
Esta disciplina y por tanto cualquier lenguaje de Orientación a Objetos que perte-
nezca a ella, debe de cumplir con los siguientes paradigmas (aunque cada lenguaje
tenga sus propias peculiaridades al respecto):
Abstracción
Encapsulación y Ocultamiento
Herencia
Polimorfismo
2. Abstracción
25
MÓDULO 1
3. Encapsulación y Ocultamiento
Se tratan los dos paradigmas de forma conjunta, puesto que se utilizan normal-
mente de forma simultánea.
Encapsular, significa reunir a todos los elementos que pueden considerarse perte-
necientes a una misma entidad, al mismo nivel de abstracción.
26
Unidad 1.3 Paradigmas de la Orientación a Objetos
que es inaccesible para los demás. Permite tratar a un objeto como una caja ne-
gra, la cual solo es tratada por el resto de objetos por su el interfaz.
4. Relaciones
Las clases no existen de forma aislada sino que muchas veces tienen dependencias
entre ellas. Estas dependencias es a lo que se llama relación y existen distintos ti-
pos o grados, que se enumeran a continuación:
27
MÓDULO 1
Indica que los objetos de una clase contienen o están formados por objetos de
otras clases, aunque no siempre precisa una contención física, sino al menos
lógica.
28
Unidad 1.3 Paradigmas de la Orientación a Objetos
Por tanto, un objeto que representa el ‘todo’, está asociado con un conjunto
de objetos que representan sus componentes.
Un objeto no puede existir si no existen los objetos de los que está compues-
to.
29
MÓDULO 1
Las clases se disponen en una jerarquía, donde una clase hereda los atributos
y operaciones de las clases superiores en la jerarquía.
Una clase puede tener sus propios atributos y operaciones adicionales a los
heredados y puede modificar los atributos y operaciones heredadas si necesita
cambiar su implementación.
30
Unidad 1.3 Paradigmas de la Orientación a Objetos
El objeto llamante requiere el conocimiento previo del interfaz del objeto re-
ceptor, porque sino no tiene manera de saber que peticiones tiene disponibles
y los formatos del mensaje a enviar.
31
MÓDULO 1
5. Polimorfismo
En el polimorfismo, una vez creados los objetos, se abstraen a la clase padre que
proporciona el interfaz, para que el objeto llamante generalice su envío de mensaje
independientemente del tipo de objeto específico o clase hija; solamente debe de
ser consciente del interfaz del mismo, mediante la clase padre. Es en ejecución,
cuando dependiendo realmente del tipo de objeto real, se ejecutará la implementa-
ción concreta de cada objeto.
32
Unidad 1.3 Paradigmas de la Orientación a Objetos
Existe una clase Flor que contiene Pétalos: Relación de composición. Aunque
en el mundo real existen flores sin pétalos (sería una relación de agrega-
ción) en el ámbito de nuestro problema, solo contemplamos flores con ellos.
Las clases Rosa y Margarita tienen son Flores, por lo que tienen una rela-
ción de herencia con Flor.
33
MÓDULO 1
Como solución también válida, se podría tener una relación de herencia con
Rosa, las clases RosaAmarilla y RosaRoja, pero de esta manera, teniendo un
atributo color permite una mejor reutilización en el caso de que pueda apa-
recer otra rosa de otro color.
A su vez, como tipos de Plaga que pueden asolar a nuestras Flores son los
Pulgones , por lo que tiene una relación de herencia entre Plaga y Pulgon y
una relación de asociación entre Plaga y Flor. La Flor conoce a la Plaga pero
no a la inversa.
Como los Pajaros se comen a las plagas, tienen relación de asociación con
ellas, con cualquier tipo, ya sea un Pulgon o en un futuro una ArañaRoja.
34
Unidad 1.3 Paradigmas de la Orientación a Objetos
35
MÓDULO B
UNIDADES DIDÁCTICAS:
2. Entorno de desarrollo
Tema 2.1
Índice de la unidad:
1. Introducción
3. La plataforma Java
Unidad 2.1 Introducción a Java. Características del lenguaje
En esta unidad veremos el origen del lenguaje de programación Java y cuales son
sus principales características.
1. Introducción
Fue creado por Sun Microsystems en el año 1991 e inicialmente se denómino OAK y
se desarrolló principalmente orientándolo a la programación de microsistemas y
componentes electrónicos.
Tiene una sintaxis muy similar a la de C++, pero tiene un modelo de objetos mas
simple y elimina elementos de bajo nivel que suelen inducir a muchos errores, co-
mo pueden ser la manipulación directa de punteros o memoria.
Entre noviembre de 2006 y mayo de 2007, Sun Microsystems cedió la mayor parte
de sus tecnologías Java a GNU GPL, de tal forma que prácticamente todo el Java de
Sun es ahora Software libre.
La idea inicial del lenguaje se basó en el paradigma de Write Once, Run Anywhere
(Escribe una vez, ejecuta en cualquier lugar), proporcionando un lenguaje indepen-
diente de la plataforma en la que se ejecute.
Java ha sufrido numerosos cambios desde la versión inicial, JDK (Java Depelopment
Kit o entorno de desarrollo) 1.0, así como un aumento increíble en el número de
clases y paquetes que componen la biblioteca estándar. Esta biblioteca estándar se
ha visto ampliada por numerosas bibliotecas de carácter específico, como pueden
ser las bibliotecas visuales, comunicaciones, etc.
43
MÓDULO 2
Sencillo
Distribuido
Interpretado
Robusto
Seguro
Altas prestaciones
Multithread
Dinámico
2.1 Sencillo
44
Unidad 2.1 Introducción a Java. Características del lenguaje
No soporta destructores.
Posee una clase String, en vez del array de tipo char[] finali-
zado con nulo.
2.2 Distribuido
Cuenta con una amplia biblioteca de clases para comunicarse mediante los
protocolos de comunicaciones TCP/IP: HTTP, FTP… abriendo sockets, estable-
ciendo y aceptando conexiones con servidores o clientes remotos.
2.3 Interpretado
Para que un programa Java puede ejecutarse, tiene que ser compilado pre-
viamente mediante un compilador. Es la principal diferencia con el resto de
lenguajes interpretados. Necesita ser válidado y compilado en un paso previo
al de su ejecución.
45
MÓDULO 2
46
Unidad 2.1 Introducción a Java. Características del lenguaje
2.4 Robusto
2.5 Seguro
Por su naturaleza distribuida, donde por ejemplo, los applets se bajan desde
cualquier punto de la red y se ejecutan en local, el tema de la seguridad es
muy crítico. A nadie le gustaría ejecutar en su propio ordenador programas
que tuvieran total acceso a su sistema, donde por ejemplo, pudieran coger in-
formación confidencial, tales como passwords o cuentas bancarias o incluso
poder formatear el ordenador personal.
Todos los navegadores poseen una ‘sand box’ o entorno de ejecución contro-
lado donde no se permite realizar ninguna ejecución fuera de ella (como pue-
de ser acceso al sistema de ficheros) a menos que se indiquen explícitamente
excepciones por parte del usuario que lo ejecuta.
47
MÓDULO 2
48
Unidad 2.1 Introducción a Java. Características del lenguaje
2.8 Multithread
Para poder realizar esta ejecución simultanea de varias tareas, Java posee
una serie de clases que facilitan su utilización.
2.9 Dinámico
Para conseguir esto, Java emplea un método de interfaces para evitar estas
dependencias y recompilaciones.
49
MÓDULO 2
clases vía programática, una clase denominada X, y una vez encontrada que
la ejecute. Este acceso se puede realizar tanto a nivel de clase, como a nivel
de método y atributo.
3. La plataforma Java
La plataforma Java es una plataforma solo software que se ejecuta sobre otra pla-
taforma hardware/software.
50
Unidad 2.1 Introducción a Java. Características del lenguaje
51
MÓDULO 2 PROGRAMACIÓN JAVA
- Java ME
- Java SE
- Java EE
MÓDULO B
Entorno de desarrollo
Tema 2.2
Índice de la unidad:
Sun, que tiene una JDK para las siguientes plataformas: Win-
dows en sus distintas versiones, Linux y Solaris (Sun). Descargable
de forma gratuita de la siguiente URL
http://java.sun.com/javase/downloads
IBM, que tiene una JDK para las siguientes plataformas: Win-
dows en sus distintas versiones, Linux, AIX, OS/2, OS/400 y z/OS.
Apple, que tiene una JDK para las siguientes plataformas: Ma-
cintosh .
1. 1 Historia
La primera versión del JDK fué el JDK 1.0.0 que se retiró de circulación con la
aparición del JDK 1.1.0
El nombre ha ido cambiando entre JDK (Java Development Kit) y SDK (Soft-
ware Development Kit), quedando de nuevo JDK como nombre actual. Tam-
bién ha ido cambiando el sistema de numeración, cambiando a 5.0 en lugar de
1.5.
55
MÓDULO 2
Cada una de estas plataformas, contienen tanto una JDK (o entorno de desa-
rrollo y ejecución) como un JRE (o Java Runtime Environment, solamente uti-
lizado en ejecución), también llamado JVM. En este curso, solamente nos cen-
traremos en el JDK del Java SE.
56
Unidad 2.2 Entorno de Desarrollo
Colecciones (Collections)
JavaSound API
57
MÓDULO 2
Logging API
58
Unidad 2.2 Entorno de Desarrollo
59
MÓDULO 2
Ver la Unidad Instalación del JDK y Eclipse para los detalles de la instalación.
Hay dos variables de entorno de gran relevancia para el JDK, PATH y CLASSPATH:
2.1 Contenido
60
Unidad 2.2 Entorno de Desarrollo
2.2 Componentes
javap.exe: Desensamblador.
En el capítulo anterior, hemos estado viendo el JDK no visual. Pero existen herra-
mientas gráficas que simplifican el desarrollo, compilación y ejecución de los pro-
61
MÓDULO 2
http://developers.sun.com/jscreator
JBuilder: Es de Borland
http://www.codegear.com/products/jbuilder
62
Unidad 2.2 Entorno de Desarrollo
y javac.exe
63
MÓDULO 2
En el caso de que no esté puesta la variable de entorno PATH, abrir una sesión DOS
y ajustar la variable PATH para que el Sistema Operativo sepa encontrar las herra-
mientas del JDK. Para respetar el valor que ya tuviese la variable PATH le añadimos
%PATH%.
Ajustar la variable CLASSPATH para que las herramientas del JDK sepan encontrar
nuestras clases Java. Tenemos dos opciones, o añadir el . (punto) y siempre
ejecutar las herramientas en el directorio donde se encuentre el código, o añadir el
directorio de trabajo y ejecutar las herramientas donde queramos. Para respetar el
valor que ya tuviese la variable CLASSPATH le añadimos %CLASSPATH%.
64
Unidad 2.2 Entorno de Desarrollo
Ahora arrancamos un editor de texto (por ejemplo Notepad) para escribir el código
fuente de nuestro programa que guardaremos en el fichero Practica1.java; el
nombre del fichero debe ser exactamente igual (incluyendo mayúsculas y
minúsculas) al de la clase Java que vamos a desarrollar.
65
MÓDULO 2
66
Unidad 2.2 Entorno de Desarrollo
Si no sale ningún mensaje significa que todo ha ido bien y que ha creado el
bytecode, es decir, Practica1.class
Por último, ejecutamos el programa Java con la JVM “java”. A la JVM hay que darle
el nombre del fichero del bytecode sin la extensión.
67
MÓDULO 2
68
Unidad 2.2 Entorno de Desarrollo
69
MÓDULO 2
70
Unidad 2.2 Entorno de Desarrollo
Crear una clase Java nueva llamada Practica2 con el método main.
71
MÓDULO 2
Seleccionar Finish
Escribir el código dentro del método main y salvar con Ctrl + S o File -> Save
72
Unidad 2.2 Entorno de Desarrollo
Seleccionando la clase Java, con el botón derecho del ratón ejecutarla como Java
Application
73
MÓDULO 2
74
Título de unidad didáctica
En este unidad hemos visto la historia del JDK desde su comienzo hasta el mo-
mento actual, viendo las distintas posiblidades de desarrollo, vía el JDK directa-
mente (entorno no gráfico) o vía los entornos gráficos o IDEs, tales como Eclipse,
Rational Application Development ...
Sintáxis
Tema 2.3
Índice de la unidad:
1. Comentarios
3. Identificadores
4. Variables
5. Tipos de datos
7.
Unidad 2.3 Sintaxis
1. Comentarios
Los comentarios son líneas de código que no son ejecutadas en tiempo de ejecu-
ción, ni siquiera son incluidas en el byte code compilado. Estos comentarios, permi-
ten incluir explicaciones acerca de qué es lo que está haciendo nuestro código, do-
cumentación, inhabilitar líneas de código que ya no son necesarias en runtime, etc.
79
MÓDULO 2
Uno de los caracteres más importantes a tener en cuenta en Java es el punto y co-
ma o ;.
El punto y coma define una sentencia Java o lo que es lo mismo una línea simple de
código terminada en un punto y coma. La línea simple de código puede o no estar
físicamente formada en una línea física.
80
Unidad 2.3 Sintaxis
Suelen utilizarse conjuntamente con las sentencias de control de flujo (ver punto
8), pero también pueden utilizarse, por ejemplo, para minimizar el ámbito de cier-
tas variables, como son las variables de bloque (ver punto 4.2).
Java permite los espacios en blanco entre elementos de código fuente. Son utiliza-
dos principalmente para separar cada uno de los elementos de la sintaxis Java (al
menos un espacio en blanco como mínimo) y mejorar el entendimiento del código
(el número de espacios utilizado para este propósito es irrelevante).
81
MÓDULO 2
3. Identificadores
Son los nombres unívocos que se le dan a las clases, métodos y variables. Hay que
tener presente las siguientes reglas:
82
Unidad 2.3 Sintaxis
4. Variables
Toda variable debe llevar asociado un tipo que describe el tipo de dato (ver punto
5) que guarda. Por tanto, una variable tiene:
Un tipo
Un identificador
Un dato o valor.
4. 1 Declaración de variables
83
MÓDULO 2
84
Unidad 2.3 Sintaxis
85
MÓDULO 2
86
Unidad 2.3 Sintaxis
5. Tipos de datos.
La ‘keyword’ utilizada para definir un tipo de dato lógico es boolean. Sus posibles
valores son:
true: o verdadero
Se suelen utilizar en las sentencias de control de flujo del tipo bifurcaciones del
tipo if-then-else (ver punto 8).
87
MÓDULO 2
Para las cadenas de caracteres existe un tipo complejo: la clase String que se
verá en más detalle en la Unidad 2.6 Clases básicas.
Las ‘keyword’ utilizadas para definir un tipo de dato entero son byte, short, int y
long. Sus tamaños son:
88
Unidad 2.3 Sintaxis
Las ‘keyword’ utilizadas para definir un tipo de dato real son float y double. Sus
tamaños son:
89
MÓDULO 2
Se trata de un tipo de dato complejo algo especial que surge con la versión 5.0
de Java. Implementa una clase que tiene un atributo que puede tomar varios va-
lores y solo esos.
Se suelen utilizar para tener una lista de posibles valores asociados a una varia-
ble y solamente dichos valores.
El siguiente ejemplo muestra el valor de variables de distintos tipos con sus va-
lores por defecto.
90
Unidad 2.3 Sintaxis
El siguiente ejemplo muestra el valor de variables de distintos tipos con sus va-
lores asignados en la declaración
91
MÓDULO 2
Un tipo de dato númerico puede llegar a convertirse a otro tipo. Existen cuatro
entornos de conversión en Java:
El downcasting (de un tipo más grande convertirlo a uno más pequeño) se reali-
zan explícitamente (hay que indicar a que tipo se quiere convertir) y se resuelve
en tiempo de ejecución. Nota: puede perderse información, por lo que se obliga
a que sean realizados explícitamente.
te:
Una variable de tipo complejo contiene una referencia (puntero) a la zona de me-
moria donde está el objeto:
92
Unidad 2.3 Sintaxis
7. Operadores
Los operadores realizan funciones sobre uno, dos o tres operandos (op). Por tanto,
una primera clasificación puede ser esta:
Operadores ternarios: op ? op : op
Los operadores siempre devuelven un valor que depende del operador y del tipo
de los operandos.
Aritméticos
Relacionales
Condicionales
De desplazamiento
93
MÓDULO 2
Lógicos
De asignación
Otros
Los valores que devuelven estos operadores depende de los tipos de los ope-
randos:
94
Unidad 2.3 Sintaxis
95
MÓDULO 2
Suelen combinarse con los operadores relacionales para crear expresiones más
complejas, devolviendo un boolean. Java tiene los siguientes operadores
condicionales:
96
Unidad 2.3 Sintaxis
97
MÓDULO 2
98
Unidad 2.3 Sintaxis
99
MÓDULO 2
/=, %=, &=, |=, ^=, <<=, >>=, >>>=: Similar al anterior,
para cada uno de los operadores indicados.
Sin las sentencias de control de flujo, el código Java se ejecutaría linealmente des-
de la primera línea hasta la última.
100
Unidad 2.3 Sintaxis
while(expresión)
{
sentencias;
}
do
{
sentencias;
}
while(expresión);
101
MÓDULO 2
Esta nueva sentencia que aparece en el Java SE 5.0 nos facilita la iteración por
los elementos de cualquier tipo de colección: arrays, listas, etc…
102
Unidad 2.3 Sintaxis
La sentencia if-then-else permite elegir qué bloque de código ejecutar entre dos
posibilidades dependiendo de la evaluación de la expresión. Si se cumple (true)
ejecuta el primer bloque o bloque del if. Sino se cumple se ejecuta el bloque del
else.
La sintaxis del if sin else sería la siguiente:
if(expresión)
{
sentencias;
}
if(expresión)
{
sentencias;
}
else
{
sentencias;
}
if(expresión)
{
sentencias;
}
else if (expresión2)
{
sentencias;
}else
{
sentencias;
}
103
MÓDULO 2
switch(intExpresión)
{
case intExpresión:
sentencias;
break;
……
……
default: // es optativo
sentencias;
}
104
Unidad 2.3 Sintaxis
105
MÓDULO 2
PRÁCTICA A: Identificar que sentencias son correctas y cuáles no (se irán utili-
zando las variables según se va avanzando en el ejercicio):
1. int x = 34.5;
2. boolean boo = x;
3. int g = 17;
4. int y = g;
5. y = y + 10;
6. short s;
7. s = y;
8. byte b = 3;
9. byte v = b;
10. short n = 12;
11. v = n;
12. byte k = 128;
13. int p = 3 * g + y;
Solución:
106
Unidad 2.3 Sintaxis
while(x<10)
{
if(x>3)
{
System.out.println("Hola");
}
}
}
}
Solución:
El código compila bien. Pero entra en un bucle infinito. Habría que modificarlo con
la línea roja y saldría la palabra “Hola” siete veces por pantalla.
Solución:
Compila y saldría la palabra “Hola” dos veces por pantalla.
107
MÓDULO 2
Solución
108
Unidad 2.3 Sintaxis
PRÁCTICA E: Desarrollar un programa Java que muestre por pantalla los números
primos del 1 al 1000 y todos los años bisiestos entre el año 2000 y el 3000.
En el caso de que no esté puesta la variable de entorno PATH, abrir una sesión DOS
y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar
las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le
añadimos %PATH%.
109
MÓDULO 2
Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan
encontrar nuestras clases Java. Tenemos dos opciones, o añadir el . (punto) y
siempre ejecutar las herramientas en el directorio donde se encuentre el código, o
añadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para
respetar el valor que ya tuviese la variable CLASSPATH le añadimos %CLASS-
110
Unidad 2.3 Sintaxis
PATH%.
Ahora arrancamos un editor de texto (por ejemplo Notepad) para escribir el código
fuente de nuestro programa que guardaremos en el fichero PracticaE.java; el
nombre del fichero debe ser exactamente igual (incluyendo mayúsculas y
minúsculas) al de la clase Java que vamos a desarrollar.
111
MÓDULO 2
112
Unidad 2.3 Sintaxis
Si no sale ningún mensaje significa que todo ha ido bien y que ha creado el byteco-
de, es decir, PracticaE.class
Por último, ejecutamos el programa Java con la JVM “java”. A la JVM hay que darle
el nombre del fichero del bytecode sin la extensión.
113
MÓDULO 2
114
Unidad 2.3 Sintaxis
115
MÓDULO 2
116
Unidad 2.3 Sintaxis
Crear una clase Java nueva llamada PracticaE con el método main.
117
MÓDULO 2
Seleccionar Finish
Escribir el código dentro de la clase y salvar con Ctrl + S o File -> Save
118
Unidad 2.3 Sintaxis
Seleccionando la clase Java, con el botón derecho del ratón ejecutarla como Java
Application
119
MÓDULO 2
120
Unidad 2.3 Sintaxis
En esta unidad hemos visto la sintaxis del código Java, aprendiendo a utilizar co-
mentarios, delimitar una sentencia Java con el ; y el uso de los espacios en
blanco.
Se han definido los Identificadores, las Keywords, las Variables y los ámbitos
donde se pueden utilizar:
Atributos
Parámetros de método.
Variables locales
Variables de bloque
Por último se han determinado los distintos tipos de Sentencias de control de flujo,
que permiten ejecutar el código de una manera no secuencial:
Bucles: while, do-while, for y for/in
Bifurcaciones: if-then-else y switch-case
Gestión de excepciones: try-catch-finally y throw
De ruptura: break, continue, label: y return.
MÓDULO B
Tema 2.4
Índice de la unidad:
1. Clases
2. Objetos
3. Relación de herencia
4. Polimorfismo
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
En esta unidad veremos los cuatro paradigmas básicos en los que se apoya los len-
guajes orientados a objetos y por tanto el lenguaje de programación Java.
1. Clases
1. 1 Atributos y métodos
Atributos o datos.
Métodos u operaciones.
125
MÓDULO 2
Ejemplo:
{
return param1 + param2;
}
Ejemplo:
Hay que tener en cuenta que podemos recibir, cero, uno o varios valores en
dicho parámetro y que tiene las siguientes restricciones:
126
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Ejemplo:
1. 2 Constructores
En su implementación se suele dar valores a los atributos para ese objeto para
asegurar que los atributos estén inicializados.
Ejemplo:
127
MÓDULO 2
1. 3 Sobrecarga de métodos
Se dice que un método está sobrecargado cuando existen dos métodos con el
mismo nombre y tipo de retorno pero con parámetros distintos.
Ejemplo:
public MiClase()
{
}
El nuevo tipo de retorno sea hijo del tipo de retorno del méto-
do original (es decir, que herede de él directa o indirectamente).
1. 4 Convenciones en Java
128
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
129
MÓDULO 2
2. Objetos
Los objetos en Java no son mas que variables de tipo complejo, frente a las de tipo
primitivo.
tipo identificador;
130
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Como vimos en la Unidad 2.3 Sintaxis, una variable de tipo primitivo contiene
el dato directamen-
te:
Mientras que una variable de tipo complejo contiene una referencia (puntero)
a la zona de memoria donde está el objeto:
Ejemplo:
131
MÓDULO 2
A sus atributos.
A sus métodos.
objeto.atributo
Ejemplo: miCuenta.saldo = 0;
objeto.metodo([parametro,..])
132
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Ejemplo: miCuenta.reintegro(13.7);
133
MÓDULO 2
Las llamadas a métodos se pueden encadenar para evitar tener que crear va-
riables intermedias entre distintas ejecuciónes de métodos:
Equivaldría a:
134
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
El parámetro args es un array (ver Unidad 3.1) donde permite pasarle argu-
mentos al programa Java para su ejecución, en caso de necesitarlos.
Existen tres motivos por los que una variable deja de referenciar a un objeto:
135
MÓDULO 2
cir.
3. Relación de herencia
Las clases se disponen en una jerarquía, donde una clase hereda los atributos y
métodos de las clases superiores en la jerarquía. Es decir, definimos una especie de
interfaz (API) para un grupo de clases relacionados mediante la herencia.
Una clase puede tener sus propios atributos y métodos adicionales a lo heredado.
Las clases por encima en la jerarquía a una clase dada, se denominan superclases
o clases padre.
Las clases por debajo en la jerarquía a una clase dada, se denominan subclases o
clases hijas.
136
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Ejemplo:
Ejemplo:
Ejemplo:
137
MÓDULO 2
138
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Ejemplo:
Esto significa que nuestras clases siempre van a contar con los atributos y mé-
todos de la clase Object por lo que es importante conocerlos. Algunos de sus
métodos más utilizados son:
Ejemplo:
139
MÓDULO 2
3.2 Casting
Ejemplo:
140
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Ejemplo:
141
MÓDULO 2
142
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
143
MÓDULO 2
Habrá que tener muy en cuenta los parámetros que se envían y las conversio-
nes por defecto para saber qué método se ejecuta.
Ejemplo:
144
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Debemos usar herencia cuando hay una clase deun tipo mas específico que
una superclase. Es decir, se trata de una especialización.
145
MÓDULO 2
Ejemplo: Lobo es mas específico que Canino. Luego tiene sentido que Lobo
herede de Canino.
Ejemplo: Las clases Cuadrado, Circulo y Triangulo tiene que calcular su área
y perímetro luego tiene sentido poner esa funcionalidad en una clase genérica
como Figura.
No debemos usar herencia solo por el hecho de reutilizar código. Nunca de-
bemos romper las dos primeras reglas.
146
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
147
MÓDULO 2
148
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
4. Polimorfismo
Consiste en que una vez se ha definido una superclase para un grupo de subclases,
cualquier instancia de esas subclases puede ser usada en el lugar de la superclase.
Esto significa que podemos referenciar un objeto de una subclase mediante una re-
ferencia declarada como una de sus superclases. Ver punto 3.2 Casting para las
conversiones de tipos.
149
MÓDULO 2
Ahora bien, que la referencia sea de otro tipo no significa que los métodos que se
ejecuten sean distintos. Siguen siendo los de la instancia.
150
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Con el polimorfismo podemos desarrollar código que no tiene que ser modificado
por la introducción en el programa de nuevas subclases o tipos debido a:
151
MÓDULO 2
Rediseño
• Añadir a MiLista dos atributos nuevos del topo Gato y otro método
add() que reciba un Gato
• Modificar MiLista para que maneje el tipo genérico Animal y así nos
valga tanto para Lobos como pata Gatos e incluso otros animales en
le futuro. Nos decidimos por este último.
152
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
153
MÓDULO 2
A menudo existen clases que sirven para definir un tipo genérico pero que no
tiene sentido instanciar (crear objetos de ella). Por ejemplo, puede tener sen-
tido instanciar un Circulo pero a lo mejor no instanciar una Figura, porqué…
¿qué figura es? ¿cuál es su área? ¿y su perímetro?
Estas clases pueden estar siendo usadas simplemente para agrupar bajo un
mismo tipo a otras clases, o para contener código reutilizable, o para forzar un
API a sus subclases…..
Ejemplo:
Ejemplo:
154
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Una clase abstracta significaba que tenía que ser heredada. No podía ser ins-
tanciada.
Un método abstracto significa que tiene que ser sobrescrito. No está imple-
mentado.
Una clase con uno o varios métodos abstractos tiene que ser declarada abs-
tracta.
155
MÓDULO 2
Ejemplo:
156
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
157
MÓDULO 2
158
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Otra aproximación sería introducir los nuevos métodos solo en las mascotas.
Así ya no nos tenemos que preocupar de que haya clases que sin ser masco-
tas tengan métodos de estas.
Sin embargo esto implica otro tipo de problemas como que los programadores
de mascotas tendrán que ponerse de acuerdo en el interfaz de estas y siempre
llevarlo a raja tabla puesto que ahora no se hereda y el compilador no nos
ayuda con los posibles errores.
159
MÓDULO 2
La solución que parece óptima, sería tener otra clase abstracta llamada Mas-
cota con los métodos abstractos de las mascotas. Y que todas las mascotas
heredasen de ella.
Así, ya no nos tenemos que preocupar de que haya clases que sin ser masco-
tas tengan métodos de estas.
Pero eso significa que habrá clases que heredarán de dos clases a la vez y en
Java no existe la herencia múltiple.
160
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
5. Interfaces
Los interfaces son un tipo de clase especial que no implementa ninguno de sus mé-
todos. Todos son abstractos. Por tanto no se pueden instanciar.
Ejemplo:
161
MÓDULO 2
{
}
Siguen siendo clases Java por lo que su código fuente se guarda en un fichero texto
de extensión *.java y al compilarlo se generará un *.class
El objetivo de un método abstracto es forzar una interfaz (API) pero no una imple-
mentación.
De los interfaces también se hereda, aunque se suele utilizar más el término im-
plementa por la keyword utilizada. Se realiza mediante la keyword: implements.
Ejemplo:
Una clase puede heredar de otra clase (como máximo de una) y a la vez heredar de
múltiples interfaces.
Si una clase que hereda de un interface, no implementa todos los métodos de este,
deberá ser definida como abstracta.
162
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Ejemplo:
Un interface se trata como un tipo cualquiera. Por tanto, cuando hablamos de poli-
morfismo, significa que una instancia de una clase puede ser referenciada por un
tipo interface siempre y cuando esa clase o una de sus superclases implemente
dicho interface.
163
MÓDULO 2
164
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
165
MÓDULO 2
Solución:
Solución:
166
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Solución:
Estaba mal. El objeto miRect no está inicializado, por tanto vale null. Con null no
podemos hablarnos.
167
MÓDULO 2
Solución:
168
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Nota 1: No seremos rigurosos con las matemáticas y supondremos que los triángu-
los siempre son rectángulos.
169
MÓDULO 2
En el caso de que no esté puesta la variable de entorno PATH, abrir una sesión DOS
y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar
las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le
añadimos %PATH%.
Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan
encontrar nuestras clases Java. Tenemos dos opciones, o añadir el . (punto) y
siempre ejecutar las herramientas en el directorio donde se encuentre el código, o
170
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Ahora arrancamos un editor de texto (por ejemplo Notepad) para escribir el código
fuente de cada uno de nuestras clases java; el nombre del fichero debe ser
exactamente igual (incluyendo mayúsculas y minúsculas) al de la clase Java que
vamos a desarrollar.
Empezamos con Punto.java
171
MÓDULO 2
Los atributos les aplicamos el modificador de acceso private (los veremos en detalle
en la Unidad 2.5)
172
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Creamos con el notepad las siguientes clases y las compilamos al igual que hemos
hecho con el Punto.java : Circulo.java y Triangulo.java
173
MÓDULO 2
174
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Por último crearemos nuestra clase “truco” con el método main que guardaremos
en el fichero PracticaE.java
175
MÓDULO 2
Salvamos los cambios y compilamos la clase con javac. Debemos de tener los byte-
code de todas las clases
176
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
177
MÓDULO 2
178
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
179
MÓDULO 2
Crear una clase Java nueva llamada Punto sin el método main
180
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Seleccionar Finish
Escribir el código dentro del bloque de la clase y salvar con Ctrl + S o File -> Save
181
MÓDULO 2
182
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Crear una clase Java nueva llamada PracticaE con el método main.
183
MÓDULO 2
184
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
Seleccionando la clase Java PracticaE, con el botón derecho del ratón ejecutarla
como Java Application
185
MÓDULO 2
186
Unidad 2.4 Clases Objetos Herencia y Polimorfismo
En esta unidad hemos visto los cuatro paradigmas básicos en los que se apoya los
lenguajes orientados a objetos y por tanto el lenguaje de programación Java.
Objetos, que son instancias de una clase determinada. Para poder acce-
der a sus atributos y métodos se utiliza el operador punto.
- El método main se utiliza directamente sin la crea-
ción de un objeto, para empezar la ejecución de un
programa Java.
- La eliminación de los objetos en memoria se utiliza
via el Garbage Collector.
La relación de herencia, se basa en la existencia de relaciones de ge-
neralización/especialización entre clases.
Los Interfaces, que proporcionan el API que cualquier clase que imple-
mente dicho interface debe de desarrollar.
PA-
MÓDULO B
Otros conceptos
Tema 2.5
Índice de la unidad:
1. Paquetes
2. Modificadores de acceso
3. Métodos estáticos
4. final
7. Instanceof
Unidad 2.5 Otros conceptos
1. Paquetes
Los paquetes Java son una característica más del lenguaje que nos permite
organizar el código en grupos.
Para especificar el paquete al que pertenece una clase se utiliza la keyword: pac-
kage. La sintaxis de la declaración de un paquete es la siguiente:
package nombre_del_paquete;
Ejemplo: es.java.aula.mentor.figuras;
Por tanto, al ir a utilizar una clase debemos conocer siempre el paquete al que per-
tenece para poder referenciarla porque si no el compilador no va a saber encontrar-
la.
191
MÓDULO 2
Existe una convención aceptada por todos los desarrolladores en cuanto a la no-
menclatura de los paquetes Java:
Ejemplos: com.ibm.test
es.miempresa.utilidades
es.practicas.tema1
Para poder utilizar una clase en nuestro código tenemos que escribir su nombre
completo cada vez que la utilicemos: paquete + clase. Para mejorar la legibilidad
del código, existe otro mecanismo para facilitar la codificación y facilitar la vida al
desarrollador que es el uso de la keyword: import. La sintaxis de la declaración de
la sentencia es la siguiente:
import nombre_del_paquete.nombre_de_la_clase;
import nombre_del_paquete.*;
Ejemplos: es.java.aula.mentor.figuras.Circulo;
es.java.aula.mentor.figuras.*;
Las clases importadas de esta manera pueden ser referenciadas en el código direc-
tamente por su nombre de clase sin necesidad de escribir el paquete al que perte-
necen.
Un import genérico (es decir, con el *) importa solo las clases de ese paquete, pero
no de los subpaquetes.
192
Unidad 2.5 Otros conceptos
Al igual que las clases Java tienen un reflejo en el Sistema de Archivos (una clase
Java equivale a un fichero texto de extensión *.java), lo mismo ocurre con los pa-
quetes Java.
Los paquetes Java equivalen a directorios. Es decir, cada miembro del paquete (se-
parado por puntos) se traduce a un directorio en el Sistema de Archivos.
Ejemplo:
package es.java.aula.mentor.figuras;
public class Circulo {...}
Para compilar una clase que pertenece a un paquete tenemos distintas opciones:
193
MÓDULO 2
Ejemplo: Ambas clases están en el paquete por defecto y por tanto se en-
cuentran.
194
Unidad 2.5 Otros conceptos
Ejemplo: Las clases están en paquetes distintos y se utilizan las clases con el
nombre completo
195
MÓDULO 2
Ejemplo: Las clases están en paquetes distintos y se utilizan las clases con la
sentencia import
Ejemplo: Las clases están en paquetes distintos y se utilizan las clases con la
sentencia import genérica
196
Unidad 2.5 Otros conceptos
197
MÓDULO 2
import java.lang.*;
¿Qué ocurre al usar una clase cuyo nombre existe a la vez en dos paquetes
que hemos importado? ¿Cuál de las dos clases es la que se debe utilizar?
Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que están en
paquetes distintos. Utilizamos solamente la sentencia import genérico
198
Unidad 2.5 Otros conceptos
Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que están en
paquetes distintos. Utilizamos la sentencia import genérico y en la clase conflic-
tiva utilizamos el nombre completo.
Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que están en
paquetes distintos. Utilizamos la sentencia import genérico e import específico.
199
MÓDULO 2
Ejemplo: Necesitamos utilizar dos clases con el mismo nombre que están en
paquetes distintos. Utilizamos la sentencia import específico.
200
Unidad 2.5 Otros conceptos
Hemos visto que existe el llamado ‘paquete por defecto’ al que pertenecen
todas aquellas clases que no indican de forma explícita un paquete
determinado en su código.
Desde la versión 1.4.x, el compilador no permite importar desde una clase que
pertenece a un paquete explícito, una clase que pertenece al ‘paquete por
defecto’.
2. Modificadores de acceso
Hasta ahora hemos visto que podemos utilizar cualquier clase, método y atributo
desde cualquier punto de nuestro código sin ningún tipo de problema. Pero el
lenguaje de programación Java, nos permite poder delimitar quién o desde donde
se puede acceder a una clase, a un método o a un atributo.
Existen cuatro tipos de modificadores de acceso y por tanto, cuatro keywords. Las
hemos ordenados de menor a mayor restricción.
201
MÓDULO 2
La siguiente tabla muestra a qué se puede acceder desde una clase dada:
202
Unidad 2.5 Otros conceptos
203
MÓDULO 2
clases
3. Métodos estáticos
Existen casos en los que nos encontramos con clases cuyos métodos no dependen
en absoluto de los atributo de la clase, y en todo caso de los parámetros de los
métodos. Por ejemplo, la clase java.lang.Math:
Son métodos que parece no pertenecer a una entidad concreta. Son genéricos,
globales, independientes de cualquier estado del objeto.
¿Tiene sentido instanciar un objeto para ejecutar algo que no depende de nada de
dicho objeto?
204
Unidad 2.5 Otros conceptos
La respuesta es no. Y para ello contamos en Java con los métodos estáticos. Están
asociados a una clase solamente desde un punto de vista organizativo.
Ejemplo:
Para ejecutar por tanto un método estático no hace falta instanciar un objeto de la
clase. Se puede ejecutar el método directamente sobre la clase.
Hay ciertas reglas que hay que tener en cuenta en el uso de métodos estáticos:
205
MÓDULO 2
206
Unidad 2.5 Otros conceptos
Los atributos estáticos (o variables estáticas) son atributos cuyo valor es com-
partido por todos los objetos de una clase.
Hay que tratarlos con cuidado puesto que son fuente de problemas difíciles de
detectar. Como todos los objetos de una misma clase comparte el mismo atri-
buto estático, si un objeto ‘a’ modifica el valor del atributo, cuando el objeto
‘b’ vaya a usar dicho atributo, lo usa con un valor modificado.
Recordemos que sin embargo los atributos convencionales (de instancia) son
propios de cada objeto.
Ejemplo:
207
MÓDULO 2
Los bloques de código estático son trozos de código que se ejecutan al cargar
una clase en memoria (no al instanciar objetos de esa clase).
static { …. }
Ejemplo:
208
Unidad 2.5 Otros conceptos
4. final
Clases
Atributos
Métodos
Definiendo una clase como final conseguimos que ninguna otra clase pueda
heredar de ella.
Para definir una clase final utilizamos la keyword: final. La sintaxis de la de-
claración es la siguiente:
209
MÓDULO 2
Ejemplo:
Definiendo un método como final conseguimos que ninguna otra clase pueda
sobrescribirlo.
Ejemplo:
Ejemplo:
210
Unidad 2.5 Otros conceptos
Ejemplo:
Ejemplo:
211
MÓDULO 2
java.lang.Math.E: el número E.
javax.swing.SwingConstants.CENTER: centrado.
212
Unidad 2.5 Otros conceptos
En ocasiones cuando se crea una clase solo con constantes, se suele hacer
mediante un interface, debido a que no es necesario tener ningún método de-
finido ni implementado.
Ejemplo:
213
MÓDULO 2
En Java sin embargo no hay decisión posible: todo se pasa por valor. Si se modifica
el valor de la variable recibida, no se modifica la variable original..
Ejemplo:
Ejemplo:
214
Unidad 2.5 Otros conceptos
215
MÓDULO 2
El compilador realiza cosas por defecto de forma automática (sin que estén des-
arrolladas de forma explícita en nuestro código). Las enumeramos a continuación:
import java.lang.*;
216
Unidad 2.5 Otros conceptos
public MiClase()
{
super();
}
this.miMetodo();
217
MÓDULO 2
6. Instanceof
Este operador permite comprobar si un objeto es instancia de una clase o no. De-
vuelve un boolean por lo que puede utilizarse en expresiones lógicas (condiciones).
Ejemplo:
218
Unidad 2.5 Otros conceptos
Solución:
219
MÓDULO 2
Solución:
Solución:
220
Unidad 2.5 Otros conceptos
Al mismo tiempo, tendremos un interfaz con los puntos de fuerza de cada una de
las criaturas definidas como constantes en el paquete
es.java.aula.mentor.practicad.util. De esta manera un simple cambio en el interfaz
actualiza todo el juego.
Aunque en esta primera fase del desarrollo del juego no utilicemos las criaturas,
realizar un diseño lo mas genérico, reutilizable y fácil de mantener que se pueda.
En el caso de que no esté puesta la variable de entorno PATH, abrir una sesión DOS
y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar
las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le
añadimos %PATH%.
221
MÓDULO 2
Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan
encontrar nuestras clases Java. Tenemos dos opciones, o añadir el . (punto) y
siempre ejecutar las herramientas en el directorio donde se encuentre el código, o
añadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para
respetar el valor que ya tuviese la variable CLASSPATH le añadimos %CLASS-
PATH%
222
Unidad 2.5 Otros conceptos
223
MÓDULO 2
224
Unidad 2.5 Otros conceptos
225
MÓDULO 2
226
Unidad 2.5 Otros conceptos
Podemos hacerlo desde cada uno de los directorios donde están las clases, indican-
do solamente el nombre de la clase sin paquete (por ejemplo javac Troll.java) o
desde el directorio trabajo, indicando el nombre completo de la clase (por ejemplo
javac es\java\aula\mentor\practicad\criaturas\Troll.java).
Para poder compilar las clases, es necesario que las clases que utilizan sean compi-
ladas previamente.
Vemos como han quedado las clases compiladas en cada uno de los directorios
227
MÓDULO 2
228
Unidad 2.5 Otros conceptos
229
MÓDULO 2
230
Unidad 2.5 Otros conceptos
231
MÓDULO 2
Seleccionar Finish
Escribir el código dentro del bloque del interface y salvar con Ctrl + S o File -> Sa-
ve
232
Unidad 2.5 Otros conceptos
Crear las siguientes clases Troll , Enano, Elfo (sin método main) dentro del mismo
paquete. Para no tener que volver a escribir el nombre del paquete, podemos se-
leccionarlo vía el botón derecho del ratón y luego seleccionar el crear una nueva
clase.
233
MÓDULO 2
234
Unidad 2.5 Otros conceptos
En Eclipse, cuando se salvan los cambios, se compila el código, por lo que no hace
falta realizar este paso.
235
MÓDULO 2
Por último, creamos la clase que va a contener el main PracticaD, en el paquete ja-
va es.java.aula.mentor.practicad
236
Unidad 2.5 Otros conceptos
Seleccionando la clase Java PracticaD, con el botón derecho del ratón ejecutarla
como Java Application
237
MÓDULO 2
238
Unidad 2.5 Otros conceptos
En esta unidad hemos visto distintos conceptos que nos permiten organizar nues-
tro código y modificar el acceso a nuestras clases, métodos y atributos.
Paquetes: son una característica del lenguaje que nos permite organizar
el código en grupos. Físicamente, cada uno de los subgrupos del paquete
se convierten en un directorio del sistema operativo.
Bloques estáticos: son bloques de código que se ejecutan una sola vez
cuando la clase es cargada en memoria.
UNIDADES DIDÁCTICAS:
Math, Integer, ….
Clases básicas
Tema 3.1
Índice de la unidad:
1. Clase java.lang.String
2. Clase java.lang.StringBuffer
3. Clase java.lang.StringBuilder
4. Clase java.lang.System
5. Clase java.lang.Math
6. Otras clases
En el paquete java.lang, importado por defecto por el compilador en las clases Ja-
va, existen ciertas clases muy utilizadas a la hora de desarrollar un programa. Es
por este motivo, que es importante que se conozcan.
1. Clase java.lang.String
Otros constructores:
http://java.sun.com/javase/6/docs/api/java/lang/String.html#constr
uctor_detail
Implementa una serie de métodos muy útiles para el manejo de las cadenas de ca-
racteres. Por ejemplo:
245
MÓDULO 3
Otros métodos:
http://java.sun.com/javase/6/docs/api/java/lang/String.html#metho
d_detail
Ejemplo:
246
Unidad 3.1 Clases básicas
Ejemplo:
Hay un concepto muy importante relacionado con el uso de Strings: son inmuta-
bles. Es decir, jamás se modifica el valor de un String si no que se crean nuevos
objetos. En la ejecución del siguiente código
String s = "0";
for(int i=1; i <10; i++)
s = s + i;
247
MÓDULO 3
No existe un solo objeto de tipo String al que se le ha ido cambiando su valor inter-
no (atributos), sino que se han creado 10 objetos distintos.
Pero aún hay más… la JVM reserva un espacio en memoria llamado String Pool
donde va guardando todos los String. Y el Garbage Collector jamás los elimina.
Cada vez que se crea un objeto nuevo del tipo String, la JVM mira antes si ese
String ya existe, y si es así lo reutiliza.
Por este motivo, el uso de String es un tema no tan trivial como pudiera parecer.
Un uso indebido puede provocar problemas de rendimiento.
2. Clase java.lang.StringBuffer
StringBuffer es otra clase relacionada con las cadenas de caracteres. Pero en este
caso no son inmutables.
Otros constructores:
http://java.sun.com/javase/6/docs/api/java/lang/StringBuffer.html#
constructor_detail
248
Unidad 3.1 Clases básicas
249
MÓDULO 3
Otros métodos:
http://java.sun.com/javase/6/docs/api/java/lang/StringBuffer.html#
method_detail
Ejemplo:
Ejemplo:
250
Unidad 3.1 Clases básicas
El uso más habitual es la creación de Strings cuyo valor se calcula de forma dinámi-
ca. Al no ser inmutable, permite la creación del String final sin otros objetos inter-
medios que consumirán memoria de forma innecesaria. En la ejecución del siguien-
te código
3. Clase java.lang.StringBuilder
251
MÓDULO 3
Ejemplo:
4. Clase java.lang.System
Se trata de una clase con utilidades genéricas del sistema. Todos sus atributos y
métodos son estáticos.
252
Unidad 3.1 Clases básicas
Otros métodos:
http://java.sun.com/javase/6/docs/api/java/lang/System.html#meth
od_detail
Ejemplo:
253
MÓDULO 3
5. Clase java.lang.Math
Se trata de una clase con utilidades matemáticas. Todos sus atributos y métodos
son estáticos.
254
Unidad 3.1 Clases básicas
Otros métodos:
http://java.sun.com/javase/6/docs/api/java/lang/Math.html#method
_detail
Ejemplo:
255
MÓDULO 3
6. Otras clases
256
Unidad 3.1 Clases básicas
Hay ocasiones en las que necesitaríamos usar un tipo primitivo como un objeto (ti-
po complejo). Por ejemplo, cuando queremos guardar números en una colección
que solo admite java.lang.Object.
En el paquete java.lang.* existe un wrapper para cada tipo primitivo (no siempre
coincide el nombre):
257
MÓDULO 3
Ejemplo:
Es el wrapper del tipo primitivo boolean. Sus métodos más importantes son:
258
Unidad 3.1 Clases básicas
Es el wrapper del tipo primitivo char. Sus métodos más importantes son:
Es el wrapper del tipo primitivo byte. Sus métodos más importantes son:
259
MÓDULO 3
Es el wrapper del tipo primitivo short. Sus métodos más importantes son:
260
Unidad 3.1 Clases básicas
Es el wrapper del tipo primitivo int. Sus métodos más importantes son:
Es el wrapper del tipo primitivo long. Sus métodos más importantes son:
261
MÓDULO 3
Es el wrapper del tipo primitivo float. Sus métodos más importantes son:
262
Unidad 3.1 Clases básicas
Es el wrapper del tipo primitivo double. Sus métodos más importantes son:
263
MÓDULO 3
7.9 Autoboxing/Auto-unboxing
Java SE 5.0 añade una novedad al respecto de los wrappers de tipo básico,
permitiendo que las conversiones entre tipos primitivos y sus wrappers se
hagan de forma automática.
264
Unidad 3.1 Clases básicas
Integer i = 1;
int b = a;
Integer a = 5; int b = 6;
if(a == b)
System.out.println(“Iguales”);
Ante esta nueva funcionalidad, nos podemos preguntar ¿qué pasa con la so-
brecarga de métodos?
265
MÓDULO 3
int a = 5;
this.metodo(a);
La cadena invertida.
En el caso de que no esté puesta la variable de entorno PATH, abrir una sesión DOS
y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar
las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le
añadimos %PATH%.
266
Unidad 3.1 Clases básicas
Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan
encontrar nuestras clases Java. Tenemos dos opciones, o añadir el . (punto) y
siempre ejecutar las herramientas en el directorio donde se encuentre el código, o
añadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para
respetar el valor que ya tuviese la variable CLASSPATH le añadimos %CLASS-
PATH%
267
MÓDULO 3
268
Unidad 3.1 Clases básicas
Para poder coger un parámetro pasado en la ejecución del programa, incluir las
siguientes líneas después del main. Veremos el tratamiento de los arrays en la
Unidad 3.1
if (args == null || args.length != 1){
System.out.println("Numero de parametros incorrectos");
System.exit(1);
}
String s = args[0];
269
MÓDULO 3
270
Unidad 3.1 Clases básicas
271
MÓDULO 3
272
Unidad 3.1 Clases básicas
273
MÓDULO 3
274
Unidad 3.1 Clases básicas
275
MÓDULO 3
276
Unidad 3.1 Clases básicas
El valor de la hipotenusa.
Adicionalmente, habrá que mostrar el tiempo que tarda en ejecutarse este método.
277
MÓDULO 3
278
Unidad 3.1 Clases básicas
279
MÓDULO 3
280
Unidad 3.1 Clases básicas
281
TÍTULO DE MÓDULO O BLOQUE
En esta unidad se han visto una relación de clases básicas e imprescindibles de co-
nocer a la hora de la programación en Java.
java.lang.String: utilizada para el tratamiento de cadenas de caracteres
o String. Se utiliza sobre todo para cadenas de caracteres inmutables
Además se han estudidado las clases wrappers de los tipos primitivos, como son:
java.lang.Boolean
java.lang.Character
java.lang.Byte
java.lang.Short
java.lang.Integer
java.lang.Long
java.lang.Float
java.lang.Double
MÓDULO C
Tema 3.2
Índice de la unidad:
1. Arrays
2. Colecciones
En Unidades anteriores hemos estudiado los tipos de datos, tanto primitivos como
complejos. Hemos visto como trabajar con datos de ambos dos tipos, pero siempre
de una manera unitaria. En esta Unidad veremos como trabajar con los conjuntos
de datos, como una sola variable u objeto.
1. Arrays
Un array es una estructura de datos que permite albergar varios elementos del
mismo tipo.
Los arrays pueden albergar tanto tipos primitivos como tipos complejos y para po-
der utilizarlos, hay que inicializarlos. Un array sin inicializar, por defecto vale null.
285
MODULO 3
Una vez hayamos creado un array, todas sus posiciones son inicializadas al valor
por defecto del tipo de variable que albergue.
Existe una forma de crear un array inicializando todas sus posiciones a un valor de-
terminado, igualándolo a un listado de elementos separados por comas entre { }.
El tamaño del array será el número de elementos del listado.
Ejemplos: numeros[2] = 3;
int a = numeros[0];
if(numeros[4] == 5)…..
286
Unidad 3.2 Estructura de datos
Ni eliminar posiciones.
Ni insertar posiciones.
El borrado será algo lógico, como igualar a null, a -1, etc….. las posiciones que no
se quieran o se necesiten utilizar, dependiendo de la lógica que necesite el progra-
ma o de la propia elección del programador.
287
MODULO 3
Es imposible acceder a una posición fuera del array en tiempo de ejecución. Llega-
do el caso se lanzará una excepción del tipo ArrayIndexOutOfBoundException
(se verán en más detalle en la Unidad 3.5).
// Inserción.
saludos[0] = new String("Hola");
saludos[1] = new String("Adios");
saludos[2] = new String("Hello");
saludos[3] = new String("GoodBye");
// Extracción.
String tmp = saludos[2];
// Borrado.
saludos[2] = null;
saludos[3] = null;
// Recorrido.
for(int i=0; i<saludos.length; i++)
System.out.println(saludos[i]);
// Búsqueda.
boolean sw = false;
for(int i=0; i<saludos.length; i++)
{
if(saludos[i] != null && saludos[i].equals("Adios"))
{
System.out.println("Adios ha sido encontrado en la posición: "
+ i);
sw = true;
break;
}
}
}
}
288
Unidad 3.2 Estructura de datos
1. 1 Sentencia for/in
Esta nueva sentencia del Java SE 5.0 nos facilita la iteración por los elementos
de cualquier tipo de colección: arrays, listas, etc…
1. 2 Arrays multidimensionales
289
MODULO 3
Ejemplo:
Al igual que ocurriera en los arrays de una dimensión, los arrays bidimensio-
nales también se pueden inicializar en la creación con un listado de valores.
290
Unidad 3.2 Estructura de datos
// Rellenar la matriz
for(int i=0; i<matriz.length; i++)
{
matriz[i] = new int[5];
for(int j=0; j<matriz[i].length; j++)
matriz[i][j] = i + j;
}
// Mostrar la matriz
for(int i=0; i<matriz.length; i++)
{
for(int j=0; j<matriz[i].length; j++)
System.out.print(matriz[i][j] + " ");
System.out.println();
}
}
}
291
MODULO 3
El método main recibe un array de Strings que contine los argumentos envia-
dos en el arranque de la aplicación. La sintaxis del método main es la siguien-
te, y como podemos apreciar args es un array de elementos de tipo String:
Ejemplo:
292
Unidad 3.2 Estructura de datos
2. Colecciones
Una colección es simplemente un objeto que agrupa varios elementos en uno solo.
Se utilizan para guardar y manipular datos así como transmitir información entre
métodos.
293
MODULO 3
En el caso de los Map, se utilizan siempre que necesitemos trabajar con parejas de
datos clave/valor.
Estas interfaces contiene la definición de todos los métodos genéricos que deben
implementar las colecciones.
2.1 java.util.Collection
294
Unidad 3.2 Estructura de datos
295
MODULO 3
Hay que tener siempre en cuenta que las colecciones no permiten el uso de ti-
pos primitivos. Por tanto, siempre que necesitemos trabajar con ellos habrá
que hacer uso de los Wrappers de Tipos Primitivos.
2.2 java.util.Iterator
Todas las colecciones ofrecen una implementación de Iterator por medio del
método:
2.2 java.util.Set
296
Unidad 3.2 Estructura de datos
import java.util.*;
ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add("Sevilla");
ciudades.add("Madrid"); // Repetido.
Iterator it = ciudades.iterator();
while(it.hasNext())
System.out.println("Ciudad: " + it.next());
}
}
297
MODULO 3
import java.util.*;
ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add("Sevilla");
ciudades.add("Madrid"); // Repetido.
Iterator it = ciudades.iterator();
while(it.hasNext())
System.out.println("Ciudad: " + it.next());
}
}
298
Unidad 3.2 Estructura de datos
import java.util.*;
ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add("Sevilla");
ciudades.add("Madrid"); // Repetido.
Iterator it = ciudades.iterator();
while(it.hasNext())
System.out.println("Ciudad: " + it.next());
}
}
2.3 java.util.List
El interfaz List hereda del interfaz Collection. Representa colecciones con ele-
mentos en secuencia. Es decir, con orden.
299
MODULO 3
Los métodos que añade este interfaz, para acceso posicional son:
Los métodos que añade este interfaz para operaciones de búsqueda son:
Los métodos que añade este interfaz para obtener subcolecciones son:
300
Unidad 3.2 Estructura de datos
import java.util.*;
ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add(1,"Sevilla");
ciudades.add("Madrid"); // Repetido.
Iterator it = ciudades.iterator();
while(it.hasNext())
System.out.println("Ciudad: " + it.next());
}
}
import java.util.*;
301
MODULO 3
ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add(1,"Sevilla");
ciudades.add("Madrid"); // Repetido.
import java.util.*;
ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add(1,"Sevilla");
ciudades.add("Madrid"); // Repetido.
Iterator it = ciudades.iterator();
while(it.hasNext())
System.out.println("Ciudad: " + it.next());
}
}
302
Unidad 3.2 Estructura de datos
import java.util.*;
ciudades.add("Madrid");
ciudades.add("Barcelona");
ciudades.add("Malaga");
ciudades.add("Vigo");
ciudades.add(1,"Sevilla");
ciudades.add("Madrid"); // Repetido.
303
MODULO 3
2.4 java.util.Map
304
Unidad 3.2 Estructura de datos
import java.util.*;
Set s = codigos.keySet();
Iterator it = s.iterator();
while(it.hasNext())
{
String aux = (String)it.next();
305
MODULO 3
import java.util.*;
Set s = codigos.keySet();
Iterator it = s.iterator();
while(it.hasNext())
{
String aux = (String)it.next();
System.out.println(aux + ": " + codigos.get(aux));
}
}
}
306
Unidad 3.2 Estructura de datos
import java.util.*;
Set s = codigos.keySet();
Iterator it = s.iterator();
while(it.hasNext())
{
String aux = (String)it.next();
System.out.println(aux + ": " + codigos.get(aux));
}
}
}
307
MODULO 3
import java.util.*;
Set s = codigos.keySet();
Iterator it = s.iterator();
while(it.hasNext())
{
String aux = (String)it.next();
System.out.println(aux + ": " + codigos.get(aux));
}
}
}
308
Unidad 3.2 Estructura de datos
2.5 Generics
309
MODULO 3
Siempre que creemos nuestras propias claves para el uso de los Map, debemos so-
breescribir los métodos equals() y hashCode().
El motivo es que los Map utilizan estos dos métodos para llevar a cabo tanto las
inserciones como las extracciones de valores.
Para entender mejor el uso de estos dos métodos por parte de los Map, veamos un
poco más en detalle la estructura interna de este tipo de colección.
Pero pueden ocurrir colisiones, es decir, que un compartimento ya esté utilizado por
una pareja clave/valor. Esto puede ser debido a que:
310
Unidad 3.2 Estructura de datos
Lo sabe mediante el uso del método equals() de la clave. Va iterando por todas las
claves de ese compartimento para encontrar la que se ha pedido.
Imaginemos que hacemos un put en el Map con una clave ya existente. ¿Cómo sa-
be que ya existe y que hay que machacar el valor anterior?
Lo sabe mediante el uso del método equals() de la clave. Itera para comprobar si
ya existe.
311
MODULO 3
312
Unidad 3.2 Estructura de datos
Por ejemplo, ¿cómo funcionan los métodos contains(), add() y remove() de las co-
lecciones?
313
MODULO 3
Tamaño estático.
Tamaño dinámico.
314
Unidad 3.2 Estructura de datos
En el garaje se cambian las ruedas tanto de coches como de motos. El precio del
cambio de una rueda se fija al abrir el garaje, al igual que la capacidad máxima de
vehículos, ya sean motos o coches. Si no hubiese hueco para registrar un vehículo
nuevo, habrá que tener contemplado un sistema de aviso para quien esté dejando
su vehículo.
El sistema de gestión del garaje requiere un mecanismo para ingresar y retirar los
vehículos, conocer el número total de vehículos recibidos en ese momento, el precio
que supondría cambiar todas las ruedas de todos los vehículos, y el kilometraje
medio de todos ellos.
La clase PracticaA tiene un método main en el que se crea un Garaje, una serie de
vehículos que se irán recibiendo en el garaje y por último se imprimirá por pantalla
toda la información general del garaje así como la información de cada vehículo.
En el caso de que no esté puesta la variable de entorno PATH, abrir una sesión DOS
y ajustar la variable de entorno PATH para que el Sistema Operativo sepa encontrar
las herramientas del JDK. Para respetar el valor que ya tuviese la variable PATH le
añadimos %PATH%.
315
MODULO 3
Ajustar la variable de entorno CLASSPATH para que las herramientas del JDK sepan
encontrar nuestras clases Java. Tenemos dos opciones, o añadir el . (punto) y
siempre ejecutar las herramientas en el directorio donde se encuentre el código, o
añadir el directorio de trabajo y ejecutar las herramientas donde queramos. Para
respetar el valor que ya tuviese la variable CLASSPATH le añadimos %CLASS-
PATH%
316
Unidad 3.2 Estructura de datos
317
MODULO 3
318
Unidad 3.2 Estructura de datos
Ahora toca el turno a la clase Moto que también implementa el interface Vehiculo
319
MODULO 3
Por último la clase PracticaA, que contiene el método main podría quedar como si-
gue:
320
Unidad 3.2 Estructura de datos
321
MODULO 3
322
Unidad 3.2 Estructura de datos
323
MODULO 3
324
Unidad 3.2 Estructura de datos
325
MODULO 3
package es.java.aula.mentor.practicas31;
import es.java.aula.mentor.practicas31.vehiculos.Vehiculo;
326
Unidad 3.2 Estructura de datos
// Constructores.
public Garaje(int param1, int param2)
{
vehiculos = new Vehiculo[param1];
precio = param2;
}
// Métodos.
public boolean ingresarVehiculo(Vehiculo param)
{
boolean sw = false;
for(int i=0; i<vehiculos.length; i++) {
if(vehiculos[i] == null) {
sw = true;
vehiculos[i] = param;
break;
}
}
return sw;
}
327
MODULO 3
if(vehiculos[i] != null)
cont++;
}
return cont;
}
}
Finalizamos creando la clase PracticaA, marcando que nos cree el método main
328
Unidad 3.2 Estructura de datos
Verificar que todas las clases están grabadas. Para ello utilizar Ctrl + S en cada cla-
se o en File -> Save All
329
MODULO 3
330
Unidad 3.2 Estructura de datos
Tendremos un archivador donde iremos guardando todas las fichas de los pacien-
tes. Las fichas contienen la siguiente información: nombre, apellidos y edad.
Todas las fichas que vayamos creando, se podrán guardar o eliminar del archiva-
dor. Al archivador también le podremos pedir un listado. Este listado consistirá en
imprimir por pantalla el número de fichas guardadas, así como el contenido de las
fichas.
331
MODULO 3
332
Unidad 3.2 Estructura de datos
Ejecutamos la práctica
333
MODULO 3
334
Unidad 3.2 Estructura de datos
335
MODULO 3 JAVA AVANZADO
En esta Unidad hemos visto como trabajar con los conjuntos de datos, como una so-
la variable u objeto. Los dos grandes grupos que permiten tratar con conjuntos de
datos son:
Arrays:
- Tienen un tamaño estático
- Su tamaño se conoce mediante el atributo length.
- Puede almacenar tanto tipos primitivos como tipos
complejos.
- Solo pueden albergar elementos de un tipo.
Colecciones:
- Tienen un tamaño dinámico
- Su tamaño se conoce mediante método size().
- Puede almacenar solo tipo complejos, ya sean del
mismo o distinto tipo.