Introducción al lenguaje de programación Java

Anuncio
1 [1 - 1]
Introducción al lenguaje de programación Java
Conceptos básicos
Carlos Varela Paz
(cvarela@dc.fi.udc.es)
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
2 [2 - 2]
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Parte I
Fundamentos del lenguaje
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Índice
3 [3 - 4]
1
Introducción
Historia
Herramientas
Empaquetador JAR
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Éste curso
4 [3 - 4]
¿Que es Java?
Herramientas básicas
Sintáxis básica
Manejo de objetos
Threads
Mecanismos de E/S
Clases de útilidad más usadas
...
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Breve historia
5 [5 - 6]
Creado por Sun.
Objetivo de diseño: creación de un lenguaje independiente de
la plataforma y del sistema operativo, para el desarrollo de
electrónica de consumo.
El proyecto original (Green) comenzó apoyándose en C++:
problemas de portabilidad.
Desarrolló su propio lenguaje y en agosto de 1991 nació un
nuevo lenguaje orientado a objetos (Oak).
A mitad de 1993 se lanzó Mosaic el primer navegador para la
Web, y comenzó a crecer el interés por Internet (y en
particular por la World Wide Web).
Rediseño del lenguaje para desarrollar aplicaciones para
Internet.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Breve historia
6 [5 - 6]
Enero del 1995 Oak se convirtió en Java.
En 1996 Sun lanza el entorno JDK 1.0. Desde entonces se han
lanzado diferentes versiones, aunque la primera comercial se
denominó JDK 1.1 y se lanzó a principios de 1997.
En diciembre de 1998 Sun lanzó la plataforma Java 2 (que se
ha conocido como JDK 1.2 durante su fase de pruebas beta).
Esta versión de Java ya presentó la madurez de la plataforma
Java. Sun renombró Java 1.2 como Java 2.
La última versión lanzada por Sun es Java(TM) 2 Platform
Standard Edition 5.0 o J2SE(TM) 5.0.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Intérprete
7 [7 - 11]
Un interprete Java es un software que contiene una máquina
virtual Java y que ejecuta aplicaciones Java:
Realiza todas las actividades del sistema de ejecución de Java.
Carga los archivos de clase y traduce el bytecode compilado.
El intérprete Java de Sun es java, la sintaxis es:
java [opciones] nombre clase [argumentos]
Aplicaciones independientes
En una aplicación independiente, una clase contiene el metodo
main(), que contiene sentencias para ejecutar al inicio. Para que la
aplicación se ejecute, se ejecuta el intérprete indicando esa clase
como argumento.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Intérprete
Aplicaciones independientes
8 [7 - 11]
Especificar el nombre completo de la clase, sin la extensión
.class.
El intérprete busca la clase en la ruta de clases, que es una
lista de directorios dónde se guardan los paquetes de las clases.
La ruta de clase normalmente está definida en la variable de
entorno CLASSPATH, pero puede ser redefinida con la opción
-classpath o -cp
Tras cargar la clase especificada en la lı́nea de comando, el
intérprete ejecuta el método main() de la clase.
A partir de aquı́ la aplicación puede iniciar threads adicionales,
hacer referencia a otras clases, crear su interfaz de usuario u
otras estructuras.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Compilador
9 [7 - 11]
El compilador de Sun es javac.
javac convierte el código fuente Java en una clase compilada
que contiene el bytecode de la máquina virtual Java.
Los archivos fuente tienen la extensión .java, los archivos de
clase resultantes tienen la extensión .class.
Se permite una única clase pública por archivo y el nombre del
archivo debe ser el mismo que el de la clase.
Un único arquivo puede contener múltiples clases siempre y
cuando sólo una de ellas sea pública.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Compilador
Ejemplo
En un fichero HolaMundo.java escribimos el código siguiente:
p u b l i c c l a s s HolaMundo {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
System . o u t . p r i n t l n ( ” Hola mundo ! ” ) ;
}
}
ejecutamos:
javac HolaMundo.java
java HolaMundo
10 [7 - 11]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Compilador
11 [7 - 11]
Si queremos que al compilar las clases se generen en un directorio distinto del actual usamos la opción -d del compilador:
javac -d clases HolaMundo.java
java -cp clases HolaMundo
Se pueden especificar múltiples archivos .java en un único
comando javac. El compilador crea un archivo de clase por
cada archivo fuente.
No es necesario listar los archivos fuente de todas las clases
utilizadas, éstas se buscan usando la ruta de clases.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Empaquetador JAR
12 [12 - 18]
Los ficheros .jar son el medio estándar y portatil de
empaquetar todas las partes de una aplicación Java.
En un JAR podemos poner todo lo que queramos: clases Java,
datos, imagenes, sonidos . . .
El sistema de ejecución sabe manejar este tipo de ficheros y
por eso podemos incluirlos en nuestro classpath.
Los elementos almacenados se comprimen con ZLIB
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Empaquetador JAR
Con la utilidad jar podemos crear o leer ficheros JAR. La sintaxis
imita a la de la utilidad tar de Unix:
13 [12 - 18]
Para crear un JAR que contenga ciertos paths
jar -cvf ficheroJar path [path] [...]
Para listar el contenido de un JAR, mostrando sólo ciertos paths
jar -tvf ficheroJar [path] [...]
Para extraer el contenido de un JAR, o solo ciertos paths
jar -xfv ficheroJar [path] [...]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Empaquetador JAR
Ejemplo
Vamos a empaquetar nuestra clase HolaMundo.java:
jar -cfv holamundo.jar clases
manifest agregado
agregando: clases/(entrada = 0) (salida= 0)(almacenado 0%)
agregando: clases/HolaMundo.class(entrada = 423) (salida= 288)(desinflado 31%)
14 [12 - 18]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Empaquetador JAR
Ejemplo
Desempaquetamos el JAR:
jar -xfv holamundo.jar
15 [12 - 18]
creado: META-INF/
extraı́do: META-INF/MANIFEST.MF
creado: clases/
extraı́do: clases/HolaMundo.class
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Empaquetador JAR
Ejemplo
Podemos ver el contenido:
jar -tfv holamundo.jar
0
68
0
423
16 [12 - 18]
Fri
Fri
Thu
Wed
Dec
Dec
Nov
Nov
03
03
11
10
08:37:10
08:37:12
09:33:22
13:17:16
CET
CET
CET
CET
2004
2004
2004
2004
META-INF/
META-INF/MANIFEST.MF
clases/
clases/HolaMundo.class
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Empaquetador JAR
Manifiesto
17 [12 - 18]
jar crea un directorio META-INF con un fichero
MANIFEST.MF. Este fichero contiene información acerca de
los ficheros almacenados
Contiene pares clave:valor
Por defecto:
Manifest-Version: 1.0
Created-By: 1.4.2 (Sun Microsystems Inc.)
Para incluir un fichero de manifiesto se usa la opción m de jar
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Historia
Herramientas
Empaquetador JAR
Empaquetador JAR
Manifiesto: Ejemplo
18 [12 - 18]
Una de las claves es Main-Class que sirve para especificar la
clase principal de la aplicación.
En el directorio clases escribimos un fichero manifiesto.mf
Manifest-Version: 1.0
Created-By: Carlos
Main-Class: HolaMundo
Invocamos:
jar -cvmf manifesto.mf holamundo.jar .
Para ejecutar la aplicación se usar la opción -jar de java:
java -jar holamundo.jar
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Índice
2
19 [19 - 19]
Sintaxis
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Comentarios
En Java se pueden hacer comentarios de bloque y de lı́nea. Los
primeros están delimitados por /* y */ y los segundos por //:
20 [20 - 25]
/∗ C o m e n t a r i o de
b l o q u e con mas de
una l i n e a
∗/
// C o m e n t a r i o de una l i n e a
// Otro c o m e n t a r i o de una l i n e a
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Comentarios
Observaciones
Los comentarios de bloque no pueden anidarse.
/∗ C o m e n t a r i o de b l o q u e con mas de
una l i n e a
/∗ e s t o no c o m p i l a ∗/
∗/
Los comentarios de una lı́nea están delimitados por el final de
lı́nea, si se pone // dentro de un comentario de lı́nea no tiene
efecto. No entran en conflicto con los comentarios de bloque.
21 [20 - 25]
/∗ C o m e n t a r i o de b l o q u e con mas de
una l i n e a
// e s t o c o m p i l a
∗/
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Comentarios Javadoc
22 [20 - 25]
Si un comentario de bloque empieza por /** se indica un
comentario de documentación.
Éstos están diseñados para ser extraı́dos por generadores
automáticos de documentación como el programa javadoc.
En estos comentarios se usan márcas especiales para añadir
información: cada espacio en una lı́nea hasta un * es ignorado
y las lı́neas que empiezen por un @ se interpretan como
etiquetas especiales para el generador de documentación.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Comentarios Javadoc
Ejemplo
23 [20 - 25]
/∗ ∗
∗ E s t a una c l a s e h o l a mundo . E s t a c l a s e e s c r i b e h o l a
∗ mundo en l a s a l i d a e s t a n d a r
∗ @see H o l a P l a n e t a
∗ @ a u t h o r C a r l o s V a r e l a Paz
∗ @ v e r s i o n 1 . 0 0 , 3 Dec 2004
∗/
p u b l i c c l a s s HolaMundo {
/∗ ∗
∗ Metodo p r i n c i p a l de H o l a mundo
∗ @param a r g s Argumentos p a s a d o s a l i n t e r p r e t e
∗ @ r e t u r n nada
∗/
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
System . o u t . p r i n t l n ( ” H o l a mundo ! ” ) ;
}
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Comentarios Javadoc
24 [20 - 25]
javadoc crea la documentación en formato HTML.
El compilador tambien busca estos comentarios en el código,
en concreto está interesado en la etiqueta @deprecated que
indica que un método esta obsoleto y deberá evitarse en
nuevos programas. El compilador genera un mensaje de aviso
si se usa un método obsoleto.
Los comentarios de documento pueden aparecer encima de las
definiciones de clases, métodos y variables, pero no todas las
etiquetas pueden ser aplicadas a todos los casos. Por ejemplo,
las variables pueden tener sólo la etiqueta @see.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Comentarios Javadoc
Etiquetas
25 [20 - 25]
Etiqueta
@see
Descripción
Nombre de clase asociada
@auhor
@version
@param
Nombre del autor
Cadena con la versión
Nombre y descripción del
parámetro
Descripción del valor de
retorno
Nombre y descripción de la
excepción
Declara un elemento como
obsoleto
@return
@exception
@deprecated
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Se aplica a
Clase, método o variable
Clase
Clase
Método
Método
Método
Clase, método o variable
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos
Los tipos de datos en Java se dividen en dos categorı́as:
26 [26 - 40]
Los tipos primitivos representan valores sencillos que tienen
una funcionalidad incorporada en el lenguaje. Son elementos
ya definidos como constantes, literales y números.
Los tipos referencia (o tipos de clases) incluyen objetos y
arrays. Se denominan tipos de referencia por que se pasan
“por referencia” tal y como veremos.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos primitivos
Los elementos fundamentales en Java son números, caracteres
y valores booleanos.
A diferencia de otros lenguajes orientados a objetos, éstos no
son objetos. Para aquellas situaciones en las que es deseable
tratar en valor primitivo como un objeto, Java proporciona
clases “envolventes”1 .
Una de las ventajas de tratar con valores primitivos es que el
compilador está más preparado para optimizar su uso.
Otra carácterı́stica está relacionada con la portabilidad de
Java, los tipos primitivos están definidos con precisión. p.e: un
int tiene un tamaño de 32 bits en cualquier plataforma
1
En Java 1.5 el compilador hace automáticamente la conversión según el
uso que le vaya a dar (ej: se puede hacer 5+Integer(5))
27 [26 - 40]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos primitivos
Tipos de datos
28 [26 - 40]
Tipo
boolean
char
byte
short
int
long
float
double
Definición
true o false
Carácter Unicode de 16 bits
Entero de complemento 2 con signo de 8 bits
Entero de complemento 2 con signo de 16 bits
Entero de complemento 2 con signo de 32 bits
Entero de complemento 2 con signo de 64 bits
Valor en coma flotante 754 IEEE de 32 bits
Valor en coma flotante 754 IEEE de 64 bits
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos primitivos
Declaración e inicialización de variables
Las variables se declarán dentro de clases o métodos del siguiente
modo:
in t unEntero ;
double d1 , d2 ;
boolean t e r m i n a d o ;
Las variables se pueden inicializar en el momento de la declaración:
29 [26 - 40]
i n t u n E n t e r o =4;
double d1 =4.6 , d2 =2∗5+7;
boolean t e r m i n a d o=t r u e ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos primitivos
Declaración e inicialización de variables
30 [26 - 40]
Las variables de clase que no se inicialicen cogen valores por
defecto.
Los valores numéricos tienen por defecto cero, los carácteres
el carácter nulo (\0) y los booleanos false.
En cambio, las variables locales a los métodos, deben
inicializarse explı́citamente antes de ser usadas.
Los tipo primitivos, al utilizarse, se pasan por valor, es decir,
cuando se asigna un valor primitivo o se pasa como
argumento de un método, éste se copia.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos primitivos
Literales enteros
Los literales enteros pueden especificarse en octales, decimales o
hexadecimales (base 8, 10 o 16).
Decimales: números que comienzan por 1-9
31 [26 - 40]
i n t i =1234;
Octales: comienzan por un cero
i n t i =01230; // i = 644 en d e c i m a l
Hexadecimales: se representas comenzándolos por 0x,
siguiendo con los dı́gitos y carácteres de a-f o A-F, que
representan los valores decimales de 10-15:
i n t i =0xFFFFFF ; // i = 65535 en d e c i m a l
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos primitivos
Literales enteros
Los literales enteros son del tipo int salvo que lleven una L como
sufijo que indique que es un long:
long i =13L ;
long i =13; // e q u i v a l e n t e : 13 s e c o n v i e r t e
// de un t i p o i n t
Cuando se usa un tipo numérico en una expresión donde aparece
un tipo con rango superior, el tipo inicial se puede convertir al tipo
mayor (como en el ejemplo anterior). Algunas operaciones
numéricas y de comparación tambien crean estas conversiones.
32 [26 - 40]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos primitivos
Literales enteros
Un tipo numérico no puede ser asignado a un tipo inferior sin una
conversión explı́cita (cast):
int i = 13;
byte b = i ; // e r r o r de c o m p i l a c i o n ,
// s e n e c e s i t a
// una c o n v e r s i o n e x p l i c i t a
byte b = ( byte ) i ;
// OK
Las conversiones de coma flotante a enteros siempre necesitan
conversión debido a la potencial perdida de precisión.
33 [26 - 40]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos primitivos
Literales en coma flotante
Los valores en coma flotante pueden especificarse en notación
decimal o cientı́fica. Los literales en coma flotante son del tipo
double salvo que lleven una f o F como sujifo que indiquen que
son de tipo float:
34 [26 - 40]
double d
double e
float f
float g
=
=
=
=
8.31;
3 . 0 0 e +8;
8.31F ;
3 . 0 0 e+8F ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos primitivos
Literales carácter
El valor de un caracter literal puede definirse bien mediante un
carácter que esté encerado entre comillas sencillas o como una
sentencia de escape ASCII o Unicode:
35 [26 - 40]
char a = ’ a ’ ;
char n u e v a L i n e a = ’ \n ’ ;
char s m i l e y = ’ \ u263a ’ ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos referencia
36 [26 - 40]
En Java, al crear una clase se define un nuevo tipo en el
lenguaje.
Por ejemplo, si se crea un clase llamada Prueba, tambien se
crea de forma implı́cita un nuevo tipo llamado Prueba. Un
elemento del tipo Prueba, en general, puede ser asignado a
una variable del tipo Prueba o pasarse como argumento a un
método que acepte un valor Prueba.
Los tipos referencia se pasan por referencia. Lo que contiene
una variable de tipo referencia es una referencia a un objeto
de su tipo. Cuando se asigna o se pasa una referencia a un
método, ésta se pasa por valor.
Se puede pensar en una referencia como un tipo de puntero al
que se quita la refencia automáticamente siempre que se cita.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos referencia
Ejemplo
37 [26 - 40]
Cosa miCosa = new Cosa ( ) ;
Cosa o t r a C o s a = miCosa ;
miCosa es una variable de tipo Cosa a la que le asignamos en
objeto Cosa que acabamos de crear.
Luego asignamos esa referencia a la variable otraCosa.
Ahora tenemos dos referencias apuntado al mismo objeto. Los
cambios que se hagan en una de ellas se verán reflejados en la
otra.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos referencia
38 [26 - 40]
Los tipos referencia siempre apuntan a objetos y los objetos
siempre se definen por clases. Sin embargo, existen dos
excepciones: los arrays y las interfaces.
Los arrays tienen un lugar especial en el sistema de tipos. Son
tipos de objetos especiales que se crean automáticamente
para contener otro tipo de objetos, conocidos como tipo base.
Al declarar una referencia de tipo array se crea el nuevo tipo
de clase.
Las interfaces definen un conjunto de métodos y un tipo
correspondiente. Cualquier objeto que implemente todos los
métodos de la interfaz puede ser tratado como un objeto de
ese tipo. Los argumentos pueden ser declarados del tipo
interfaz.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos referencia
Notas acerca de los strings
39 [26 - 40]
Los strings en Java son objetos y por lo tanto un tipo
referencia.
Los objetos String sin embargo, tienen una ayuda especial
del compilador Java que hace que parezcan más bien como
del tipo primitivo.
En el código fuente, a los valores de las cadenas literales el
compilador los convierte en objetos String. Pueden usarse
directamente, pasarse como argumentos a métodos o
asignarse a variables de tipo String
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Tipos referencia
Notas acerca de los strings: Ejemplo
System . o u t . p r i n t l n ( ” Hola mundo ! ” ) ;
S t r i n g s = ” Hola ” ;
S t r i n g t = ” C a r l o s d i j o : \” Hola \” ” ;
El sı́mbolo + tiene más de una función (está sobrecargado) para
proporcionar la concatenación de strings y la suma de números.
Junto con +=, son los únicos operadores sobrecargados en Java.
S t r i n g t = ”En un l u g a r de l a ”+”Mancha” ;
S t r i n g t 2 = t + ” de cuyo nombre . . . ” ;
Java crea un único objeto String a partir de la concatenación de
strings y las ofrece como el resultado de la expresión.
40 [26 - 40]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Sentencias
41 [41 - 51]
Las sentencias aparecen dentro de métodos y clases.
Describen todas las actividades de un programa.
Las declaraciones de variables y asignaciones, como las de la
sección anterior, son sentencias que constituyen la estructura
básica del lenguaje, como las condiciones y los bucles.
Las sentencias y expresiones aparecen dentro de bloques de
código.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Sentencias
Bloques de código
Un bloque de código es, desde el punto de vista de la sintaxis, una
serie se sentencias dentro de unas llaves. Las sentencias dentro de
un bloque de código pueden contener declaraciones de variables:
42 [41 - 51]
{
i n t tam = 5 ;
setNombre ( ”KK” ) ;
...
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Sentencias
Bloques de código: Métodos
Los métodos, son en cierto sentido bloques de código que toman
parámetros y que pueden llamarse por su nombre:
setNombre ( S t r i n g nombre ) {
i n t tam =5;
setNombre ( nombre ) ;
}
El ámbito de las declaraciones de variables se encuentra limitado al
bloque se código que la encierra:
43 [41 - 51]
{
int i = 5;
}
i = 6 ; // E r r o r de c o m p i l a c i o n
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Sentencias
Bloques de código: Condicionales
El uso más común es definir un grupo de sentencias para su uso en
una sentencia condicional o iterativa.
Un condición se define como:
i f ( condicion ) {
sentencia1 ;
sentencia2 ;
...
} else {
sentencia3 ;
sentencia4 ;
....
}
condicion es una expresión booleana.
44 [41 - 51]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Sentencias
Bloques de código: Condicionales
Para generar blucles condicionales se usan las sentencias do y
while:
45 [41 - 51]
while ( c o n d i c i o n ) {
sentencia ;
sentencia ;
...
};
do {
sentencia ;
sentencia ;
...
} while ( c o n d i c i o n ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Sentencias
Bloques de código: For
Se pueden crear blucles for de la forma:
for ( i n i c i a l i z a c i o n ; condicion ; incremento )
sentencia ;
La expresión que inicializa una variable puede declarar una nueva
variable que será restringida al ámbito del bucle for:
46 [41 - 51]
f o r ( i n t i = 0 ; i < 1 0 0 ; i ++) {
System . o u t . p r i n t l n ( i ) ;
int j = i ;
...
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Sentencias
Bloques de código: for
Se pueden usar múltiples expresiones separadaspor coma en
secciones de inicialización y de incremento de un bucle for. Por
ejemplo:
47 [41 - 51]
f o r ( i n t i =0, j =10; i < j ; i ++, j −−) {
...
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Sentencias
Bloques de código: switch
La sentencia switch recibe un tipo entero y hace una selección
entre varias opciones case:
switch ( e x p r e s i o n e n t e r a ) {
case e x p r e s i o n e n t e r a :
sentencia ;
[ case e x p r e s i o n e n t e r a :
sentencia ;
...
default :
sentencia ; ]
}
default se usa para recoger las condiciones que no se cumplen.
48 [41 - 51]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Sentencias
Bloques de código: switch
Normalmente se usa la sentencia break para finalizar una
ramificación de switch:
switch ( v a l o r ){
case 1 :
...
break ;
case 2 :
...
break ;
}
Las sentencias break y continue se utilizan para realizar saltos
incondicionales fuera de un bucle o de una sentencia condicional.
49 [41 - 51]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Sentencias
Bloques de código: etiquetas
Las sentencias encerradas como bloques de código e iteradores
pueden ser etiquetados con una sentencia de identificación:
50 [41 - 51]
uno :
while ( condicion ) {
...
dos :
while ( condicion ) {
...
// r om pe r o c o n t i n u a r
}
// d e s p u e s de d o s
}
// d e s p u e s de uno
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Sentencias
Bloques de código: ejemplo
51 [41 - 51]
En este ejemplo, un break o un continue sin argumentos en
la posición indicada hubiera hecho que el proceso continuase
en el punto “después de dos” (break) o volviera a comprobar
la condición (continue).
Un break dos harı́a lo mismoque un break normal, pero un
break uno irı́a al punto “despues de uno”.
Análogamente, continue dos habrı́a hecho lo mismo que
continue, pero continue uno harı́a volver a la prueba del
bucle uno.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Expresiones
52 [52 - 63]
Las expresiones describen valores.
Una expresión se evalua para obtener un resultado que va a
ser usado como parte de otra expresión o en una sentencia.
Al evaluar una expresión se obtiene un resultado o valor. El
valor de una expresión puede ser de tipo numérico, como en
una operacion aritmética, de tipo referencia, como en la
ubicación de un objeto o un tipo especial void, que es el tipo
que se declara a un método que no devuelve ningun valor.
El tipo de una expresión se conoce en tiempo de compilación.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Operadores
53 [52 - 63]
Precedente
1
1
1
1
1
2
Operador
++,−
+,−
~
!
(type)
∗, /, %
Tipo
Aritmético
Aritmético
Integral
Boolean
Cualquiera
Aritmético
3
3
+,−
+
Aritmético
Cadena
4
4
<<
>>
Integral
Integral
4
>>>
Integral
5
5
>, <=, >, >=
instanceof
Aritmético
Objeto
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Descripción
Incrementa y decrementa.
Más y menos unarios.
Complemento bitwise.
Complemento lógico.
Cast.
Multiplicación, división,
resto de la división.
Adición y sustracción.
Concatenación de cadenas.
Cambia a la izquierda.
Cambio por la derecha con
la extensión del signo.
Cambio por la derecha sin
extensión.
Comparación numérica.
Comparación del tipo.
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Operadores
54 [52 - 63]
Precedente
6
Operador
==, !=
Tipo
Primitivo
6
==, !=
Objeto
7
7
8
8
9
9
10
11
12
&
&
^
^
|
|
&&
||
?:
Integral
Boolean
Integral
Boolean
Integral
Boolean
Boolean
Boolean
NA
13
13
=
Cualquiera
Cualquiera
∗ =, / =, %=, + =,
Descripción
Igualdad y desigualdad de
valor.
Igualdad y desigualdad de
referencia.
AND bitwise.
AND booleano.
XOR bitwise.
XOR booleano.
OR bitwise.
OR booleano.
AND condicional.
OR condicional.
Operador ternario condicional.
Asignación.
Asignación con operación.
− =, <<=, >>=,
>>>=, &=, ^=, | =
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Operadores: observaciones
55 [52 - 63]
Java no permite la manipulación directa del puntero, por lo
que no soporta operadores de referencia y dereferencia (que
tiene, por ejemplo, C). Tambien añade operadores como la
concatenación de cadenas.
La asignacion se puede usar como una valor por parte de otra
expresión:
j = ( i = 5);
La expresión null puede asignarse a cualquier tipo de
referencia. Tiene el significado de “sin referencia”. Una
referencia null no puede utilizarse para hacer referencia a
algo y su intento genera un NullPointerException durante
la ejecución.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Operadores: operador punto
56 [52 - 63]
El operador punto (.) tiene varios significados.
Puede recuperar el valor de un contenido (de algún objeto) o
de una variable static (de una clase).
También puede especificar un método para que sea invocado
en un objeto o clase.
El uso de punto (.) para acceder a una variable en un objeto
es una expresión que da como resultado el valor de la variable
a la que se accede. Ésta puede ser un tipo numérico o un tipo
referencia:
int i ;
String s ;
i = miObjeto . l e n g t h ;
s = m i O b j e t o . nombre ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Operadores: operador punto
Una expresión del tipo referencia puede usarse en evaluaciones
posteriores, seleccionando variables o llamando a métodos dentro
de ella:
57 [52 - 63]
i n t l e n = m i O b j e t o . nombre . l e n g t h ( ) ;
int i n i c i a l i z a c i o n =
m i O b j e t o . nombre . s u b s t r i n g ( 5 , 1 0 ) . l e n g t h ( ) ;
Aquı́ hemos consultado la longitud de la variable nombre
invocando el método length() del objeto String.
El segundo caso, se solicita una subcadena de la cadena
nombre y preguntamos su longitud.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Operadores: operador punto
Una llamada a un método es esencialmente una llamada a una
función: una expresión que da como resultado un valor. El tipo de
valor es el tipo que devuelve el método.
System . o u t . p r i n t l n ( ” Hola mundo ! ” ) ;
i n t long = miCadena . l e n g t h ( ) ;
La elección de que método se ejecuta es más complicada de lo que
parece porque Java permite la sobrecarga y la anulación de un
método (como veremos más adelante).
58 [52 - 63]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Operadores: operador punto
Al igual que el resultado de cualquier expresión, el resultado de una
invocación puede utilizarse en evaluaciones posteriores, como ya
vimos. Puede crear valiables intermedias para hacer más claro el
código. Por ejemplo:
int i n i c i a l i z a c i o n =
m i O b j e t o . nombre . s u b s t r i n g ( 5 , 1 0 ) . l e n g t h ( ) ;
es equivalente a:
59 [52 - 63]
S t r i n g temp1 = m i O b j e t o . nombre ;
S t r i n g temp2 = temp1 . s u b s t r i n g ( 5 , 1 0 ) ;
i n t i n i c i a l i z a c i o n = temp2 . l e n g t h ( ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Operadores: new
El operador new se usa para crear objetos:
O b j e c t o = new O b j e c t ( ) ;
El argumento para new es el constructor de la clase.
El constructor es un método que siempre tiene el mismo
nombre que la clase y especifica cuales son los parámetros
necesarios para construir la clase.
El valor de la expresión new es una referencia del tipo de
objeto creado.
Los objetos siempre tienen uno más constructores. Ya veremos
más adelante la creación de un objeto con detalle.
Podemos crear un objeto e invocar un método con el directamente:
60 [52 - 63]
i n t h o r a s = new Date ( ) . g e t H o u r s ( ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Operadores: instanceof
Para determinar el tipo de un objeto en tiempo de ejecución se usa
el operador instanceof. Este operador comprueba si un objeto es
de un tipo concreto y devuelve un boolean que indica si el objeto
es de una clase especificada:
Boolean b ;
S t r i n g s t r = ” cosa ” ;
b = ( s t r i n s t a n c e o f S t r i n g ) ; // t r u e
b = ( s t r i n s t a n c e o f O b j e c t ) ; // t r u e
b = ( s t r i n s t a n c e o f Date ) ;
// f a l s e
instanceof tambien informa correctamente si el objeto es del tipo
del array o de la interfaz especificada:
61 [52 - 63]
i f ( c o s a i n s t a n c e o f byte [ ] )
...
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Operadores: instanceof
El valor null no se considera un caso de ningun objeto, por
ejemplo:
String s = null ;
i f ( s instanceof String )
// nunca s e e v a l u a
nunca será cierto.
62 [52 - 63]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Operadores: operador condicional
Éste operador es equivalente a la sentencia if, su sintaxis es de la
forma:
condición?expresión:expresión
por ejemplo:
a == b ? X . f u n c i o n 1 ( ) : X . f u n c i o n 2 ( ) ;
es equivalente a:
63 [52 - 63]
i f ( a == b )
X. funcion1 ( ) ;
else
X. funcion2 ( ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
64 [64 - 80]
Las raices de Java se encuentrar en sistemas embebidos. En
estos tipos de aplicaciones, es especialmente importante que
los errores software sean tratados de forma consistente.
Java ofrece una solución elegante al manejo de errores con el
tratamiento de las excepciones.
Una excepción inicia una condición que no es habitual o una
condición de error.
El control del programa se transfiere incodicionalmente a una
sección de código donde se recoge y se trata.
No tenemos que tener valores de retorno especiales para los
métodos para indicar que hay un error, los errores los trata un
mecanismo distinto.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
65 [64 - 80]
El control puede pasar una gran distancia entre una rutina
muy anidada y ser tratada en una ubicación única cuando
ası́ se quiere; un error puede tratarse inmediatamente en su
fuente.
Java tiene un modo de indicar las excepciones que se pueden
lanzar. Esto significa que el compilador puede estar seguro de
que las tratamos.
De este modo, la información sobre los errores que puede dar
un método promueve al mismo nivel de importancia que sus
argumentos y tipos que devuelve.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Clases de excepciones y errores
66 [64 - 80]
Las excepciones en Java se representan por medio de
instancias de la clase java.lang.Exception y sus subclases.
Ejemplos: java.io.IOException para problemas normales
de E/S (como, por ejemplo, FileNotFoundException) y
problemas de red (como, por ejemplo, SocketException).
El API de Java tambien define subclases de
java.lang.Error para errores que son irrecuperables.
Estas subclases son menos comunes que las de Exception.
No hay que preocuparse por estos errores, normalmente
indican errores graves en los enlaces o en la máquina virtual y
suele hacer que el intérprete Java finalice y muestre un
mensaje de error.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Tratamiento de excepciones
Las sentencias de protección try/catch envuelven un trozo de
código y recogen los tipos de excepciones designados que se dan
dentro de él:
67 [64 - 80]
try {
readFromFile (” f i c h e r o ” ) ;
...
} catch ( E x c e p t i o n e ) {
// Manejar e l e r r o r
System . o u t . p r i n t l n ( ” E x c e p c i o n : ”+e ) ;
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Tratamiento de excepciones
68 [64 - 80]
Las excepciones que se dan dentro del cuerpo de la parte try
de la sentencia se dirigen a la cláusula catch para un posible
tratamiento.
La sentencia catch actúa como un método, especifica un
argumento del tipo de excepción que quiere tratar, y si es
invocado recibe el objeto Exception como un argumento.
En el ejemplo anterior, recibimos el objeto en la variable e y
se imprime junto con un mensaje.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Tratamiento de excepciones
Una sentencia try puede tener múltiples cláusulas catch que
especifican distintos tipos (subclases) de Exception:
69 [64 - 80]
try {
readFromFile (” f i c h e r o ” ) ;
...
} catch ( F i l e N o t F o u n d E x c e p t i o n e ) {
// A r c h i v o no e n c o n t r a d o
...
} catch ( I O E x c e p t i o n e ) {
// E r r o r de E/S
...
} catch ( E x c e p t i o n e ) {
// C u a l q u i e r o t r o e r r o r
...
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Tratamiento de excepciones
70 [64 - 80]
Las cláusulas catch se evalúan en orden y se toma la primera
que puede coincidir (es asignable).
Como mucho se ejecuta una cláusula catch, lo que significa
que las excepciones deberı́an listarse desde la más a la menos
especı́fica.
En el ejemplo anterior la tercera cláusula catch actúa como
la cláusula default en una sentencia switch y maneja todas
las excepciones no capturadas por los dos catch anteriores.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Tratamiento de excepciones
71 [64 - 80]
En Java se dividen las excepciones en dos categorı́as
excepciones comprobadas y excepciones sin comprobar.
La mayorı́a de las excepciones son comprobadas, lo que
significa que cualquier método que lanza una excepción, bien
porque la genera el mismo o bien porque la ignoró, debe
declarar que puede lanzar este tipo de excepción en una
cláusula throws al declarar el método.:
void r e a d F i l e ( S t r i n g s )
throws I O E x c e p t i o n ,
InterruptedException {
...
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Tratamiento de excepciones
72 [64 - 80]
La cláusula throws le dice al compilador que excepciones
puede lanzar el método y los métodos que llamen a éste
deben protegerse con bloque try/catch o declarando la
excepción con una cláusula throws.
Las excepciones que son subclases de
java.lang.RuntimeException o de la clase
java.lang.Error son excepciones que no se comprueban, es
decir, no es un error en tiempo de compilación no declararlas
en una cláusula throws o no encerrarlas en un bloque
try/catch.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Lanzar excepciones
Podemos lanzar nuestras propias excepciones mediante la sentencia
throw, por ejemplo:
throw new E x c e p t i o n ( ) ;
o
73 [64 - 80]
throw new E x c e p t i o n ( ”Hubo un e r r o r ” ) ;
Con la segunda forma del constructor podemos recoger el
mensaje usando el método getMessage().
Por convenio todos los tipos de Exception tienen un
constructor que recibe un String.
Podemos tener nuestra propia de jerarquı́a de excepciones
para tratar los errores especı́ficos de nuestra aplicación.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Propagación de excepciones
¿Que pasa si no recogemos una excepción?
Si no hay hay sentencias dentro del try/catch, la excepción
es lanzada desde el método en la que apareció hasta quien la
llamó.
Si este punto en el método que llamo está dentro de una
cláusula try, el control pasa a la correspondiente cláusula
catch.
Si no, la excepción sigue propagándose hasta la pila de la
llamada.
De este modo la excepción sube como una burbuja hasta que
es recogida o hasta que sale en la parte superior del programa,
terminando con un mensaje de error de tiempo de ejecución.
74 [64 - 80]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Propagación de excepciones: Ejemplo
Veamos un ejemplo de propagación de excepciones:
p u b l i c c l a s s Pr ue ba {
p u b l i c s t a t i c v o i d main ( S t r i n g
try {
metodo1 ( ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
}
[ ] args ) {
s t a t i c v o i d metodo1 ( ) t h r o w s E x c e p t i o n {
metodo2 ( ) ;
}
s t a t i c v o i d metodo2 ( ) t h r o w s E x c e p t i o n {
throw new E x c e p t i o n ( ” E r r o o o o o o o o o o o o o o o o o o o r ! ! ! ! ! ! ” ) ;
}
}
75 [64 - 80]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Propagación de excepciones
76 [64 - 80]
Como una excepción puede subir una distancia considerable
antes de que sea recogida y tratada; puede que necesitemos
un medio para determinar exactamente dónde se lanzó.
Todas las excepciones pueden volcar una pila de seguimiento
(trace stack) que lista su método de origen y todas las
llamadas a los métodos anidados, usando en método
printStackTrace():
try {
// Tarea
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( System . e r r ) ;
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Acerca del try
77 [64 - 80]
La sentencia try impone una condición en las sentencias que
guarda.
Si se produce una excepción en su interior las sentencias
restantes deberán ser abandonadas.
Esto tiene consecuencias importantes para la inicialización de
variables locales. Si el compilador no puede determinar si una
variable va a ser inicializada dentro de un bloque try/catch,
no nos dejará utilizar la variable:
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
Acerca del try
78 [64 - 80]
v o i d metodo ( ) {
int cosa ;
try {
cosa = cogerResultados ( ) ;
...
} catch ( E x c e p t i o n e ) {
...
}
i n t v a r = c o s a ; // E r r o r de c o m p i l a c i o n
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
La cláusula finally
79 [64 - 80]
Hay veces que queremos asegurarnos de que ciertas sentencias
se ejecuten, por ejemplo, para liberar recursos, cerrar ficheros
. . . que se utilizaron en una sentencia try.
Para eso se usa la cláusula finally, esta sentencia asegura
que lo que vaya dentro de ella se
ejecutará independientemente de que se lanze una excepción o
no.
Las cláusulas finally se ejecutan igualmente aunque se
ejecute un return, break o continue.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Excepciones
La cláusula finally
try {
// C o s a s
} catch ( Excepcion1 e ) {
...
} catch ( Exception2 e ) {
...
} finally {
// L i m p i a r
}
80 [64 - 80]
try {
// H a c e r c o s a s
...
return ;
} finally {
System . o u t . p r i n t l n ( ”me e j e c u t o i g u a l ” ) ;
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
81 [81 - 97]
Un array es un tipo de objeto especial que puede contener una
colección ordenada de elementos.
El tipo de los elementos del array se denomina tipo base del
array.
El número de elementos que contiene es un atributo fijo
llamado length.
Java soporta arrays de todos los tipos primitivos y referencias.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Para crear un array un array de una longitud especı́fica y acceder a
sus elementos utilizamos el operador ı́ndice []. Los objetos array
se diferencian del resto de los objetos Java en tres cosas:
82 [81 - 97]
Java crea de forma implı́cita una clase especial de arrays para
nosotros, siempre que declaremos una variable del tipo array.
Java nos permite utilizar el operador especial [] para acceder
a los elementos de un array, por lo que los arrays tienen el
aspecto que se espera.
Java proporciona una forma especial del operador new que nos
permite crear una instacia de un array y especificar su
longitud con la notación []
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Tipos de arrays
Una variable del tipo array se representa con un tipo base seguido
por corchetes vacı́os [], aunque tambien es válido poner los
corchetes antes del nombre del array. Por ejemplo, estas dos
declaraciones son equivalentes:
int [ ] arrayEnteros ;
int arrayEnteros [ ] ;
En estas declaraciones no dimos el tamaño del array, sólo estamos
declarando la variable de tipo array. El tamaño lo daremos al crear
el array.
Podemos crear un array de objetos con la misma sintaxis:
83 [81 - 97]
String [ ] strings ;
Cosa c o s a s [ ] ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Creación e inicialización de arrays
El operador new se usa para crear una instancia de un array. Tras
el operador new se especificará el tipo base del array o su longitud
con una expresión entera encerrada entre corchetes:
a r r a y E n t e r o s = new i n t [ 2 0 ] ;
s t r i n g s = new S t r i n g [ numero + 2 ] ;
Se puede crear e inicializar un array a la vez:
84 [81 - 97]
double [ ] numeros = new double [ 1 2 ] ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Creación e inicialización de arrays
Los indices comienzan en cero. Tras la creación los valores del
array se inicializan a valores por defecto que dependen del tipo de
los elementos:
85 [81 - 97]
i n t [ ] numeros = i n t [ 1 0 ] ;
numeros [ 0 ] = 4 ;
numeros [ 1 ] = 7 ;
// numeros [ 2 ] == 0
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Creación e inicialización de arrays
Los elementos de un array de objetos son referencias a los objetos.
Su valor por defecto es null hasta que asignemos instancias de
objetos:
86 [81 - 97]
S t r i n g nombres [ ] = new S t r i n g [ 4 ] ;
nombres [ 0 ] = new S t r i n g ( ) ;
nombres [ 1 ] = ” C a r l o s ” ;
nombres [ 2 ] = c u a l q u i e r O b j e t o . g e t S t r i n g ( ) ;
// nombres [ 3 ] == n u l l
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Creación e inicialización de arrays
En Java se puede crear un array e inicializar sus elementos usando
la construcción {}:
i n t [ ] p r i m o s = { 1 , 2 , 3 , 5 , 5+2};
Ası́ se crea un objeto de tipo y longitud adecuada de forma
implı́cita y los valores de la lista de expresiones separadas por coma
se asignan a sus elementos.
87 [81 - 97]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Creación e inicialización de arrays
Podemos usar la sintaxis {} con una array de objetos. En ese caso
cada una de las expresiones se debe evaluar a un objeto:
String verbos =
{” c o r r e r ” , ” s a l t a r ” , p a l a b r a . t o S t r i n g ( ) } ;
O b j e c t [ ] o b j e t o s = {new Button ( ”OK” ) ,
” una p a l a b r a ” , n u l l } ;
Es equivalente:
88 [81 - 97]
Button [ ] t r e s B o t o n e s = new Button [ 3 ] ;
Button [ ] t r e s B o t o n e s = { n u l l , n u l l , n u l l } ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Uso de arrays
El tamaño de un array se encuentra en la variable pública length:
char [ ] a l f a b e t o = new char [ 2 6 ] ;
i n t a l f L o n g = a l f a b e t o . l e n g t h ; // a l f L o n g == 2 6 ;
S t r i n g numeros [ ] = {” uno ” , ” d o s ” , ” t r e s ” } ;
i n t num = numeros . l e n g t h ; //num == 3
length es el único campo accesible del array. Es una variable, no
un método.
89 [81 - 97]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Uso de arrays
90 [81 - 97]
Para acceder a los elementos de un array se usa el operador
[] con una expresión que evalue a un entero.
El uso de este operador puede lanzar la excepción
ArrayIndexOutOfBoundsException si se intenta acceder a
una posición más allá de la longitud del array.
Este es un tipo de RuntimeException por lo tanto puede ser
ignorado si se quiere:
S t r i n g c a d e n a s [ ] = new S t r i n g [ 4 ] ;
try {
c a d e n a s [ 0 ] = ” kk ” ;
c a d e n a s [ 4 ] = ” c o s a ” ; // E r r o r
} catch ( ArrayIndexOutOfBoundsException ex ) {
System . o u t . p r i n t l n ( ” E r r o r : ”+e x . g e t M e s s a g e ( ) ) ;
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Uso de arrays
Una tarea común es la de copiar un rango de elementos de dos
arrays. Para eso en Java se proporcciona el método arraycopy()
de la clase utilidad System:
System . a r r a y c o p y ( o r i g e n , i n i c i o O r i g e n ,
destino , inicioDestino ,
longitud );
El ejemplo siguiente duplicará el tamaño del array nombres:
91 [81 - 97]
S t r i n g [ ] tmp = new S t r i n g [ 2 ∗ nombres . l e n g t h ] ;
System . a r r a y c o p y ( nombres , 0 , tmp ,
0 , nombres . l e n g t h ) ;
nombres = tmp ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Arrays anónimos
Java permite la creación de arrays anónimos. Por ejemplo:
s u m a E n t e r o s ( new i n t [ ] { 1 , 2 , 3 } ) ;
La sintaxis se parece a la inicialización de variables, pero como no
estamos declarando una variable tenemos que usar explı́citamente
el operador new para crear el objeto de tipo array.
92 [81 - 97]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Arrays multidimensionales
Java soporta arrays multidimensionales con el formato de arrays de
objetos del tipo array. Se usan múltiples corchetes, uno para cada
dimensión. Tambien se usa esta sintaxis para acceder a los
elementos de las distintas dimensiones. Por ejemplo:
PiezaAjedrez [ ] [ ] tablero ;
t a b l e r o = new P i e z a A j e d r e z [ 8 ] [ 8 ] ;
t a b l e r o [ 0 ] [ 0 ] = new P i e z a A j e d r e z ( ” T o r r e ” ) ;
t a b l e r o [ 1 ] [ 0 ] = new P i e z a A j e d r e z ( ” A l f i l ” ) ;
Se pueden crear arrays con más de dos dimensiones, por ejemplo:
93 [81 - 97]
C o l o r [ ] [ ] [ ] cuboRGB = new C o l o r [ 2 5 6 ] [ 2 5 6 ] [ 2 5 6 ] ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Arrays multidimensionales
Se puede especificar el ı́ndice inicial de un array multidimensional
para obtener un objeto de tipo array con menos dimensiones.
PiezaAjedrez [ ] f i l a I n i c i a l = {
new P i e z a A j e d r e z ( ” T o r r e ” ) , new P i e z a A j e d r e z ( ” C a b a l l o ” ) ,
new P i e z a A j e d r e z ( ” A l f i l ” ) , new P i e z a A j e d r e z ( ” Rey ” ) ,
new P i e z a A j e d r e z ( ” R e i n a ” ) , new P i e z a A j e d r e z ( ” A l f i l ” ) ,
new P i e z a A j e d r e z ( ” C a b a l l o ” ) , new P i e z a A j e d r e z ( ” T o r r e ” )
};
tablero [0] = f i l a I n i c i a l ;
La variable tablero pertenece al tipo PiezaAjedrez[][]. La
expresión tablero[0] es válida y se refiere al primer elemento de
tablero que es de tipo PiezaAjedrez[].
94 [81 - 97]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Arrays multidimensionales
95 [81 - 97]
No es necesario especificar los tamaños de todas las
dimensiones de un array multidimensional con una única
operación new.
La sintaxis del operador permite dejar los tamaños de algunas
dimensiones sin especificar.
Hay que especificar por lo menos la menor dimensión (la
dimension más significativa del array).
Las dimensiones restantes se podrán asignar más adelante los
valores del tipo array apropiados.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Arrays multidimensionales: Ejemplo
Creamos un tablero de ajedrez de valores booleanos:
boolean [ ] [ ] t a b l e r o ;
t a b l e r o = new boolean [ 8 ] [ ] ;
Se dejan vacı́os los ocho objetos de tipo boolean[] del nivel
siguiente. Ası́, por ejemplo, tablero[0] es null hasta que se le
asigne un array:
t a b l e r o [ 0 ] = new boolean [ 8 ] ;
...
t a b l e r o [ 7 ] = new boolean [ 8 ] ;
El código de los dos ejemplos anteriores es equivalente a:
96 [81 - 97]
boolean [ ] [ ]
t a b l e r o = new boolean [ 8 ] [ 8 ] ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays
Arrays
Arrays multidimensionales
Hay que observar que como la longitud no forma parte del tipo, las
dimensiones no tienen porque tener todas la misma longitud. Es
decir, los arrays multidimensionales no tienen porque ser
rectangulares, por ejemplo:
t a b l e r o [ 2 ] = new boolean [ 3 ] ;
t a b l e r o [ 3 ] = new boolean [ 1 0 ] ;
Por ejemplo, podemos crear un array triangular;
97 [81 - 97]
i n t [ ] [ ] t r i a n g u l o = new i n t [ 5 ] [ ] ;
f o r ( i n t i =0; i < t r i a n g u l o . l e n g t h ; i ++) {
t r i a n g u l o [ i ] = new i n t [ i + 1 ] ;
f o r ( i n t j =0; j <i +1; j ++) {
t r i a n g u l o [ i ] [ j ] = i+j ;
}
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Índice
3
98 [98 - 99]
Objetos en java
Clases
Creación de objetos
Destrucción de objetos
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
99 [98 - 99]
Los objetos son los ”actores” principales del paradigma
orientado a objetos
Un objeto procede de una clase que es una especificación de
los campos y los métodos que el objeto puede ejecutar.
Cada objeto presenta al exterior una vista concisa y
consistente en función de la clase a la que pertenece y no
proporciona detalles del interior de la misma.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Clases
100 [100 - 112]
En el mundo real existen muchos objetos de la misma clase.
Por ejemplo, hay muchos coches en el mundo.
Usando la terminologı́a orientada a objetos, se dice que un
objeto coche es una instancia de una clase de objetos
conocida como coche.
Los coches tienen todos un estado común (velocidad, numero
de puertas, modelo. . . ) y un comportamiento (acelerar, frenar
girar . . . ).
Sin embargo, cada estado de un coche es independiente y
puede ser diferente de otros coches.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Clases
Podemos ver una clase como una plantilla o modelo que se utiliza
para crear objetos concretos.
Consta de variables denominadas campos junto con métodos
que operan sobre esos campos.
Encapsula los componentes pasivos (campos) y componentes
activos (métodos) en una única entidad.
Una vez se declara una clase, se debe instanciar, es decir,
crear un objeto de ella, antes de que se pueda utilizar.
Cuando se crea una instancia de una clase, se crea un objeto
de ese tipo y el sistema asigna memoria para las variables
declaradas por la clase.
A continuación se puede invocar a los métodos del objeto.
101 [100 - 112]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Clases
En java una clase se declara utilizando la palabra clave class. Los
métodos y variables aparecen dentro de los corchetes de
declaración de la clase, por ejemplo:
102 [100 - 112]
c l a s s MiClase {
int var1 ;
Object var2 ;
...
v o i d metodo1 ( f l o a t n ) { . . . }
S t r i n g metodo2 ( ) { . . . }
...
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Clases
Ahora podemos crear un objeto de la clase MiClase:
MiClase c ;
c = new M i C l a s e ( ) ;
Una vez tenemos el objeto podemos acceder a sus variables y
métodos:
103 [100 - 112]
c . var1 = 8;
c . metodo1 ( 5 . 7 ) ;
S t r i n g s = c . metodo2 ( ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Variables
104 [100 - 112]
Una clase puede definir dos tipos de variables: variables de
contenido y variables static.
Cada objeto tiene su propio juego de variables de contenido y
los valores que tienen esas variables pueden ser diferentes en
cada objeto de esa clase.
En cambio las variables static ”viven” en la clase y son
compartidas por todas las instancias.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Variables: Ejemplo
c l a s s MiClase {
...
static float var3 = 4 . 0 ;
...
}
Ahora todos los objetos de la clase MiClase tendrán como valor
para var3 4.0 y si el valor se modifica desde uno de ellos queda
modificado para todos. Como los miembros static existen en la
misma clase tambiem podemos acceder a ellos empleando
directamente la clase:
105 [100 - 112]
MiClase . var3 = 8;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Variables
Las variables static se pueden declarar final para que no
puedan ser modificadas, de este modo pueden ser utilizadas a
modo de constantes.
106 [100 - 112]
c l a s s Cons {
s t a t i c f i n a l f l o a t PI = 3 . 1 4 ;
s t a t i c f i n a l f l o a t G= 9 . 8 0 ;
...
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Métodos
Al igual que las variables, los métodos pueden ser métodos de
contenido o métodos static.
Los métodos static pertenecen a la clase al igual que las
variables static, éstos sólo pueden acceder a variables static de
la clase, porque no están asociados a ninguna instancia
concreta de la clase:
c l a s s MyClase {
s t a t i c i n t var1 = 4;
f l o a t var2 ;
}
107 [100 - 112]
s t a t i c v o i d metodo1 ( ) {
System . o u t . p r i n t l n ( ” v a r 1 =” +v a r 1 ) ;
System . o u t . p r i n t l n ( ” v a r 2 =” +v a r 2 ) ; // E r r o r de
// c o m p i l a c i o n
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Métodos
108 [100 - 112]
Las variables declaradas dentro de los métodos son locales al
método, es decir, no se pueden referenciar desde fuera del
método en el que están declaradas.
Las variables locales se inicializan cuando se llama el método
y se destruyen cuando el método termina.
Los objetos creados dentro del método pueden ser destruidos
o no cuando el método finaliza, pueden no ser destruidos si
todavı́a quedan referencias al objeto creado (por ejemplo, si se
pasa como parámetro a otro método). El objeto será destruido
por el recolector de basura cuando no queden más referencias
a él.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Métodos: Ocultación de variables
Si una variable local y una de contenido tienen el mismo nombre,
la variable local oculta el nombre de la variable de contenido
dentro del ámbito de método:
c l a s s Pajaro {
i n t xPos , yPos ;
i n t xNext , yNe xt ;
...
double flyToNext () {
i n t xPos=x N e s t ;
i n t yPos=yN e xt ;
r e t u r n ( f l y ( xPos , yPos ) ;
}
}
En este ejemplo (un poco forzado) las variables xPos e yPos son
ocultadas en el método flyToNext().
109 [100 - 112]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Métodos: Ocultación de variables
Si se quiere hacer referencia a variables de contenido ocultas se
puede usar la referecia this. Esta referencia es una referencia al
objeto actual. Por ejemplo:
class Pajaro {
i n t xPos , yPos ;
double f l y ( i n t xPos , i n t yPos ) {
double d i s t = Math . s q r t ( xPos ∗ xPos+yPos ∗ yPos ) ;
t h i s . xPos=xPos ;
t h i s . yPos=yPos ;
return d i s t ;
}
}
110 [100 - 112]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Sobrecarga de métodos
La sobrecarga es la capacidad de definir múltiples métodos con el
mismo nombre en una clase. Al invocar el método el compilador
selecciona el correcto dependiendo de los argumentos que se le
hayan pasado al método. Por ejemplo:
c l a s s Habla {
s t a t i c String habla ( Perro p) {
r e t u r n ” guau ” ;
}
s t a t i c S t r i n g h a b l a ( Gato g ) {
r e t u r n ” miau ” ;
}
s t a t i c String habla ( Pajaro p) {
return ” pio pio ” ;
}
}
111 [100 - 112]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Sobrecarga de métodos
Ahora podemos llamar al método habla con distintos tipos de
objetos:
Habla . h a b l a ( new P e r r o ( ) ) ; // d e v u e l v e ” guau ”
Habla . h a b l a ( new Gato ( ) ) ;
// d e v u e l v e ” miau ”
Habla . h a b l a ( new P a j a r o ( ) ) ; // d e v u e l v e ” p i o p i o ”
Aún no vimos la herencia de clases, pero anticiparemos que si un
tipo ”encaja”en más de un método, se ejecutará el que reciba el
tipo más especı́fico.
112 [100 - 112]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Creación de objetos
113 [113 - 120]
Para crear un objeto se usa el operador new junto con un
constructor.
Los constructores son métodos especiales que tienen el mismo
nombre que la clase y no devuelven ningun valor.
Al igual que los otros métodos pueden recibir parámetros y ser
sobrecargados, pero no se heredan (la herencia la veremos
más adelante).
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Creación de objetos: Ejemplo
c l a s s Persona {
i n t edad ;
Persona () {
edad = 1 8 ;
}
P e r s o n a ( i n t edad ) {
t h i s . edad = edad ;
}
}
114 [113 - 120]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Creación de objetos
115 [113 - 120]
Si no se declara ningún constructor Java crea un constructor
por defecto sin argumentos.
Un constructor puede invocar a otro constructor sobrecargado
usando la referencia this() con los argumentos necesarios
para llamar al constructor deseado.
Si hace una llamada a this() debe ser la primera del
constructor que la realiza.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Creación e objetos: Ejemplo
c l a s s Persona {
String calle ;
i n t edad ;
Persona () {
t h i s ( ”” , 1 8 ) ;
}
Persona ( S t r i n g c , i n t e ) {
calle = c;
edad = e ;
}
Persona ( i n t e ) {
S t r i n g c = ” mi c a l l e ” ; // E r r o r de
this (c , e );
// c o m p i l a c i o n
}
}
116 [113 - 120]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Creación de objetos
Ni siquiera se puede acceder a las variables de contenido antes de
llamar a this() aunque sean final:
c l a s s Persona {
f i n a l i n t edad = 1 8 ;
...
Persona ( S t r i n g c ) {
t h i s ( c , edad ) ; // E r r o r
}
}
117 [113 - 120]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Creación de objetos
Si queremos hacer esto podemos declarar la variable como static
puesto que las secciones static se inicializan cuando se carga la
clase por primera vez (antes de que se ejecute el constructor)
c l a s s Persona {
s t a t i c f i n a l i n t EDAD = 1 8 ;
...
Persona ( S t r i n g c ) {
t h i s ( c , EDAD ) ; // S i n e r r o r
}
}
118 [113 - 120]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Creación de objetos
Se pueden declarar bloques de código en la clase que no
pertenecen a ningun método, estas secciones se indican entre llaves
y se evaluan al mismo tiempo que la evaluación de las variables de
contenido (despues de la ejecución de constructor). Se pueden
usar, por ejemplo, para inicializar valores en variables:
c l a s s Cosa {
H a s h t a b l e numeros = new H a s h t a b l e ( ) ;
{
numeros . p u t ( new I n t e g e r ( 1 ) , ”Uno” ) ;
numeros . p u t ( new I n t e g e r ( 2 ) , ”Dos” ) ;
...
}
...
}
119 [113 - 120]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Creación de objetos
Estos bloques de código pueden ser clarados como static, en ese
caso sólo se puede hacer referencia a variables static:
c l a s s Cosa {
s t a t i c H a s h t a b l e numeros = new H a s h t a b l e ( ) ;
static {
numeros . p u t ( new I n t e g e r ( 1 ) , ”Uno” ) ;
numeros . p u t ( new I n t e g e r ( 2 ) , ”Dos” ) ;
...
}
...
}
120 [113 - 120]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Destrucción de objetos
121 [121 - 122]
Java se encarga de la destrucción de objetos, no tenemos que
preocuparnos por ella.Para ello usa una técnica conocida
como recolección de basura.
Lo que hace es observar las referencias que tiene un objeto,
cuando un objeto ya no tiene referencias a él en la máquina
virtual, Java destruye el objeto y libera la memoria que éste
ocupaba.
Podemos forzar la recolección de basura invocando el método
System.gc()
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Clases
Creación de objetos
Destrucción de objetos
Objetos
Destrucción de objetos
122 [121 - 122]
Antes de que la recolección de basura borre un objeto, se
llama a su método finalize() para que pueda realizar
acciones para liberar recursos como por ejemplo cierre de
ficheros o cerrar conexiones de red.
Es interesante observar que la finalización se produce antes
que la recolección: los objetos ejecutan su método
finalize() y luego son liberados, si un objeto crea una
referencia a si mismo en el método finalize() no
será recogido.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Índice
4
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
123 [123 - 123]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
124 [124 - 144]
En Java las clases pueden formar jerarquı́as.
Una clase se puede declarar como subclase de otra usando la
palabra clave extends.
Una subclase hereda todas las variables y métodos de su
superclase y las usa como si hubieran sido declaradas dentro
de la propia subclase:
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
c l a s s Animal {
i n t peso ;
...
v o i d come ( ) { . . . }
...
}
c l a s s Perro extends Animal {
int raza ;
// h e r e d a p e s o
void ladra () { . . . }
// h e r e d a come
}
Ahora podemos crear una instancia de Perro e invocar los
métodos definidos en su superclase Animal:
125 [124 - 144]
P e r r o p = new P e r r o ( ) ;
p. ladra ();
p . come ( ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
126 [124 - 144]
Sólo se permite heredar de una única clase, esto es herencia
única.
No se heredan los miembros de la superclase que hayan sido
declarados como private.
Una subclase siempre tiene el mismo conjunto de miembros
visibles que su ascendente, por eso las subclases pueden usarse
en todos los sitios donde se puede usar la superclase:
P e r r o p = new P e r r o ( ) ;
Animal a = p ;
Por medio del mecanismo de la herencia se pueden anular
variables y métodos de la superclase, el comportamiento es
distinto si se trata de variables o de métodos.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Anulación de variables
127 [124 - 144]
Si redefinimos una variable en una subclase, cuando nos
refiramos a ella trataremos con la variable redefinida.
Depende del contexto en el que nos refiramos, es decir, se
hará uso de la variable redefinida en la subclase y en las
subclases de la subclase.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Anulación de variables
public c l a s s Anulacion {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
B b = new B ( ) ;
b . imprimeVarA ( ) ; // v a r = 2
b . imprimeVarB ( ) ; // v a r = 4
}}
class A {
int var = 2;
p u b l i c v o i d imprimeVarA ( ) {
System . o u t . p r i n t l n ( ” metodo A v a r=”+v a r ) ;
}}
c l a s s B extends A {
int var = 4;
p u b l i c v o i d imprimeVarB ( ) {
System . o u t . p r i n t l n ( ” metodo B v a r=”+v a r ) ;
}}
128 [124 - 144]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Anulación de variables
El resultado de este programa es:
$ java Anulacion
metodo A var=2
metodo B var=4
Al anular variables, se les puede cambiar el tipo.
129 [124 - 144]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Anulación de métodos
130 [124 - 144]
Se pueden anular métodos de la superclase declarando un
método con igual firma, es decir con el mismo número de
argumentos y tipos y en el mismo orden.
Además deberá declarar una clausula throws con la mismas
excepciones que puede lanzar el método que se anula o con
subclases de las mismas.
Cuando se anula un método la nueva versión es invocada
siempre en cualquier contexto, lo veremos mejor con un
ejemplo:
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Anulación de métodos
class A {
int var = 2;
p u b l i c v o i d imprimeVarA ( ) {
System . o u t . p r i n t l n ( ” metodo A v a r=”+v a r ) ;
}
}
c l a s s B extends A {
int var = 4;
p u b l i c v o i d imprimeVarA ( ) {
System . o u t . p r i n t l n ( ” metodo A v a r=”+v a r ) ;
}
p u b l i c v o i d imprimeVarB ( ) {
System . o u t . p r i n t l n ( ” metodo B v a r=”+v a r ) ;
}
}
131 [124 - 144]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Anulación de métodos
public class Anulacion {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
B b = new B ( ) ;
b . imprimeVarA ( ) ; // v a r = 4
b . imprimeVarB ( ) ; // v a r = 4
A a = b;
a . imprimeVarA ( ) ; // v a r = 4 ;
A a2 = new A ( ) ;
a2 . imprimeVarA ( ) ; // v a r = 2
}
}
132 [124 - 144]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Anulación de métodos
En ese ejemplo además vemos el acceso a una variable anulada.
133 [124 - 144]
Al crear un objeto de la clase B, esta redefine la variable var
y el método imprimeVarA().
Cuando se llama al método anulado, como el contexto en el
que se ejecuta es en el de al clase B accede a la versión de var
que tiene la clase B.
Esto es ası́ aunque estemos trabajando desde la clase A
(superclase de B). En cambio, si creamos una instancia de A
se accede a la versión de var que tiene esa clase.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Anulación de métodos
134 [124 - 144]
Podemos evitar la anulación de un método declarándolo como
final, el intento de anulación de un método final da lugar
a un error de compilación.
Si queremos hacer referencia a método anulado de la
superclase podemos usar la referencia especial super.
Al hacer esto se accede a la implementación que usa la
superclase no el de la subclase.
Podemos usar esto para extender el comportamiento de un
método.
Tambien se puede usar super para acceder a variables.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Anulación de métodos
class A {
int var = 2;
p u b l i c void imprimeVar ( ) {
System . o u t . p r i n t l n ( ” v a r=”+v a r ) ;
}
}
c l a s s B extends A {
int var = 4;
p u b l i c void imprimeVar ( ) {
System . o u t . p r i n t l n ( ” v a r=”+v a r ) ;
super . imprimeVar ( ) ;
}
}
135 [124 - 144]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Casting
136 [124 - 144]
Con un cast se le dice al compilador que cambie el tipo de la
referencia a un objeto.
Los cast no cambian el tipo del objeto, sólo cambian la noción
que tiene el compilador del objeto apuntado por una
referencia.
Animal a n i m a l = . . .
Perro perro = . . .
animal = perro ;
perro = ( Perro ) animal ;
p e r r o = a n i m a l ; // E r r o r , t i p o i n c o m p a t i b l e
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Casting
137 [124 - 144]
En el ejemplo, asignamos una variable de tipo Perro a una de
tipo Animal esto es legal, como vimos anteriormente, porque
Perro es una subclase de Animal.
Para asignar la referencia en animal a perro tenemos que
realizar el cast apropiado. Esto se llama hacer un downcast.
Cuando hacemos un downcast hay que estar seguros de que lo
hacemos a la clase correcta, si el objeto no pertenece a la
clase a la que tratamos de hacer el downcast se lanza la
excepción ClassCastException.
Siempre que asignamos una referencia a una clase a una
referencia a una de sus superclases se está produciendo un
cast de forma automática y no es necesario especificarlo.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Contructores de superclase
138 [124 - 144]
Con la sentencia super() se puede invocar al constructor de
una superclase.
Java ya introduce automáticamente una llamada al
constructor sin argumentos de la superclase si no le decimos
nada, pero si queremos que se ejecute un constructor con
argumentos hay que especificar cual.
La llamada a super(), al igual que con this(), debe ser la
primera en el constructor:
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Contructores de superclase
c l a s s Animal {
...
A n i m a l ( S t r i n g nombre ) {
// I n i c i a l i z a c i o n de v a l o r e s
...
}
}
c l a s s Perro extends Animal {
...
P e r r o ( S t r i n g nombre , S t r i n g dueno ) {
s u p e r ( nombre ) ;
// mas v a l o r e s
...
}
}
139 [124 - 144]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Constructores de superclase
140 [124 - 144]
Es el ejemplo se usa super() para aprovechar la
implementación del constructor de la superclase.
Además en este ejemplo concreto es obligado hacerlo porque
la superclase no tiene un constructor sin argumentos.
El contructor sin argumentos es el que llama automáticamente
Java, y el compilador habria protestado si no hacemos la
llamada correcta a super().
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Constructores de superclase: Reglas
Las regla que se aplica para inicializar las variables de contenido y
hacer las llamadas a los constructores depende de la primera
sentencia del constructor:
1
Si es una sentencia ordinaria, Java inserta una llamada
implı́cita a super(), inicializa las variables de contenido de
clase actual y luego continua con la ejecución de las
sentencias del constructor actual.
2
Si es una llamada a un constructor de una superclase por
medio de super(), se invoca al constructor de la superclase.
Al volver de esta llamada, inicializa las variables de contenido
de clase actual y luego continua con la ejecución de las
sentencias del constructor actual.
141 [124 - 144]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Constructores de superclase: Reglas
3
Si es una llamada a un constructor sobrecargado por medio de
this(), se invoca al constructor seleccionado. Al volver de
esta llamada, continua con la ejecución de las sentencias del
constructor actual.
En la última regla, la llamada al constructor de la superclase se
produjo con el constructor sobrecargado, bien implı́cita o
explı́citamente, con cual la inicialización de variables ya se ha
producido.
142 [124 - 144]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Métodos y clases abstract
143 [124 - 144]
Un método Java se puede declarar con el modificador
abstract indicando que es un protoripo.
Este tipo de métodos no tienen cuerpo y solo se declara la
cabecera seguida de punto y coma.
Una clase que contenga un método abstract debe ser
declarada como abstract y no puede ser instanciada.
Para ello hay que crear una subclase que anule los métodos
abstract proporcionándoles una implementación.
Si una subclase no anula todos los métodos abstract debe
ser declarada como abstract también.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Herencia
Metodos y clases abstract
a b s t r a c t c l a s s Animal {
...
abstract void s a l t a ( ) ;
}
c l a s s P e r r o extends Animal
...
void s a l t a ( ) { . . . }
}
La clase abstracta Animal declara un método abstracto salta(),
que cada animal debe implementar. Ahora no podemos crear
animales si no son una subclase de Animal:
144 [124 - 144]
Animal a = new Animal ( ) ; // E r r o r
Animal a = new P e r r o ( ) ; // OK
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Interfaces
145 [145 - 150]
Las interfaces son parecidas a clases abstractas con todos los
métodos abstractos, solo que declarar interfaces tiene sus
ventajas como veremos a continuación.
Una interfaz define un conjunto de métodos que deben ser
implementadas por una clase.
Los tipos de interfaz actúan como tipos de clase, se pueden
declarar variables del tipo de una interfaz, los métodos pueden
devolver tipos interfaz. . .
Las interfaces son una declaración de méritos, realmente son
como un contrato que la clase se compromete a cumplir.
Una clase puede decir que implementa tantas interfaces como
quiera. De esta manera se pueden resolver algunos casos en
los que necesita la herencia múltiple.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Interfaces
Ejemplo
public interface Adiestrable {
public void s a l t a ( ) ;
p u b l i c v o i d ven ( ) ;
public void c o g e l o ( ) ;
}
p u b l i c c l a s s P e r r o extends Animal
implements A d i e s t r a b l e {
...
public void s a l t a ( ) { . . . }
p u b l i c v o i d ven ( ) { . . . }
public void c o g e l o ( ) { . . . }
}
}
146 [145 - 150]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Interfaces
Ejemplo
La clase Perro es una subclase de Animal y el mismo tiempo
implementa la interfaz Adiestrable.
Ahora podemos declarar variables de tipo Adiestrable y
asignarlas a cualquier instancia de un objeto Adiestrable:
A d i e s t r a b l e a = new P e r r o ( ) ;
a . cogelo ( ) ;
147 [145 - 150]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Interfaces
148 [145 - 150]
Una declaración de una interfaz puede contener variables
static final para ser usadas como constantes.
Además se permite la declaración de interfaces vacı́as, es
decir, que no contienen la especificación de ningún método o
variable. En este caso se usan como marcadores.
Finalmente, las interfaces pueden formar jerarquı́as igual que
las clases usando el mecanismo de la herencia. Una clase que
implemente una interfaz que extienda a otra interfaz debe
implementar todos los métodos de la interfaz y de todos sus
ancestros.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Interfaces
Ejemplo de jerarquı́a
public interface InterfazA {
p u b l i c v o i d metodoA ( ) ;
}
public interface InterfazB {
p u b l i c v o i d metodoB ( ) ;
}
p u b l i c i n t e r f a c e I n t e r f a z C extends I n t e r f a z A {
p u b l i c v o i d metodoC ( ) ;
}
p u b l i c c l a s s Cosa implements I n t e r f a z B , I n t e r f a z C {
p u b l i c v o i d metodoA ( ) { }
p u b l i c v o i d metodoB ( ) { }
p u b l i c v o i d metodoC ( ) { }
}
149 [145 - 150]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Interfaces
Ejemplo de jerarquı́a
150 [145 - 150]
La clase Cosa implementa las interfaces InterfazB e
InterfazC.
Esta última hereda de la interfaz InterfazA.
La clase debe implementar los métodos que especifican todas
las interfaces del ejemplo.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Paquetes
Un paquete es un nombre para un grupo de clases e interfaces
relacionadas, además crean un nivel de alcance para sus clases
y las variables y métodos que están dentro de ellas.
Para declarar que una clase pertenece a un paquete concreto
se utiliza la sentencia package, esta sentencia debe ser la
primera en el fichero y no puede aparecer más de una:
package a n i m a l e s ;
c l a s s Animal {
...
}
151 [151 - 153]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Paquetes
152 [151 - 153]
En el ejemplo declaramos la clase Animal como perteneciente
al paquete animales.
Ahora para referirse a ella desde otra clase que no pertenece
al paquete hay usar la notación nombre paquete.nombre clase.
Los nombres de paquete están formados por nombres
separados por puntos.
Esto no implica una jerarquı́a dentro de los paquetes, es decir,
las clases del paquete animales.mamiferos.perros no
pertenecen al paquete animales.mamiferos
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Paquetes
Si no queremos estar anteponiendo el nombre del paquete al de la
clase todo el tiempo podemos utilizar la sentencia import que
indica al compilador cual es el paquete al que pertenece la clase:
i m p o r t a n i m a l e s . A ni ma l ;
c l a s s Zoo {
....
void blabla () {
A n i m a l a = new A n i m a l ( ) ;
..
}
}
Se pueden importar todas las clases de un paquete usando * al
final del nombre del paquete:
import animales . ∗ ;
153 [151 - 153]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Visibilidad
Visibilidad de clases
Por defecto una clase sólo es accesible para otras clases dentro de
su propio paquete. Para que sea visible en cualquier parte hay que
declararla como public:
154 [154 - 157]
package a n i m a l e s ;
p u b l i c c l a s s A n i ma l { . . . }
Sólo puede exitir un clase pública por fichero y el nombre de
la clase pública debe ser igual al nombre del fichero.
Al hacer publicas sólo algunas clases de un paquete
proporcionamos a los usuarios del paquete una interfaz bien
definida para su uso, ocultando partes internas del mismo.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Visibilidad
Visibilidad de variables y métodos
155 [154 - 157]
Las variables y métodos de una clase, por defecto, son
accesibles desde la propia clase y desde el resto de clases del
mismo paquete. Este es el nivel por defecto de visibilidad.
El modificador private hace que los miembros declarados
como tal sean visibles únicamente desde la propia clase.
Los miembros declarados como public pueden verse desde
cualquier clase en cualquier paquete, siempre que la clase
pueda verse.
El modificador protected proporciona permisos parciales
para subclases. Los miembros protected, además de la
visibilidad por defecto, son visibles para las subclases de la
clase, aunque estén definidas fuera del paquete de la clase.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Visibilidad
Visibilidad de variables y métodos
Modificador
private
(ninguno)
protected
public
Visibilidad
Ninguna
Clases en el paquete
Clases en el paquete y en las subclases dentro o fuera del paquete
Todas las clases
Cuadro: Modificadores de visibilidad
Debemos tener en cuenta que cuando se anulan métodos en una
subclase, el método de anulación debe ser al memos tan visible
como el método anulado. Por ejemplo, podemos anular un método
private con un método public, pero no al revés.
156 [154 - 157]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Visibilidad
Visibilidad de interfaces
157 [154 - 157]
Las interfaces se comportan como clases dentro de los
paquetes. Pueden ser declaradas como public para hacerlas
visibles fuera del paquete.
Bajo la visibilidad por defecto sólo son visibles dentro del
paquete.
Sólo puede haber una interfaz pública por fichero.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
En Java se puede declarar una clase dentro de cualquier juego de
llaves y su visibilidad se limita de igual modo que una variable o un
método. Por ejemplo:
c l a s s Animal {
class Cerebro {
...
}
}
158 [158 - 171]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
La clase Cerebro es una clase interna de Animal. Ahora añadimos
un método a la clase Animal:
p u b l i c c l a s s Animal {
S t r i n g nombre ;
c l a s s Cerebro {
public void piensa () { . . . }
}
public void realizaComportamiento () { . . .
C e r e b r o c = new C e r e b r o ( ) ;
c . piensa ();
...
}
}
Tanto la clase Cerebro como realizaComportamiento() están
dentro del ámbito de Animal. Por lo tanto en cualquier parte
dentro de Animal podemos hacer referencia a Cerebro y a
realizaComportamiento() por nombre.
159 [158 - 171]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
160 [158 - 171]
Dentro del cuerpo de Cerebro tenemos acceso directo al
resto de métodos y variables de clase Animal.
Desde el interior del método realizaComportamiento() se
podrı́a trabajar con la clase Cerebro y crear instancias de
Cerebro.
El código dentro de la clase Cerebro puede invocar al método
realizaComportamiento() de Animal.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
Un uso particular importante para las clases internas es la de crear
clases adaptadoras. Una clase adaptador es una clase ”de ayuda”
que relaciona una clase con otra de una forma especı́fica. Por
ejemplo, si tenemos un objeto ListaEmpleados:
public class ListaEmpleados {
p r i v a t e Empleado [ ] e m p l e a d o s = . . . ;
...
}
161 [158 - 171]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
Nos gustarı́a que esta clase nos proporcionara sus elementos por
medio de un iterador, que es una interfaz sencilla para listar
objetos. La interfaz java.util.Iterator tiene varios métodos
como:
public interface I t e r a t o r {
p u b l i c boolean h a s N e x t ( ) ;
public Object next ( ) ;
p u b l i c v o i d remove ( ) ;
}
Esto nos permite ver los elementos preguntando por el siguiente y
preguntando si queda alguno más.
162 [158 - 171]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
Para crear un iterador podemos usar una clase interna:
public c l a s s ListaEmpleados {
p r i v a t e Empleado [ ] e m p l e a d o s = . . . ;
...
c l a s s I t e r a d o r implements j a v a . u t i l . I t e r a t o r {
i n t elemento = 0;
p u b l i c boolean hasNext ( ) {
r e t u r n e l e m e n t o<e m p l a d o s . l e n g t h ;
}
p u b li c Object next () {
i f ( hasNext ( ) ) {
r e t u r n e m p l e a d o s [ e l e m e n t o ++];
} else {
throw new R u n t i m e E x c e p t i o n ( ”No hay mas e l e m e n t o s ” ) ;
}
}
p u b l i c v o i d remove ( ) {
throw new U n s u p p o r t e d O p e r a t i o n E x c e p t i o n ( ) ;
}
}
...
}
163 [158 - 171]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
164 [158 - 171]
Al estar dentro de la clase ListaEmpleados, la clase
Iterador tiene acceso a la lista de miembros privada, por lo
que puede acceder directamente al array empleados.
Podemos introducir un método para obtener el iterador:
public class ListaEmpleados {
...
I t e r a t o r getIterator () {
r e t u r n new I t e r a d o r ( ) ;
}
...
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
Clases internas dentro de métodos
Las clases internas tambien pueden declararse dentro de métodos:
c l a s s Animal {
void realizaComportamiento ( ) {
class Cerebro {
...
}
}
}
En este caso, el cuerpo de Cerebro puede ver todo lo que se
encuentra en el ámbito del método incluidos los miembros de
Animal.
165 [158 - 171]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
Clases internas dentro de métodos
Esto tiene limitaciones:
Los métodos tienen una vida limitada, cuando terminan sus
variables locales desaparecen, pero una instancia de Cerebro
vivirá mientras queden referencias ella.
Por ello Java debe estar seguro de que cualquier variable local
utilizada por las instancias de Cerebro dentro de la
invocación del método debe estar viva.
Todas las instancias de Cerebro creadas dentro de una
invocación al método deben ver las mismas variables locales.
Para poder hacer esto el compilador ha de ser capaz de crear
copias de las variables locales.
Por lo tanto las variables locales de métodos a las que se ha
hecho referencia por la clase interna deben ser final.
166 [158 - 171]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
Ocultación de variables
167 [158 - 171]
Las clases internas pueden ocultar variables de las clases que
las contienen.
Para acceder a las variables ocultas se puede usar la referencia
this.
Lo que pasa es que la clase interna tiene ahora más de una
referencia this (la suya y la clase que la contiene).
Se puede especificar la referencia a la que se refiere
anteponiendo el nombre de la clase.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
Ocultación de variables: Ejemplo
class Cerebro {
Animal miAnimal = Animal . t h i s ;
}
Tambien podemos hacer referencia a las variables de la clase del
mismo modo:
c l a s s Animal {
int s i z e = 10;
class Cerebro {
int size = 2;
i n t a n i m a l S i z e = Animal . t h i s . s i z e ;
}
}
168 [158 - 171]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
Clases internas anónimas
169 [158 - 171]
Las clases internas anónimas son una extensión del operador
new.
Tras el operador new se especifica el nombre de una clase o de
una interfaz seguido del cuerpo de una clase.
El cuerpo se convierte en una clase interna.
Por ejemplo, en el ejemplo de la lista de empleados podemos
suprimir la declaración de la clase Iterador haciendo:
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
Clases internas anónimas: Ejemplo
public c l a s s ListaEmpleados {
p r i v a t e Empleado [ ] e m p l e a d o s ;
...
I t e r a t o r getIterator () {
r e t u r n new j a v a . u t i l . I t e r a t o r ( ) {
i n t elemento = 0;
}
170 [158 - 171]
p u b l i c boolean hasNext ( ) {
r e t u r n e l e m e n t o<e m p l a d o s . l e n g t h ;
}
p u b l i c Object next () {
i f ( hasNext ( ) ) {
r e t u r n e m p l e a d o s [ e l e m e n t o ++];
} else {
throw new R u n t i m e E x c e p t i o n ( ”No hay mas e l e m e n t o s ” ) ;
}
}
p u b l i c v o i d remove ( ) {
throw new U n s u p p o r t e d O p e r a t i o n E x c e p t i o n ( ) ;
}
}
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Introducción
Sintaxis
Objetos en java
Relaciones entre clases
Herencia
Interfaces
Paquetes
Visibilidad
Clases internas
Clases internas
Clases internas anónimas: Ejemplo
Tambien podemos usarlo para anular métodos o variables:
p u b l i c c l a s s Prueba {
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) {
A n i m a l a1 = new A n i m a l ( ) ;
h a z H a b l a r ( a1 ) ;
A n i m a l a2 = new A n i m a l ( ) {
public void habla () {
System . o u t . p r i n t l n ( ” o t r a c o s a ” ) ;
}
};
h a z H a b l a r ( a2 ) ;
}
s t a t i c v o i d hazHablar ( Animal a ) {
a . habla ( ) ;
}
}
c l a s s Animal {
public void habla () {
System . o u t . p r i n t l n ( ” h o l a ! ” ) ;
}
}
171 [158 - 171]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
172 [172 - 172]
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Parte II
Usos del lenguaje
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Índice
5
Threads
Introducción
Sincronización
173 [173 - 173]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
174 [174 - 191]
Conceptualmente un thread es un flujo de control dentro de
un programa.
Un thread es parecido a un proceso, excepto por el hecho de
que múltiples threads dentro de la misma aplicación
comparten muchas cosas, como por ejemplo, ejecutarse en el
mismo espacio de direcciones.
Compartir el mismo espacio de direcciones significa que los
threads comparten las variables de contenido pero no las
variables locales.
Los múltiples threads de una aplicación deben sincronizarse.
No puede haber varios threads intentando acceder a las
mismas variables sin nigún tipo de coordinación.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Composición
Al usar threads siempre hay dos actores principales:
Uno representa al thread
El otro contiene el método que el thread va a ejecutar.
A veces, es posible combinarlos, pero ésto no cambia la relación.
175 [174 - 191]
Un thread nace cuando creamos una instancia de la clase
java.lang.Thread.
El objeto Thread representa un thread real del intérprete Java
y sirve como gestor que controla y sincroniza su ejecución.
Con él podemos comenzar el thread, detenerlo o cancelarlo de
forma temporal.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
176 [174 - 191]
El contructor de la clase Thread recibe información sobre
dónde debe comenzar la ejecución del thread.
Para indicar qué debe ejecutar el thread existe la interfaz
java.lang.Runnable.
Esta interfaz define el método run() que es el que invocará el
thread al ser iniciado:
public i n t e r f a c e Runnable {
public void run ( ) ;
}
Cada thread comienza su vida con la ejecución del método
run() en el objeto Runnable (el ”objeto destino”) que se
pasó al thread.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
177 [174 - 191]
Un Thread recién creado permanece inactivo hasta que
llamanos al método start().
Entoces el thread despierta y ejecuta el método run() de su
objeto destino.
Sólo se puede llamar a start() una vez en la vida de un
Thread.
El thread se sigue ejecutando hasta que que vuelve el método
run() del objeto destino.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Ejemplo
c l a s s A n i m ac i o n implements R u n n a b l e {
...
public void run ( ) {
while ( true ) {
// d i b u j a
...
}
}
}
Esta clase podrı́a ser la encargada de dibujar una animación en una
interfaz. Para usarlo:
A n i m a c i o n anim = new A n i m a c i o n ( ) ;
Thread t = new Thread ( anim ) ;
t . start ();
178 [174 - 191]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Ejemplo
Si no se quiere que esta responsabilidad la lleve a cabo un objeto
externo, puede ser realizado desde la propia clase que implementa
la interfaz Runnable:
c l a s s A n i m a c i on implements R u n n a b l e {
Thread t h r e a d ;
...
public void i n i c i a A n i m a c i o n ( ) {
t h r e a d = new Thread ( t h i s ) ;
thread . s t a r t ( ) ;
}
}
179 [174 - 191]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Ejemplo
public cla ss Corredor {
p r i v a t e S t r i n g nombre ;
p u b l i c C o r r e d o r ( S t r i n g nombre ) {
t h i s . nombre = nombre ;
}
public void corre ( int n) {
f o r ( i n t i =0; i <n ; i ++) {
System . o u t . p r i n t l n ( ” ”+nombre+” : ”+i ) ;
// S i m u l a una o p e r a c i o n c o s t o s a de d u r a c i o n
// v a r i a b l e
try {
i n t t = ( i n t ) ( Math . random ( ) ∗ 1 0 0 ) ;
Thread . s l e e p ( t ) ;
} c a t c h ( E x c e p t i o n e ) {}
}
System . o u t . p r i n t l n ( ” ”+nombre+” : T e r m i n e e e e ! ! ! ” ) ;
}
}
180 [174 - 191]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Ejemplo
public class Carrera {
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) {
Corredor corredor1 , corredor2 ;
c o r r e d o r 1 = new C o r r e d o r ( ”A” ) ;
c o r r e d o r 2 = new C o r r e d o r ( ”B” ) ;
corredor1 . corre (10);
corredor2 . corre (10);
}
}
¿Que sucede?
Primero se ejecuta uno y despúes el otro. Vamos a añadir
concurrencia para que sea una carrera de verdad.
181 [174 - 191]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Ejemplo: Añadiendo concurrencia
c l a s s Corredor2 implements Runnable {
...
p u b l i c void run ( ) {
corre (10);
}
}
public class Carrera2 {
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) {
Thread c o r r e d o r 1 , c o r r e d o r 2 ;
c o r r e d o r 1 = new Thread ( new C o r r e d o r 2 ( ”A” ) ) ;
c o r r e d o r 2 = new Thread ( new C o r r e d o r 2 ( ”B” ) ) ;
corredor1 . start ();
corredor2 . start ();
}
}
182 [174 - 191]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Recordamos
183 [174 - 191]
La interfaz Runnable permite crear un objeto arbitrario de
destino de un thread.
Éste es el uso general más importante de la clase Thread.
En la mayorı́a de los casos en los que se tiene que usar threads
se creará una clase que implemente la interfaz Runnable.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Otro modo
Hay una segunda forma de crear threads, podemos hacer una
subclase de Thread, por ejemplo:
c l a s s A n i m ac i o n extends Thread {
...
public void run ( ) {
while ( true ) {
// d i b u j a
...
}
}
}
La clase Thread, si se usa el constructor por defecto ejecuta su
propio método run() cuando llamamos a start().
184 [174 - 191]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Otro modo
Para usar la nueva clase Animacion y llamamos a su método
start():
185 [174 - 191]
Anim a c i o n a n i m a c i o n = new A n i m a c i on ( ) ;
animacion . s t a r t ( ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Control de un Thread
Los threads se inician con el método start(). Otros métodos de
contenido nos permiten ejecutar de forma explı́cita la ejecución de
un Thread:
186 [174 - 191]
El método sleep() hace que el thread actual espere el
tiempo establecido, sin consumir mucho tiempo de la CPU.
El método interrupt() despierta a un thread que
está durmiendo o que se encuentra bloqueado en una
operación de E/S.
Los métodos wait() y join() coordinan la ejecución de dos
o más threads.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Control de un Thread
187 [174 - 191]
A menudo necesitamos decirle a un thread que permanezca
inactivo durante un tiempo.
Para ello llamamos al método sleep() o invocar a
Thread.sleep().
En cualquiera de los dos métodos, la llamada hará que el
thread actualmente en ejecución se retrase el número
especificado de milisegundos:
try {
Thread . s l e e p ( 1 0 0 ) ;
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {
// Se d e s p e r t o p r e m a t u r a m e n t e
}
sleep() lanza la excepción InterruptedException si es
interrumpido por otro thread usando interrupt().
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Control de un Thread
188 [174 - 191]
Si se tienen que coordinar las actividades de dos threads de
manera que uno tiene que esperar a un termine para poder
continuar se puede usar el método join().
join() hace que hace que quien llame se bloquee hasta que
el thread objetivo muere.
Esta es una forma muy simple de sincronización, más adelante
veremos otros mecanismos.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Control de un Thread
public class Carrera {
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) {
Thread c o r r e d o r 1 , c o r r e d o r 2 ;
c o r r e d o r 1 = new Thread ( new C o r r e d o r ( ”A” ) ) ;
c o r r e d o r 2 = new Thread ( new C o r r e d o r ( ”B” ) ) ;
corredor1 . start ();
try {
corredor1 . join ();
} catch ( E x c e p t i o n e ) {}
corredor2 . start ();
}
}
189 [174 - 191]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Vida de un Thread
Hay que tener cuidado con como terminan los threads:
Un thread puede vivir incluso después de que la parte de la
aplicación que la habı́a creado haya terminado.
El interprete Java se sigue ejecutando hasta que todos los
threads se hayan terminado.
Pueden quedar threads huerfanos que se continuen ejecutando
una vez que la aplicación se finalice.
Podemos marcar ciertos threads para que sean eliminados
cuando sólo queden ellos, esto se hace con el método
setDaemon().
Cuando los threads demonio son los únicos que quedan en la
máquina virtual, éstos son eliminados.
190 [174 - 191]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Introducción
Control de un Thread
public class Carrera {
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) {
Thread c o r r e d o r 1 , c o r r e d o r 2 ;
c o r r e d o r 1 = new Thread ( new C o r r e d o r ( ”A” ) ) ;
c o r r e d o r 2 = new Thread ( new C o r r e d o r ( ”B” ) ) ;
c o r r e d o r 1 . setDaemon ( t r u e ) ;
c o r r e d o r 2 . setDaemon ( t r u e ) ;
corredor1 . start ();
corredor2 . start ();
}
}
191 [174 - 191]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
192 [192 - 204]
Cada thread tiene una vida propia.
Los thread pueden repartirse en en tiempo, lo que significa
que pueden ejecutarse en un momento dado y anularse según
indique el sistema operativo.
Java proporciona estructuras sencillas para la sincronización
de las actividades de los threads.
La sincronización se basa en el concepto de monitores que son
básicamente cerrojos.
Para acceder a un recurso compartido un thread tiene que
obtener el cerrojo.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Acceso en serie a métodos
193 [192 - 204]
La necesidad más normal de sincronización es serializar el
acceso a un objeto o una variable.
Cada objeto tiene un cierre asociado.
Para marcar lugares donde un thread tiene que adquirir el
cierre antes de continuar se usa la palabra clave
synchronized
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Acceso en serie a métodos: Ejemplo
Imaginemos que tenemos un sintetizador de voz. No nos interesa
que múltiples threads traten de hacerlo funcionar a la vez:
public class SintetizadorVoz {
public void d i ( S t r i n g f r a s e ) {
char p [ ] = f r a s e . t o C h a r A r r a y ( ) ;
f o r ( i n t i =0; i <p . l e n g t h ; i ++) {
System . o u t . p r i n t ( p [ i ] ) ;
try {
Thread . s l e e p ( 1 0 0 ) ;
} catch ( E x c e p t i o n e ) {}
}
System . o u t . p r i n t l n ( ) ;
}
}
194 [192 - 204]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Acceso en serie a métodos: Ejemplo
public class Sincronizacion {
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) {
S i n t e t i z a d o r V o z s = new S i n t e t i z a d o r V o z ( ) ;
di ( s , ” hola a todos ” ) ;
d i ( s , ”HOLA A TODOS” ) ;
}
s t a t i c void di ( f i n a l SintetizadorVoz s ,
final String frase ) {
( new Thread ( new R u n n a b l e ( ) {
p u b l i c void run ( ) {
s . di ( frase );
}
})). start ();
}
}
La salida es la siguiente: hHoOlLaA aA tToOdDoOsS
195 [192 - 204]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Acceso en serie a métodos: Ejemplo
Esto no es lo que queremos. Marcamos el método como
synchronized:
class SintetizadorVoz {
...
synchronized public void d i ( S t r i n g f r a s e ) {
...
}
}
La salida es la siguiente:
hola a todos
HOLA A TODOS
196 [192 - 204]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Acceso en serie a métodos: Ejemplo
¿Que pasa si ponemos esto en la clase principal?
S i n t e t i z a d o r V o z s = new S i n t e t i z a d o r V o z ( ) ;
S i n t e t i z a d o r V o z s 2 = new S i n t e t i z a d o r V o z ( ) ;
di ( s , ” hola a todos ” ) ;
d i ( s2 , ”HOLA A TODOS” ) ;
197 [192 - 204]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Acceso en serie a métodos: Ejemplo
198 [192 - 204]
Vuelven a mezclarse
El motivo es que el cierre está en el objeto
Se soluciona haciendo el método di(String frase) estático
con lo que el cierre pasa a la clase
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Si se pone más de un método synchronized, sólo se ejecuta
uno de ellos a la vez.
Esto es debido a que todos tienen el mismo cierre.
Con esto mantenemos la consistencia en los resultados
Ejemplo:
199 [192 - 204]
int a , b ;
s y n c h r o n i z e d i n t sum ( ) { r e t u r n a+b ; }
synchronized void s e t ( i n t a , i n t b ) {
this . a = a ;
this . b = b ;
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Bloques de código
La palabra clave synchronized se puede usar para serializar
el acceso a bloques de código arbitrarios.
Se usa la forma:
synchronized ( miObjeto ) {
...
}
El objeto pasado es el que contiene el cierre que hay que
obtener para acceder al bloque
Segun esto, hacer:
s y n c h r o n i z e d v o i d metodo ( ) { . . . }
es equivalente a:
200 [192 - 204]
v o i d metodo ( ) { s y n c h r o n i z e d ( t h i s ) { . . . } }
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Métodos wait() y notify()
201 [192 - 204]
Con wait() y notify(), un thread puede abandonar su
contenido en un cerrojo en un punto arbitrario y esperar hasta
que otro thread se lo devuelva para continuar.
Toda actividad coordinada todavı́a sucede dentro de los
bloques sincronizados y sólo se ejecuta un thread a la vez.
Al ejecutar wait() desde un bloque sincronizado, un thread
libera su cerrojo y se va a dormir.
Cuando otro thread ejecute notify() sobre el mismo cerrojo,
el primero se despertará e intentará adquirir el nuevo cierre.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Métodos wait() y notify(): Ejemplo
p u b l i c c l a s s C o n s u m i d o r e x t e n d s Thread {
Productor productor ;
S t r i n g nombre ;
Consumidor ( S t r i n g n , Pr o duc t o r p ) {
nombre = n ;
productor = p ;
}
p u b l i c void run ( ) {
try {
while ( true ) {
S t r i n g mensaje = productor . getMensaje ( ) ;
System . o u t . p r i n t l n ( nombre+ ” o b t i e n e m e n s a j e : ”+m e n s a j e ) ;
sleep (2000);
}
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {
}
}
}
202 [192 - 204]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Métodos wait() y notify(): Ejemplo
import j a v a . u t i l . Vector ;
p u b l i c c l a s s P r o d u c t o r e x t e n d s Thread {
s t a t i c f i n a l i n t LONG COLA = 5 ;
p r i v a t e V e c t o r m e n s a j e s = new V e c t o r ( ) ;
p u b l i c void run ( ) {
try {
while ( true ) {
generaMensaje ( ) ;
sleep (1000);
}
} c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) {}
}
p r i v a t e synchronized void generaMensaje ( ) throws I n t e r r u p t e d E x c e p t i o n {
w h i l e ( m e n s a j e s . s i z e ( ) == LONG COLA)
wait ( ) ;
m e n s a j e s . a d d E l e m e n t ( new j a v a . u t i l . Date ( ) . t o S t r i n g ( ) ) ;
notifyAll ();
}
p u b l i c synchronized S t r i n g getMensaje ( ) throws I n t e r r u p t e d E x c e p t i o n {
notify ();
w h i l e ( m e n s a j e s . s i z e ( ) == 0 ) w a i t ( ) ;
S t r i n g mensaje = ( S t r i n g ) mensajes . f i r s t E l e m e n t ( ) ;
mensajes . removeElement ( mensaje ) ;
retur n mensaje ;
}
}
203 [192 - 204]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Introducción
Sincronización
Sincronización
Métodos wait() y notify(): Ejemplo
En la clase principal:
204 [192 - 204]
P r o d u c t o r p = new P r o d u c t o r ( ) ;
p. start ();
new C o n s u m i d o r ( ”Uno : ” , p ) . s t a r t ( ) ;
new C o n s u m i d o r ( ” Dos : ” , p ) . s t a r t ( ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Índice
6
Entrada/Salida
E/S Estándar
Ficheros
205 [205 - 206]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
206 [205 - 206]
La E/S de Java está basada en secuencias
Una secuencia representa una corriente de datos o un canal de
comunicaciones con un lector a un lado y un escritor al otro.
Las secuencias son caminos unidireccionales. Si se quieren
comunicaciones bidireccionales hay que usar dos secuencias,
una para cada sentido.
Las clases abstractas InputStream y OutputStream definen
las secuencias de bytes.
Las clases abstractas Reader y Writer definen las secuencias
de caracteres (Unicode).
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Primer ejemplo
207 [207 - 208]
El ejemplo más basico es la entrada y la salida estándar
Son accesibles desde la clase System accediendo a los campos
in y out
System.in implementa stdin como una instancia de la clase
InputStream. Con System.in, se accede a los métodos read() y
skip(). El método read() permite leer un byte de la entrada.
skip( long n ), salta n bytes de la entrada.
System.out implementa stdout como una instancia de la clase
PrintStream. Se pueden utilizar los métodos print() y println()
con cualquier tipo básico Java como argumento.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Primer ejemplo
import j a v a . i o . ∗ ;
p u b l i c c l a s s Ejemplo {
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] )
throws IOException {
int c ;
int contador = 0;
w h i l e ( ( c = System . i n . r e a d ( ) ) != −1 ) {
c o n t a d o r ++;
System . o u t . p r i n t ( ( c h a r ) c ) ;
}
System . o u t . p r i n t l n ( ) ;
// L i n e a en b l a n c o
System . e r r . p r i n t l n ( ” C o n t a d o s ”+ c o n t a d o r +” b y t e s . ” ) ;
}
}
208 [207 - 208]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Ficheros
209 [209 - 218]
El acceso básico se hace a través de la clase File.
Para crear un objeto File nuevo, se puede utilizar cualquiera
de los tres constructores siguientes:
F i l e miFichero ;
m i F i c h e r o = new F i l e ( ” / e t c / kk ” ) ;
m i F i c h e r o = new F i l e ( ” / e t c ” , ” kk ” ) ;
F i l e m i D i r e c t o r i o = new F i l e ( ”/ e t c ” ) ;
m i F i c h e r o = new F i l e ( m i D i r e c t o r i o , ” kk ” ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Ficheros: Ejemplo
import j a v a . i o . ∗ ;
class InfoFichero {
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) t h r o w s I O E x c e p t i o n {
i f ( args . length > 0 ) {
f o r ( i n t i =0; i < a r g s . l e n g t h ; i++ ) {
F i l e f = new F i l e ( a r g s [ i ] ) ;
System . o u t . p r i n t l n ( ”Nombre : ”+f . getName ( ) ) ;
System . o u t . p r i n t l n ( ” Camino : ”+f . g e t P a t h ( ) ) ;
i f ( f . e x i s t s () ) {
System . o u t . p r i n t ( ” F i c h e r o e x i s t e n t e ” ) ;
System . o u t . p r i n t ( ( f . canRead ( ) ?
” , s e pue de L e e r ” : ” ” ) ) ;
System . o u t . p r i n t ( ( f . c a n W r i t e ( ) ?
” , se puese E s c r i b i r ” : ”” ) ) ;
System . o u t . p r i n t l n ( ” . ” ) ;
System . o u t . p r i n t l n ( ” La l o n g i t u d d e l f i c h e r o s o n ”+
f . l e n g t h ()+ ” b y t e s ” ) ;
} else
System . o u t . p r i n t l n ( ” E l f i c h e r o no e x i s t e . ” ) ;
}
} else
System . o u t . p r i n t l n ( ” Debe i n d i c a r un f i c h e r o . ” ) ;
}
}
210 [209 - 218]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Ficheros: Lectura
211 [209 - 218]
Para leer de un fichero usamos una subclase de InputStream:
FileInputStream
Para abrir un FileInputStream sobre un fichero, se le da al
constructor un String o un objeto File:
F i l e I n p u t S t r e a m mi F i c h e r o S t ;
m i F i c h e r o S t = new F i l e I n p u t S t r e a m ( ” / e t c / kk ” ) ;
También se puede utilizar:
F i l e miFichero FileInputStream miFicheroSt ;
m i F i c h e r o = new F i l e ( ”/ e t c / kk ” ) ;
m i F i c h e r o S t = new F i l e I n p u t S t r e a m ( m i F i c h e r o ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Ficheros: Lectura
import j a v a . i o . ∗ ;
public class VerFichero {
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) {
i f ( args . length > 0 ) {
try {
int c ;
F i l e I n p u t S t r e a m f i s = new F i l e I n p u t S t r e a m ( a r g s [ 0 ] ) ;
w h i l e ( ( c= f i s . r e a d ())!= −1) {
System . o u t . p r i n t ( ( c h a r ) c ) ;
}
} catch ( FileNotFoundException e ) {
System . o u t . p r i n t l n ( ” E l f i c h e r o no e x i s t e . ” ) ;
return ;
} catch ( IOException e ) {
System . o u t . p r i n t l n ( ” E r r o r de E/S . ” ) ;
}
} else
System . o u t . p r i n t l n ( ” Debe i n d i c a r un f i c h e r o . ” ) ;
}
}
212 [209 - 218]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Ficheros: Escritura
213 [209 - 218]
Para escribir un fichero usamos una subclase de
OutputStream: FileOutputStream
Para abrir un FileOutputStream sobre un fichero, se le da al
constructor un String o un objeto File:
FileOutputStream miFicheroSt ;
m i F i c h e r o S t = new F i l e O u t p u t S t r e a m ( ” / e t c / kk ” ) ;
También se puede utilizar:
F i l e miFichero FileOutputStream miFicheroSt ;
m i F i c h e r o = new F i l e ( ”/ e t c / kk ” ) ;
m i F i c h e r o S t = new F i l e O u t p u t S t r e a m ( m i F i c h e r o ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Ficheros: Escritura
import j a v a . i o . ∗ ;
public class Salida {
s t a t i c FileOutputStream fos ;
public s t a t i c f i n a l int longLinea = 81;
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) t h r o w s I O E x c e p t i o n {
b y t e d a t o s [ ] = new b y t e [ l o n g L i n e a ] ;
f o s = new F i l e O u t p u t S t r e a m ( ” d a t o s . d a t ” ) ;
while ( true ) {
System . e r r . p r i n t ( ” T e c l e a a l g o : ” ) ;
leeLinea ( datos ) ;
f o r ( i n t i =0; d a t o s [ i ] != 0 ; i++ )
fos . write ( datos [ i ] ) ;
f o s . w r i t e ( ’ \n ’ ) ;
}
}
p r i v a t e s t a t i c void l e e L i n e a ( byte l i n e a [ ] ) throws IOException {
int b = 0 , i = 0;
w h i l e ( ( i < ( l o n g L i n e a −1) ) &&
( ( b = System . i n . r e a d ( ) ) != ’ \n ’ ) )
l i n e a [ i ++] = ( b y t e ) b ;
l i n e a [ i ] = ( byte ) 0 ;
}
}
214 [209 - 218]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Ficheros
215 [209 - 218]
Al usar un FileInputStream estamos leyendo bytes, en el
código anterior podemos utilizar en su lugar un FileReader,
que al hededar de Reader trabaja directamente con
caracteres.
Idem para FileOutputStream y Writer
Para muchas de las subclases de InputStream y
OutputStream están definidas las subclases equivalentes de
Reader y Writer.
Existen una serie de “adaptadores” que se pueden utilizar para
ayudarnos a leer o escribir los datos formateandolos (en lugar
de tener que leer y escribir bytes o caracteres)
A continuación veremos ejemplos de estos “adaptadores”
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Ficheros
InputStreamReader/OutputStreamReader
Convierten un InputStream/OutputStream en un
Reader/Writer.
BufferedInputStream/BufferedOutputStream/BufferedReader/BufferedWriter
Añaden memoria de almacenamiento temporal.
DataInputStream/DataOutputStream
Permiten leer modelos simples de datos como tipos
primitivos y String
PrintWriter/PrintStream
Simplifican la impresión de texto
216 [209 - 218]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Ficheros: Ejemplo
import j a v a . i o . ∗ ;
public class Salida2 {
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) t h r o w s I O E x c e p t i o n {
P r i n t W r i t e r pw =
new P r i n t W r i t e r ( new F i l e W r i t e r ( ” d a t o s . d a t ” ) ) ;
BufferedReader br =
new B u f f e r e d R e a d e r ( ( new I n p u t S t r e a m R e a d e r ( System . i n ) ) ) ;
while ( true ) {
System . e r r . p r i n t ( ” T e c l e a a l g o : ” ) ;
pw . p r i n t l n ( b r . r e a d L i n e ( ) ) ;
}
}
}
217 [209 - 218]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
E/S Estándar
Ficheros
Entrada/Salida
Ficheros: Ejemplo
218 [209 - 218]
Usamos un PrintWriter que nos permite usar el método
println
Convertimos el InputStream en un Reader y lo adaptamos
con un BufferedReader para usar readLine
Además vemos como podemos usar un FileWriter en lugar
de un FileOutputStream
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Índice
7
Interfaces Gráficas de usuario
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
219 [219 - 220]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
220 [219 - 220]
Las interfaces Swing deben tener al menos un contendor
“top-level”.
Un contenedor “top-level” proporciona el soporte para pintar
y manejar eventos.
Hay 3 contenedores “top-level” comunes: JFrame, JDialog y
JApplet.
Cada JFrame implementa una ventana principal y cada
JDialog implementa una ventana secundaria.
Los JApplet implementan applets.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Hola mundo
import j a va x . swing . ∗ ;
p u b l i c c l a s s HolaMundoSwing {
p r i v a t e s t a t i c v o i d createAndShowGUI ( ) {
JFrame . s e t D e f a u l t L o o k A n d F e e l D e c o r a t e d ( t r u e ) ;
JFrame f r a m e = new JFrame ( ” Ventana h o l a mundo” ) ;
f r a m e . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE ) ;
J L a b e l l a b e l = new J L a b e l ( ” H o l a mundo ! ” ) ;
f r a m e . g e t C o n t e n t P a n e ( ) . add ( l a b e l ) ;
f r a m e . pa ck ( ) ;
frame . s e t V i s i b l e ( true ) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
j a v a x . s w i n g . S w i n g U t i l i t i e s . i n v o k e L a t e r ( new R u n n a b l e ( ) {
p u b l i c void run ( ) {
createAndShowGUI ( ) ;
}
});
}
221 [221 - }224]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Hola mundo
222 [221 - 224]
JFrame . s e t D e f a u l t L o o k A n d F e e l D e c o r a t e d ( t r u e ) ;
JFrame f r a m e = new JFrame ( ” Ventana h o l a mundo” ) ;
...
f r a m e . pack ( ) ;
frame . s e t V i s i b l e ( true ) ;
Con la primera linea decimos que use las decoraciones de java
en lugar de las decoraciones del gestor de ventanas.
Al JFrame le damos el tı́tulo de la ventana.
pack() compacta la ventana de modo que quepan todos sus
elementos.
setVisible(true) hace que se muestre la ventana.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Hola mundo
J L a b e l l a b e l = new J L a b e l ( ” H o l a mundo ! ” ) ;
f r a m e . g e t C o n t e n t P a n e ( ) . add ( l a b e l ) ;
Los componentes Swing, excepto los contenedores “top-level”,
son descendientes de JComponent. En este ejemplo usamos
JLabel.
Para añadir la etiqueta a la ventana, se añade al “content
pane”
En Java5 bastará con hacer: frame.add(label);
f r a m e . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE ) ;
223 [221 - 224]
Con esta instrucción se hace que la ventana se cierre al darle
al botón de cerrar la ventana.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Hola mundo
224 [221 - 224]
javax . swing . S w i n g U t i l i t i e s . i n v o k e L a t e r (
new R u n n a b l e ( ) {
p u b l i c void run ( ) {
/∗ c r e a r y m o s t r a r l a GUI ∗/
}
});
El control de eventos y dibujado de la interfaz suceden todos
en un thread especial: el thread de manejo de eventos.
Ası́ un evento no finaliza antes de que otro empieze, ni el
dibujado es interrumpido para gestiónar un evento.
La clase SwingUtilities controla la ejecución dentro del
thread de eventos de swing.
Con invokeLater ejecutamos algo dentro del thread de
eventos.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Mini-aplicación
En este ejemplo veremos:
225 [225 - 232]
Look and Feel
Establecer botones y etiquetas
Añadir componentes a contenedores
Poner bordes a componentes
Manejar eventos
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Mini-aplicación
Con UIManager.setLookAndFeel(LOOKANDFEEL);
establecemos la apariencia de la aplicación.
El parámetro es el nombre del Look and Feel
Hay unos cuantos predefinidos:
“com.sun.java.swing.plaf.gtk.GTKLookAndFeel”
“javax.swing.plaf.metal.MetalLookAndFeel”
“com.sun.java.swing.plaf.windows.WindowsLookAndFeel”
“com.sun.java.swing.plaf.motif.MotifLookAndFeel”
Ademas:
UIManager.getCrossPlatformLookAndFeelClassName():
Devuelve un look and feel multiplataforma.
UIManager.getSystemLookAndFeelClassName(): Look and
feel de la plataforma actual
226 [225 - 232]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Mini-aplicación
Para crear un botón usamos la clase JButton. Podemos asignarle
teclas abreviadas.
J B u t t o n b u t t o n = new J B u t t o n ( ” Soy un b o t o n ! ” ) ;
b u t t o n . setMnemonic ( KeyEvent . VK I ) ;
Para añadirle comportamiento usamos un ActionListener:
227 [225 - 232]
button . addActionListener ( this ) ;
...
public void actionPerformed ( ActionEvent e ) {
...
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Mini-aplicación
En general, para detectar cuando un usuario hace click en un
botón:
228 [225 - 232]
El programa debe tener un objeto que implemente la interfaz
ActionListener
Se debe registrar este objeto como “action listener” del botón
usando addActionListener
Cuando el usuario hace click el botón lanza un evento de
acción y llama al método actionPerformed
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Mini-aplicación
Los componentes Swing pueden generar distintos tipos de eventos:
Lanzador del evento
Click en botón, Enter en campo de texto, o
se escoge item de un menú.
Cierre de la ventana (ventana principal)
Pulsación de un botón mientras el cursor
está sobre un componente
Se mueve el ratón sobre un componente
El componente se hace visible
El componente consigue el foco
Cambia la selección en una tabla
Cambia la propiedad de un componente
229 [225 - 232]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Tipo
ActionListener
WindowListener
MouseListener
MouseMotionListener
ComponentListener
FocusListener
ListSelectionListener
PropertyChangeListener
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Mini-aplicación
Para crear la etiqueta:
f i n a l JLabel label =
new J L a b e l ( l a b e l P r e f i x + ” 0
”);
Para cambiar el texto de la etiqueta:
l a b e l . setText ( l a b e l P r e f i x + numClicks ) ;
230 [225 - 232]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Mini-aplicación
Usamos un contenedor para agrupar los componentes antes de
añadirlos al JFrame:
JPanel panel =
new J P a n e l ( new G r i d L a y o u t ( 2 , 1 ) ) ;
p a n e l . add ( b u t t o n ) ;
p a n e l . add ( l a b e l ) ;
panel . setBorder (
BorderFactory . createEmptyBorder ( . . . ) ) ;
La primera linea crea un “layout” con dos filas y una columna.
Luego añadirmos los componentes y finalmente añadimos un borde.
231 [225 - 232]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Mini-aplicación
Para añadir el borde, usamos
pane . s e t B o r d e r (
BorderFactory . createEmptyBorder (
30 , 30 , 10 , 30) ) ;
Crea un borde al panel de manera que separa los componentes
añadidos del borde exterior.
232 [225 - 232]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Conversor Celsius-Fahrenheit
Para introducir el valor usamos un JTextField:
JTextField tempCelsius = null ;
...
t e m p C e l s i u s = new J T e x t F i e l d ( 2 ) ;
Para recoger el valor:
233 [233 - 233]
tempCelsius . getText ( ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Layouts
Nos ineteresa manejar los layouts de los JPanel y los “content
pane”. Se puede establecer un layout en sus constructores o
usando el método setLayout:
234 [234 - 237]
J P a n e l p a n e l = new J P a n e l ( new B o r d e r L a y o u t ( ) ) ;
Container contentPane = frame . getContentPane ( ) ;
c o n t e n t P a n e . s e t L a y o u t ( new F l o w L a y o u t ( ) ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Layouts: Tipos
Hay varias elecciones a la hora de usar un layout, como siempre
depende de nuestras necesidades:
FlowLayout Para tener los componentes en una fila con su
tamaño natural. Es el layout por defecto.
BorderLayout Se usa si queremos que los componentes
ocupen todo el espacio libre.
GridLayout Componentes de mismo tamaño distribuidos en
filas y columnas.
BoxLayout Componentes en una fila o columa con diferentes
espacios entre ellos, distintas alineaciones o tamaños.
GribBagLayout y SpringLayout Si tenemos un escenario
complejo y queremos mucho control sobre como se disponen
los elementos.
235 [234 - 237]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Layouts: FlowLayout
236 [234 - 237]
Cuando un contenedor tienen un FlowLayout añadimos
elementos en el usando add(componente).
Los elementos se distribuyen en fila si variar su tamaño.
Es el layout por defecto.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Layouts: BorderLayout
237 [234 - 237]
Se divide el contenedor en 5 regiones:
PAGE START Parte superior del contenedor
PAGE END Parte inferior del contenedor
LINE START Parte izquierdadel contenedor
LINE END Parte derecha del contenedor
CENTER Centro del contenedor
Los elementos ocupan todo el espacio posible (se cambia su
tamaño para logarlo) incluso si se modifica el tamaño de la
ventana.
Para añadir elementos se usa add(componente,
BorderLayout.REGION) donde REGION es una de las
regiones anteriores.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Ejercicio
Crearemos un mini editor de texto.
Usaremos lo aprendido de entrada/salida de ficheros.
Leemos un fichero y escribimos su contenido en un JTextArea.
Usar un BorderLayout.
JTextArea
Podemos usar el método setText(String t) para poner todo el
texto o append(String t) para ir añadiendo poco a poco.
Con getText() obtenemos todo el texto que contiene.
238 [238 - 246]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Dialogo de apertura de fichero
Con JFileChooser tenemos un dialogo que pide un fichero:
J F i l e C h o o s e r c h o o s e r = new J F i l e C h o o s e r ( ) ;
i n t r e t u r n V a l = c h o o s e r . showOpenDialog ( f r a m e ) ;
i f ( r e t u r n V a l == J F i l e C h o o s e r . APPROVE OPTION) {
try {
leeFichero (
chooser . g e t S e l e c t e d F i l e ( ) . getAbsolutePath ( ) ) ;
} catch ( E x c e p t i o n ex ) {
ex . p r i n t S t a c k T r a c e ( ) ;
}
}
}
Como podemos con getSelectedFile() nos devuelve un objeto
File que representa el fichero elejido.
239 [238 - 246]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Acciones
Podemos establecer el comportamiento de un botón usando
acciones.
b u t t o n . s e t A c t i o n ( new A c t i o n A b r i r ( ) ) ;
Para ello creamos una subclase de AbstractAction e
implementamos el método actionPerformed
240 [238 - 246]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Acciones
241 [238 - 246]
c l a s s ActionAbrir extends AbstractAction {
public ActionAbrir () {
super ( ” Abrir ” ) ;
}
public void actionPerformed ( ActionEvent e ) {
J F i l e C h o o s e r c h o o s e r = new J F i l e C h o o s e r ( ) ;
i n t r e t u r n V a l = c h o o s e r . s ho wO pe nD i a l o g ( f r a m e ) ;
i f ( r e t u r n V a l == J F i l e C h o o s e r . APPROVE OPTION) {
try {
leeFichero (
chooser . g e t S e l e c t e d F i l e ( ) . getAbsolutePath ( ) )
} catch ( E x c e p t i o n ex ) {
ex . p r i n t S t a c k T r a c e ( ) ;
}
}
}
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Menu
Podemos añadir menus a las ventanas. Para ellos creamos un
JMenuBar y se lo añadimos al JFrame haciendo
setJMenuBar(menu)
242 [238 - 246]
El JMenuBar está formado por elementos JMenu
Los JMenu contienen elementos del tipo JMenuItem
Los JMenuItem reciben como argumento una acción.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Menu
243 [238 - 246]
JMenuBar menuBar = new JMenuBar ( ) ;
JMenu menu = new JMenu ( ” F i c h e r o ” ) ;
menu . add ( new JMenuItem ( new A c t i o n A b r i r ( ) ) ) ;
menu . add ( new JMenuItem ( new A c t i o n G u a r d a r ( ) ) ) ;
menuBar . add ( menu ) ;
f r a m e . addJMenuBar ( menuBar ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Popup
Además podemos añadir un menu popup a nuestro editor.
244 [238 - 246]
Usamos un JPopupMenu
Son parecidos a los JMenu, contienen JMenuItem
Para hacer que aparezca al pulsar el botón derecho tenemos
que registrarnos en los eventos del ratón.
Usamos el método addMouseListener que espera recibir un
MouseListener. Podemos extender la clase MouseAdapter y
anular los métodos que nos interesan.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Popup
245 [238 - 246]
c l a s s P o p u p L i s t e n e r extends MouseAdapter {
p u b l i c v o i d m o u s e P r e s s e d ( MouseEvent e ) {
maybeShowPopup ( e ) ;
}
p u b l i c v o i d m o u s e R e l e a s e d ( MouseEvent e ) {
maybeShowPopup ( e ) ;
}
p r i v a t e v o i d maybeShowPopup ( MouseEvent e ) {
i f ( e . isPopupTrigger ()) {
popup . show ( e . getComponent ( ) ,
e . getX ( ) , e . getY ( ) ) ;
}
} Varela Paz (cvarela@dc.fi.udc.es)
Carlos
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Hola mundo
Mini-aplicación
Entrada de datos
Layouts
Ejercicio
Interfaces Gráficas de usuario
Popup
246 [238 - 246]
Con e.isPopupTrigger() sabemos si es el evento de mostrar
el popup en la plataforma en la que se ejecuta la aplicación
Añadimos el evento al JTextArea
texto . addMouseListener (
new P o p u p L i s t e n e r ( ) ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Índice
8
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
247 [247 - 247]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
Checkboxes
248 [248 - 248]
Un checkbox es un botón especializado que muestra un estado
de selección.
Suele utilizarse para seleccionar opciones en una interfaz
En Java se representa con la clase JCheckBox
Para crear uno se hace:
JCheckBox ck = new JCheckBox ( ” Opcion 1” ) ;
La cadena de texto es el texto que aparecerá al lado de la
marca de selección
Para conocer el estado usamos isSelected()
Si queremos modificarlo explı́citamente usamos
setSelected(boolean b)
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
Botones de radio
249 [249 - 250]
Con checkboxes podemos hacer elegir entre varias opciones
Si queremos que esas opciones sean excluyentes se suelen
utilizar botones de radio
Representados con la clase JRadioButton
Para crear uno se hace:
J R a d i o B u t t o n ck = new J R a d i o B u t t o n ( ” Opcion 1” ) ;
La cadena de texto es el texto que aparecerá al lado de la
marca de selección
Para conocer el estado usamos isSelected()
Si queremos modificarlo explı́citamente usamos
setSelected(boolean b)
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
Botones de radio
250 [249 - 250]
Para lograr un comportamiento exclusivo (sólo uno de los
botones está seleccionado) se usa ButtonGroup
Esta clase se encarga de que sólo un botón se encuentre
seleccionado en cada momento
ButtonGroup g r u p o = new ButtonGroup ( ) ;
g r u p o . add ( r b 1 ) ;
g r u p o . add ( r b 2 ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
ComboBox
251 [251 - 251]
Con las comboboxes podemos seleccionar un elemento de una
lista.
Se usa la clase JComboBox
Podemos inicializar un combobox haciendo:
String animales [ ] =
{” P e r r o ” , ” Gato ” , ” P o l l o ” } ;
JComboBox cb = new JComboBox ( a n i m a l e s ) ;
Con setSelectedIndex(int i) indicamos qué elemento
queremos que aparezca seleccionado
Podemos registrar un ActionListener para saber cuando se
selecciona un elemento.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
Imágenes
252 [252 - 253]
El tratamiento de imágenes en Java es un mundo por si solo.
Veremos una forma sencilla de visualizar imágenes en nuestra
interfaz.
Usaremos un objeto ImageIcon y se lo asociaremos a un
JLabel para que dibuje la imagen.
Para crear un ImageIcon hacemos:
j a v a . n e t . URL imgURL =
NombreDeClase . c l a s s . g e t R e s o u r c e ( p a t h ) ;
I m a g e I c o n i = new I m a g e I c o n ( imgURL ) ;
Ahora podemos asignar el icono al JLabel:
J L a b e l l = new J L a b e l ( ) ;
l . setIcon ( i );
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
Imágenes
j a v a . n e t . URL imgURL =
NombreDeClase . c l a s s . g e t R e s o u r c e ( p a t h ) ;
El método getResource hace que el cargador de clases busque en
los directorios del classpath y en los .jar y devuelva una URL con la
dirección del fichero.
253 [252 - 253]
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
Tabs
254 [254 - 255]
En las interfaces gráficas es común ver solapas que al
pincharlas muestran un contenido.
En Java se puede utilizar un contenedor especial para lograr
ese efecto: JTabbedPane
Para añadir elementos al panel se usa el método addTab que
creará una nueva solapa:
JTabbedPane p = new JTabbedPane ( ) ;
p . addTab ( ” T i t u l o ” , componente ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
Tabs: Orientación
Podemos cambiar e lugar en el que aparecen las solapas usando el
método setTabPlacement(int placement), el parámetro puede
valer:
255 [254 - 255]
JTabbedPane.TOP
JTabbedPane.BOTTOM;
JTabbedPane.LEFT
JTabbedPane.RIGHT
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
SplitPane
256 [256 - 257]
Con un JSplitPane creamos un contenedor dividido en dos
paneles.
Para indicar los componentes que van a cada lado se usan los
métodos setRightComponent(Component c) y
setLeftComponent(Component c)
Ahora podemos modificar el tamaño de los paneles con el
ratón moviendo la barra divisora.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
SplitPane
257 [256 - 257]
Podemos cambiar la orientación de la barra de división
utilizando el método setOrientation(int orientation).
Los valores permitidos son:
JSplitPane.VERTICAL SPLIT
JSplitPane.HORIZONTAL SPLIT
Si se usa JSplitPane.HORIZONTAL SPLIT podemos añadir
los componentes usando setTopComponent(Component
comp) y setBottomComponent(Component comp)
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
Rendimiento
Ya comentamos que los eventos se manejan en el thread de
eventos y que se tratan secuencialmente.
Además sabemos que el dibujado tambien ocurre ahı́.
¿Que sucede si hacemos una operación muy costosa en un evento?
La interfaz queda bloqueada hasta que la operación termine.
Puede haber distintas operaciones costosas:
258 [258 - 260]
Cargar una imagen grande.
Hacer peticiones a una base de datos remota.
Realizar un cálculo complejo
...
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
Rendimiento
Es este tipo de casos deberiamos:
Crear un thread que realice la operación que tarda
Al terminar actualizar la interfaz usando
SwingUtilities.invokeLater(...)
En los tutoriales de Sun nos proporcionan una clase SwingWorker
que hace esto por nosotros. Para usarla hay que:
259 [258 - 260]
Crear una subclase de SwingWorker.
Anular el método construct() poniendo el código costoso
Anular el método finished() poniendo el código de
actualización de la interfaz.
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Threads
Entrada/Salida
Interfaces Gráficas de usuario
Interfaces Gráficas de usuario II
Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento
Interfaces Gráficas de usuario II
Rendimiento
260 [258 - 260]
contruct() de vuelve un Object que puede ser utilizado el
mètodo getValue()
getValue() espera a que el thread generado en
construct() termine si no habı́a terminado.
SwingWorker w o r k e r = new SwingWorker ( ) {
p u b li c Object c o ns tr uc t () {
// Hemos una o p e r a c i o n c o s t o s i i i i i i m a
return resultado ;
}
// Se e j e c u t a en e l t h r e a d de e v e n t o s .
public void f i n i s h e d () {
Object r = getValue ( ) ;
// A c t u a l i z a m o s l a i n t e r f a z u s a n d o e l v a l o r
}
};
worker . s t a r t ( ) ;
Carlos Varela Paz (cvarela@dc.fi.udc.es)
Introducción al lenguaje de programación Java
Descargar