Vous êtes sur la page 1sur 260

1 [1 - 1]

Introduccion al lenguaje de programacion Java


Conceptos basicos

Carlos Varela Paz


(cvarela@dc.fi.udc.es)

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

2 [2 - 2]

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Parte I
Fundamentos del lenguaje

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Historia
Herramientas
Empaquetador JAR

Indice

3 [3 - 4]

Introduccion
Historia
Herramientas
Empaquetador JAR

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Historia
Herramientas
Empaquetador JAR

Este
curso

4 [3 - 4]

Que es Java?
Herramientas basicas
Sintaxis basica
Manejo de objetos
Threads
Mecanismos de E/S
Clases de u
tilidad mas usadas
...

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Historia
Herramientas
Empaquetador JAR

Breve historia

5 [5 - 6]

Creado por Sun.


Objetivo de dise
no: creacion de un lenguaje independiente de
la plataforma y del sistema operativo, para el desarrollo de
electronica de consumo.
El proyecto original (Green) comenzo apoyandose en C++:
problemas de portabilidad.
Desarrollo su propio lenguaje y en agosto de 1991 nacio un
nuevo lenguaje orientado a objetos (Oak).
A mitad de 1993 se lanzo Mosaic el primer navegador para la
Web, y comenzo a crecer el interes por Internet (y en
particular por la World Wide Web).
Redise
no del lenguaje para desarrollar aplicaciones para
Internet.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Historia
Herramientas
Empaquetador JAR

Breve historia

6 [5 - 6]

Enero del 1995 Oak se convirtio en Java.


En 1996 Sun lanza el entorno JDK 1.0. Desde entonces se han
lanzado diferentes versiones, aunque la primera comercial se
denomino JDK 1.1 y se lanzo a principios de 1997.
En diciembre de 1998 Sun lanzo la plataforma Java 2 (que se
ha conocido como JDK 1.2 durante su fase de pruebas beta).
Esta version de Java ya presento la madurez de la plataforma
Java. Sun renombro Java 1.2 como Java 2.
La u
ltima version 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Historia
Herramientas
Empaquetador JAR

Interprete

7 [7 - 11]

Un interprete Java es un software que contiene una maquina


virtual Java y que ejecuta aplicaciones Java:
Realiza todas las actividades del sistema de ejecucion de Java.
Carga los archivos de clase y traduce el bytecode compilado.
El interprete Java de Sun es java, la sintaxis es:
java [opciones] nombre clase [argumentos]

Aplicaciones independientes
En una aplicacion independiente, una clase contiene el metodo
main(), que contiene sentencias para ejecutar al inicio. Para que la
aplicacion se ejecute, se ejecuta el interprete indicando esa clase
como argumento.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Historia
Herramientas
Empaquetador JAR

Interprete
Aplicaciones independientes

8 [7 - 11]

Especificar el nombre completo de la clase, sin la extension


.class.
El interprete busca la clase en la ruta de clases, que es una
lista de directorios donde se guardan los paquetes de las clases.
La ruta de clase normalmente esta definida en la variable de
entorno CLASSPATH, pero puede ser redefinida con la opcion
-classpath o -cp
Tras cargar la clase especificada en la lnea de comando, el
interprete ejecuta el metodo main() de la clase.
A partir de aqu la aplicacion 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Historia
Herramientas
Empaquetador JAR

Compilador

9 [7 - 11]

El compilador de Sun es javac.


javac convierte el codigo fuente Java en una clase compilada
que contiene el bytecode de la maquina virtual Java.
Los archivos fuente tienen la extension .java, los archivos de
clase resultantes tienen la extension .class.
Se permite una u
nica clase p
ublica por archivo y el nombre del
archivo debe ser el mismo que el de la clase.
Un u
nico arquivo puede contener m
ultiples clases siempre y
cuando solo una de ellas sea p
ublica.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Historia
Herramientas
Empaquetador JAR

Compilador
Ejemplo

En un fichero HolaMundo.java escribimos el codigo 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
on al lenguaje de programaci
on Java

Introducci
on
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 opcion -d del compilador:
javac -d clases HolaMundo.java
java -cp clases HolaMundo
Se pueden especificar m
ultiples archivos .java en un u
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, estas se buscan usando la ruta de clases.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Historia
Herramientas
Empaquetador JAR

Empaquetador JAR

12 [12 - 18]

Los ficheros .jar son el medio estandar y portatil de


empaquetar todas las partes de una aplicacion Java.
En un JAR podemos poner todo lo que queramos: clases Java,
datos, imagenes, sonidos . . .
El sistema de ejecucion 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
on al lenguaje de programaci
on Java

Introducci
on
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 solo 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
on al lenguaje de programaci
on Java

Introducci
on
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
on al lenguaje de programaci
on Java

Introducci
on
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
on al lenguaje de programaci
on Java

Introducci
on
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
on al lenguaje de programaci
on Java

Introducci
on
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 informacion 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 opcion m de jar

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 aplicacion.
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 aplicacion se usar la opcion -jar de java:
java -jar holamundo.jar
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Indice

19 [19 - 19]

Sintaxis
Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Comentarios
En Java se pueden hacer comentarios de bloque y de lnea. Los
primeros estan 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
on al lenguaje de programaci
on Java

Introducci
on
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 lnea estan delimitados por el final de
lnea, si se pone // dentro de un comentario de lnea 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
on al lenguaje de programaci
on Java

Introducci
on
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 documentacion.

Estos
estan dise
nados para ser extrados por generadores
automaticos de documentacion como el programa javadoc.
En estos comentarios se usan marcas especiales para a
nadir
informacion: cada espacio en una lnea hasta un * es ignorado
y las lneas que empiezen por un @ se interpretan como
etiquetas especiales para el generador de documentacion.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Comentarios Javadoc

24 [20 - 25]

javadoc crea la documentacion en formato HTML.


El compilador tambien busca estos comentarios en el codigo,
en concreto esta interesado en la etiqueta @deprecated que
indica que un metodo esta obsoleto y debera evitarse en
nuevos programas. El compilador genera un mensaje de aviso
si se usa un metodo obsoleto.
Los comentarios de documento pueden aparecer encima de las
definiciones de clases, metodos y variables, pero no todas las
etiquetas pueden ser aplicadas a todos los casos. Por ejemplo,
las variables pueden tener solo la etiqueta @see.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Comentarios Javadoc
Etiquetas

25 [20 - 25]

Etiqueta
@see

Descripci
on
Nombre de clase asociada

@auhor
@version
@param

Nombre del autor


Cadena con la version
Nombre y descripcion del
parametro
Descripcion del valor de
retorno
Nombre y descripcion de la
excepcion
Declara un elemento como
obsoleto

@return
@exception
@deprecated

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Se aplica a
Clase, metodo o variable
Clase
Clase
Metodo
Metodo
Metodo
Clase, metodo o variable

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Tipos

Los tipos de datos en Java se dividen en dos categoras:

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
umeros.
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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Tipos primitivos
Los elementos fundamentales en Java son n
umeros, caracteres
y valores booleanos.
A diferencia de otros lenguajes orientados a objetos, estos no
son objetos. Para aquellas situaciones en las que es deseable
tratar en valor primitivo como un objeto, Java proporciona
clases envolventes1 .
Una de las ventajas de tratar con valores primitivos es que el
compilador esta mas preparado para optimizar su uso.
Otra caracterstica esta relacionada con la portabilidad de
Java, los tipos primitivos estan definidos con precision. p.e: un
int tiene un tama
no de 32 bits en cualquier plataforma
1

En Java 1.5 el compilador hace autom


aticamente la conversi
on seg
un 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
on al lenguaje de programaci
on Java

Introducci
on
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
on
true o false
Caracter 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Tipos primitivos
Declaraci
on e inicializaci
on de variables

Las variables se declaran dentro de clases o metodos 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 declaracion:

29 [26 - 40]

i n t u n E n t e r o =4;
double d1 =4.6 , d2 =25+7;
boolean t e r m i n a d o=t r u e ;

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Tipos primitivos
Declaraci
on e inicializaci
on de variables

30 [26 - 40]

Las variables de clase que no se inicialicen cogen valores por


defecto.
Los valores numericos tienen por defecto cero, los caracteres
el caracter nulo (\0) y los booleanos false.
En cambio, las variables locales a los metodos, deben
inicializarse explcitamente 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 metodo, este se copia.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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
umeros 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 comenzandolos por 0x,
siguiendo con los dgitos y caracteres 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
on al lenguaje de programaci
on Java

Introducci
on
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 numerico en una expresion donde aparece
un tipo con rango superior, el tipo inicial se puede convertir al tipo
mayor (como en el ejemplo anterior). Algunas operaciones
numericas y de comparacion tambien crean estas conversiones.

32 [26 - 40]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Tipos primitivos
Literales enteros

Un tipo numerico no puede ser asignado a un tipo inferior sin una


conversion explcita (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
conversion debido a la potencial perdida de precision.

33 [26 - 40]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 notacion


decimal o cientfica. 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Tipos primitivos
Literales car
acter

El valor de un caracter literal puede definirse bien mediante un


caracter que este 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
on al lenguaje de programaci
on Java

Introducci
on
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 implcita 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
metodo 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
metodo, esta se pasa por valor.
Se puede pensar en una referencia como un tipo de puntero al
que se quita la refencia automaticamente siempre que se cita.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 veran reflejados en la
otra.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 automaticamente
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 metodos y un tipo
correspondiente. Cualquier objeto que implemente todos los
metodos 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
on al lenguaje de programaci
on Java

Introducci
on
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 mas bien como
del tipo primitivo.
En el codigo fuente, a los valores de las cadenas literales el
compilador los convierte en objetos String. Pueden usarse
directamente, pasarse como argumentos a metodos o
asignarse a variables de tipo String

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 smbolo + tiene mas de una funcion (esta sobrecargado) para
proporcionar la concatenacion de strings y la suma de n
umeros.
Junto con +=, son los u
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 u
nico objeto String a partir de la concatenacion de
strings y las ofrece como el resultado de la expresion.

40 [26 - 40]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Sentencias

41 [41 - 51]

Las sentencias aparecen dentro de metodos y clases.


Describen todas las actividades de un programa.
Las declaraciones de variables y asignaciones, como las de la
seccion anterior, son sentencias que constituyen la estructura
basica del lenguaje, como las condiciones y los bucles.
Las sentencias y expresiones aparecen dentro de bloques de
c
odigo.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Sentencias
Bloques de c
odigo

Un bloque de codigo es, desde el punto de vista de la sintaxis, una


serie se sentencias dentro de unas llaves. Las sentencias dentro de
un bloque de codigo pueden contener declaraciones de variables:

42 [41 - 51]

{
i n t tam = 5 ;
setNombre ( KK ) ;
...
}

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Sentencias
Bloques de c
odigo: Metodos

Los metodos, son en cierto sentido bloques de codigo que toman


parametros y que pueden llamarse por su nombre:
setNombre ( S t r i n g nombre ) {
i n t tam =5;
setNombre ( nombre ) ;
}
El ambito de las declaraciones de variables se encuentra limitado al
bloque se codigo 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Sentencias
Bloques de c
odigo: Condicionales

El uso mas com


un es definir un grupo de sentencias para su uso en
una sentencia condicional o iterativa.
Un condicion se define como:
i f ( condicion ) {
sentencia1 ;
sentencia2 ;
...
} else {
sentencia3 ;
sentencia4 ;
....
}

condicion es una expresion booleana.

44 [41 - 51]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Sentencias
Bloques de c
odigo: 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Sentencias
Bloques de c
odigo: 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 expresion que inicializa una variable puede declarar una nueva
variable que sera restringida al ambito 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Sentencias
Bloques de c
odigo: for

Se pueden usar m
ultiples expresiones separadaspor coma en
secciones de inicializacion 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Sentencias
Bloques de c
odigo: switch

La sentencia switch recibe un tipo entero y hace una seleccion


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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Sentencias
Bloques de c
odigo: switch

Normalmente se usa la sentencia break para finalizar una


ramificacion 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Sentencias
Bloques de c
odigo: etiquetas

Las sentencias encerradas como bloques de codigo e iteradores


pueden ser etiquetados con una sentencia de identificacion:

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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Sentencias
Bloques de c
odigo: ejemplo

51 [41 - 51]

En este ejemplo, un break o un continue sin argumentos en


la posicion indicada hubiera hecho que el proceso continuase
en el punto despues de dos (break) o volviera a comprobar
la condicion (continue).
Un break dos hara lo mismoque un break normal, pero un
break uno ira al punto despues de uno.
Analogamente, continue dos habra hecho lo mismo que
continue, pero continue uno hara volver a la prueba del
bucle uno.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Expresiones

52 [52 - 63]

Las expresiones describen valores.


Una expresion se evalua para obtener un resultado que va a
ser usado como parte de otra expresion o en una sentencia.
Al evaluar una expresion se obtiene un resultado o valor. El
valor de una expresion puede ser de tipo numerico, como en
una operacion aritmetica, de tipo referencia, como en la
ubicacion de un objeto o un tipo especial void, que es el tipo
que se declara a un metodo que no devuelve ningun valor.
El tipo de una expresion se conoce en tiempo de compilacion.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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
etico
Aritm
etico
Integral
Boolean
Cualquiera
Aritm
etico

3
3

+,
+

Aritm
etico
Cadena

4
4

<<
>>

Integral
Integral

>>>

Integral

5
5

>, <=, >, >=


instanceof

Aritm
etico
Objeto

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Descripci
on
Incrementa y decrementa.
M
as y menos unarios.
Complemento bitwise.
Complemento l
ogico.
Cast.
Multiplicaci
on, divisi
on,
resto de la divisi
on.
Adici
on y sustracci
on.
Concatenaci
on de cadenas.
Cambia a la izquierda.
Cambio por la derecha con
la extensi
on del signo.
Cambio por la derecha sin
extensi
on.
Comparaci
on num
erica.
Comparaci
on del tipo.

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Operadores

54 [52 - 63]

Precedente
6

Operador
==, !=

Tipo
Primitivo

==, !=

Objeto

7
7
8
8
9
9
10
11
12

&
&
^
^
|
|
&&
||
?:

Integral
Boolean
Integral
Boolean
Integral
Boolean
Boolean
Boolean
NA

13
13

Cualquiera
Cualquiera

=, / =, %=, + =,

Descripci
on
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
on.
Asignaci
on con operaci
on.

=, <<=, >>=,
>>>=, &=, ^=, | =
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Operadores: observaciones

55 [52 - 63]

Java no permite la manipulacion directa del puntero, por lo


que no soporta operadores de referencia y dereferencia (que
tiene, por ejemplo, C). Tambien a
nade operadores como la
concatenacion de cadenas.
La asignacion se puede usar como una valor por parte de otra
expresion:
j = ( i = 5);
La expresion 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 ejecucion.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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
un objeto) o
de una variable static (de una clase).
Tambien puede especificar un metodo para que sea invocado
en un objeto o clase.
El uso de punto (.) para acceder a una variable en un objeto
es una expresion que da como resultado el valor de la variable

a la que se accede. Esta


puede ser un tipo numerico 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Operadores: operador punto


Una expresion del tipo referencia puede usarse en evaluaciones
posteriores, seleccionando variables o llamando a metodos 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 metodo 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Operadores: operador punto

Una llamada a un metodo es esencialmente una llamada a una


funci
on: una expresion que da como resultado un valor. El tipo de
valor es el tipo que devuelve el metodo.
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 eleccion de que metodo se ejecuta es mas complicada de lo que
parece porque Java permite la sobrecarga y la anulacion de un
metodo (como veremos mas adelante).

58 [52 - 63]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Operadores: operador punto


Al igual que el resultado de cualquier expresion, el resultado de una
invocacion puede utilizarse en evaluaciones posteriores, como ya
vimos. Puede crear valiables intermedias para hacer mas claro el
c
odigo. 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
on al lenguaje de programaci
on Java

Introducci
on
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 metodo que siempre tiene el mismo
nombre que la clase y especifica cuales son los parametros
necesarios para construir la clase.
El valor de la expresion new es una referencia del tipo de
objeto creado.
Los objetos siempre tienen uno mas constructores. Ya veremos
mas adelante la creacion de un objeto con detalle.
Podemos crear un objeto e invocar un metodo 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
on al lenguaje de programaci
on Java

Introducci
on
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 ejecucion 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
on al lenguaje de programaci
on Java

Introducci
on
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 sera cierto.

62 [52 - 63]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Operadores: operador condicional

Este
operador es equivalente a la sentencia if, su sintaxis es de la
forma:
condici
on?expresi
on:expresi
on
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
on al lenguaje de programaci
on Java

Introducci
on
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 solucion elegante al manejo de errores con el
tratamiento de las excepciones.
Una excepcion inicia una condicion que no es habitual o una
condicion de error.
El control del programa se transfiere incodicionalmente a una
seccion de codigo donde se recoge y se trata.
No tenemos que tener valores de retorno especiales para los
metodos para indicar que hay un error, los errores los trata un
mecanismo distinto.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 ubicacion u
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 informacion sobre los errores que puede dar
un metodo promueve al mismo nivel de importancia que sus
argumentos y tipos que devuelve.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 maquina virtual y
suele hacer que el interprete Java finalice y muestre un
mensaje de error.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Excepciones
Tratamiento de excepciones

Las sentencias de proteccion try/catch envuelven un trozo de


c
odigo y recogen los tipos de excepciones designados que se dan
dentro de el:

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
on al lenguaje de programaci
on Java

Introducci
on
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 clausula catch para un posible
tratamiento.
La sentencia catch act
ua como un metodo, especifica un
argumento del tipo de excepcion 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Excepciones
Tratamiento de excepciones

Una sentencia try puede tener m


ultiples clausulas 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Excepciones
Tratamiento de excepciones

70 [64 - 80]

Las clausulas catch se eval


uan en orden y se toma la primera
que puede coincidir (es asignable).
Como mucho se ejecuta una clausula catch, lo que significa
que las excepciones deberan listarse desde la mas a la menos
especfica.
En el ejemplo anterior la tercera clausula catch act
ua como
la clausula 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
on al lenguaje de programaci
on Java

Introducci
on
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 categoras


excepciones comprobadas y excepciones sin comprobar.
La mayora de las excepciones son comprobadas, lo que
significa que cualquier metodo que lanza una excepcion, bien
porque la genera el mismo o bien porque la ignoro, debe
declarar que puede lanzar este tipo de excepcion en una
clausula throws al declarar el metodo.:
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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Excepciones
Tratamiento de excepciones

72 [64 - 80]

La clausula throws le dice al compilador que excepciones


puede lanzar el metodo y los metodos que llamen a este
deben protegerse con bloque try/catch o declarando la
excepcion con una clausula 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 compilacion no declararlas
en una clausula throws o no encerrarlas en un bloque
try/catch.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 metodo getMessage().
Por convenio todos los tipos de Exception tienen un
constructor que recibe un String.
Podemos tener nuestra propia de jerarqua de excepciones
para tratar los errores especficos de nuestra aplicacion.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Excepciones
Propagaci
on de excepciones

Que pasa si no recogemos una excepcion?


Si no hay hay sentencias dentro del try/catch, la excepcion
es lanzada desde el metodo en la que aparecio hasta quien la
llamo.
Si este punto en el metodo que llamo esta dentro de una
clausula try, el control pasa a la correspondiente clausula
catch.
Si no, la excepcion sigue propagandose hasta la pila de la
llamada.
De este modo la excepcion 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 ejecucion.

74 [64 - 80]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Excepciones
Propagaci
on de excepciones: Ejemplo

Veamos un ejemplo de propagacion 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Excepciones
Propagaci
on de excepciones

76 [64 - 80]

Como una excepcion puede subir una distancia considerable


antes de que sea recogida y tratada; puede que necesitemos
un medio para determinar exactamente donde se lanzo.
Todas las excepciones pueden volcar una pila de seguimiento
(trace stack) que lista su metodo de origen y todas las
llamadas a los metodos anidados, usando en metodo
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
on al lenguaje de programaci
on Java

Introducci
on
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 condicion en las sentencias que


guarda.
Si se produce una excepcion en su interior las sentencias
restantes deberan ser abandonadas.
Esto tiene consecuencias importantes para la inicializacion de
variables locales. Si el compilador no puede determinar si una
variable va a ser inicializada dentro de un bloque try/catch,
no nos dejara utilizar la variable:

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Excepciones
La cl
ausula 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 clausula finally, esta sentencia asegura
que lo que vaya dentro de ella se
ejecutara independientemente de que se lanze una excepcion o
no.
Las clausulas finally se ejecutan igualmente aunque se
ejecute un return, break o continue.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Excepciones
La cl
ausula 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
on al lenguaje de programaci
on Java

Introducci
on
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


coleccion ordenada de elementos.
El tipo de los elementos del array se denomina tipo base del
array.
El n
umero 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Arrays
Para crear un array un array de una longitud especfica 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 implcita 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 notacion []
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 vacos [], aunque tambien es valido 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
no del array, solo estamos
declarando la variable de tipo array. El tama
no 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Arrays
Creaci
on e inicializaci
on de arrays

El operador new se usa para crear una instancia de un array. Tras


el operador new se especificara el tipo base del array o su longitud
con una expresion 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Arrays
Creaci
on e inicializaci
on de arrays

Los indices comienzan en cero. Tras la creacion 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Arrays
Creaci
on e inicializaci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Arrays
Creaci
on e inicializaci
on de arrays

En Java se puede crear un array e inicializar sus elementos usando


la construccion {}:
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
implcita 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Arrays
Creaci
on e inicializaci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Arrays
Uso de arrays

El tama
no de un array se encuentra en la variable p
ublica 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 u
nico campo accesible del array. Es una variable, no
un metodo.

89 [81 - 97]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 expresion que evalue a un entero.
El uso de este operador puede lanzar la excepcion
ArrayIndexOutOfBoundsException si se intenta acceder a
una posicion mas alla 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Arrays
Uso de arrays

Una tarea com


un es la de copiar un rango de elementos de dos
arrays. Para eso en Java se proporcciona el metodo 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 duplicara el tama
no 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Comentarios
Tipos
Sentencias
Expresiones
Excepciones
Arrays

Arrays
Arrays an
onimos

Java permite la creacion de arrays anonimos. 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 inicializacion de variables, pero como no
estamos declarando una variable tenemos que usar explcitamente
el operador new para crear el objeto de tipo array.

92 [81 - 97]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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
ultiples corchetes, uno para cada
dimension. 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 mas 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
on al lenguaje de programaci
on Java

Introducci
on
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


expresion tablero[0] es valida 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
on al lenguaje de programaci
on Java

Introducci
on
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


nos de todas las
dimensiones de un array multidimensional con una u
nica
operacion new.
La sintaxis del operador permite dejar los tama
nos de algunas
dimensiones sin especificar.
Hay que especificar por lo menos la menor dimension (la
dimension mas significativa del array).
Las dimensiones restantes se podran asignar mas adelante los
valores del tipo array apropiados.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 vacos 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
odigo 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
on al lenguaje de programaci
on Java

Introducci
on
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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Indice

98 [98 - 99]

Objetos en java
Clases
Creacion de objetos
Destruccion de objetos

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on 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 especificacion de
los campos y los metodos que el objeto puede ejecutar.
Cada objeto presenta al exterior una vista concisa y
consistente en funcion 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on 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 terminologa 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
un (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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on 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 metodos
que operan sobre esos campos.
Encapsula los componentes pasivos (campos) y componentes
activos (metodos) en una u
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 continuacion se puede invocar a los metodos del objeto.

101 [100 - 112]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Clases

En java una clase se declara utilizando la palabra clave class. Los


metodos y variables aparecen dentro de los corchetes de
declaracion 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on 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
metodos:

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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Variables: Ejemplo

c l a s s MiClase {
...
static float var3 = 4 . 0 ;
...
}
Ahora todos los objetos de la clase MiClase tendran 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Metodos

Al igual que las variables, los metodos pueden ser metodos de


contenido o metodos static.
Los metodos static pertenecen a la clase al igual que las
variables static, estos solo pueden acceder a variables static de
la clase, porque no estan 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Metodos

108 [100 - 112]

Las variables declaradas dentro de los metodos son locales al


metodo, es decir, no se pueden referenciar desde fuera del
metodo en el que estan declaradas.
Las variables locales se inicializan cuando se llama el metodo
y se destruyen cuando el metodo termina.
Los objetos creados dentro del metodo pueden ser destruidos
o no cuando el metodo finaliza, pueden no ser destruidos si
todava quedan referencias al objeto creado (por ejemplo, si se
pasa como parametro a otro metodo). El objeto sera destruido
por el recolector de basura cuando no queden mas referencias
a el.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Metodos: Ocultaci
on 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 ambito de metodo:
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 metodo flyToNext().

109 [100 - 112]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Metodos: Ocultaci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Sobrecarga de metodos

La sobrecarga es la capacidad de definir m


ultiples metodos con el
mismo nombre en una clase. Al invocar el metodo el compilador
selecciona el correcto dependiendo de los argumentos que se le
hayan pasado al metodo. 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Sobrecarga de metodos

Ahora podemos llamar al metodo 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
un no vimos la herencia de clases, pero anticiparemos que si un
tipo encajaen mas de un metodo, se ejecutara el que reciba el
tipo mas especfico.

112 [100 - 112]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Creaci
on de objetos

113 [113 - 120]

Para crear un objeto se usa el operador new junto con un


constructor.
Los constructores son metodos especiales que tienen el mismo
nombre que la clase y no devuelven ningun valor.
Al igual que los otros metodos pueden recibir parametros y ser
sobrecargados, pero no se heredan (la herencia la veremos
mas adelante).

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Creaci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Creaci
on de objetos

115 [113 - 120]

Si no se declara ning
un 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Creaci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Creaci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Creaci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Creaci
on de objetos

Se pueden declarar bloques de codigo en la clase que no


pertenecen a ningun metodo, estas secciones se indican entre llaves
y se evaluan al mismo tiempo que la evaluacion de las variables de
contenido (despues de la ejecucion 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Creaci
on de objetos

Estos bloques de codigo pueden ser clarados como static, en ese


caso s
olo 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Destrucci
on de objetos

121 [121 - 122]

Java se encarga de la destruccion de objetos, no tenemos que


preocuparnos por ella.Para ello usa una tecnica conocida
como recoleccion de basura.
Lo que hace es observar las referencias que tiene un objeto,
cuando un objeto ya no tiene referencias a el en la maquina
virtual, Java destruye el objeto y libera la memoria que este
ocupaba.
Podemos forzar la recoleccion de basura invocando el metodo
System.gc()

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Clases
Creaci
on de objetos
Destrucci
on de objetos

Objetos
Destrucci
on de objetos

122 [121 - 122]

Antes de que la recoleccion de basura borre un objeto, se


llama a su metodo 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 finalizacion se produce antes
que la recoleccion: los objetos ejecutan su metodo
finalize() y luego son liberados, si un objeto crea una
referencia a si mismo en el metodo finalize() no
sera recogido.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Indice

Relaciones entre clases


Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

123 [123 - 123]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia

124 [124 - 144]

En Java las clases pueden formar jerarquas.


Una clase se puede declarar como subclase de otra usando la
palabra clave extends.
Una subclase hereda todas las variables y metodos 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
on al lenguaje de programaci
on Java

Introducci
on
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


metodos 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia

126 [124 - 144]

S
olo se permite heredar de una u
nica clase, esto es herencia
u
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 metodos de la superclase, el comportamiento es
distinto si se trata de variables o de metodos.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia
Anulaci
on 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
hara uso de la variable redefinida en la subclase y en las
subclases de la subclase.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia
Anulaci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia
Anulaci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia
Anulaci
on de metodos

130 [124 - 144]

Se pueden anular metodos de la superclase declarando un


metodo con igual firma, es decir con el mismo n
umero de
argumentos y tipos y en el mismo orden.
Ademas debera declarar una clausula throws con la mismas
excepciones que puede lanzar el metodo que se anula o con
subclases de las mismas.
Cuando se anula un metodo la nueva version es invocada
siempre en cualquier contexto, lo veremos mejor con un
ejemplo:

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia
Anulaci
on de metodos
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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia
Anulaci
on de metodos

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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia
Anulaci
on de metodos

En ese ejemplo ademas 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 metodo imprimeVarA().
Cuando se llama al metodo anulado, como el contexto en el
que se ejecuta es en el de al clase B accede a la version 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 version de var que tiene esa clase.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia
Anulaci
on de metodos

134 [124 - 144]

Podemos evitar la anulacion de un metodo declarandolo como


final, el intento de anulacion de un metodo final da lugar
a un error de compilacion.
Si queremos hacer referencia a metodo anulado de la
superclase podemos usar la referencia especial super.
Al hacer esto se accede a la implementacion que usa la
superclase no el de la subclase.
Podemos usar esto para extender el comportamiento de un
metodo.
Tambien se puede usar super para acceder a variables.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia
Anulaci
on de metodos

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
on al lenguaje de programaci
on Java

Introducci
on
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, solo cambian la nocion
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
on al lenguaje de programaci
on Java

Introducci
on
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
excepcion ClassCastException.
Siempre que asignamos una referencia a una clase a una
referencia a una de sus superclases se esta produciendo un
cast de forma automatica y no es necesario especificarlo.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 automaticamente 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
on al lenguaje de programaci
on Java

Introducci
on
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
on al lenguaje de programaci
on Java

Introducci
on
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


implementacion del constructor de la superclase.
Ademas en este ejemplo concreto es obligado hacerlo porque
la superclase no tiene un constructor sin argumentos.
El contructor sin argumentos es el que llama automaticamente
Java, y el compilador habria protestado si no hacemos la
llamada correcta a super().

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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


implcita a super(), inicializa las variables de contenido de
clase actual y luego continua con la ejecucion de las
sentencias del constructor actual.

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 ejecucion de las
sentencias del constructor actual.

141 [124 - 144]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia
Constructores de superclase: Reglas

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 ejecucion de las sentencias del
constructor actual.

En la u
ltima regla, la llamada al constructor de la superclase se
produjo con el constructor sobrecargado, bien implcita o
explcitamente, con cual la inicializacion de variables ya se ha
producido.

142 [124 - 144]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Herencia
Metodos y clases abstract

143 [124 - 144]

Un metodo Java se puede declarar con el modificador


abstract indicando que es un protoripo.
Este tipo de metodos no tienen cuerpo y solo se declara la
cabecera seguida de punto y coma.
Una clase que contenga un metodo abstract debe ser
declarada como abstract y no puede ser instanciada.
Para ello hay que crear una subclase que anule los metodos
abstract proporcionandoles una implementacion.
Si una subclase no anula todos los metodos abstract debe
ser declarada como abstract tambien.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 metodo 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
on al lenguaje de programaci
on Java

Introducci
on
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


metodos abstractos, solo que declarar interfaces tiene sus
ventajas como veremos a continuacion.
Una interfaz define un conjunto de metodos que deben ser
implementadas por una clase.
Los tipos de interfaz act
uan como tipos de clase, se pueden
declarar variables del tipo de una interfaz, los metodos pueden
devolver tipos interfaz. . .
Las interfaces son una declaracion de meritos, 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
ultiple.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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
on al lenguaje de programaci
on Java

Introducci
on
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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Interfaces

148 [145 - 150]

Una declaracion de una interfaz puede contener variables


static final para ser usadas como constantes.
Ademas se permite la declaracion de interfaces vacas, es
decir, que no contienen la especificacion de ning
un metodo o
variable. En este caso se usan como marcadores.
Finalmente, las interfaces pueden formar jerarquas 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 metodos de la interfaz y de todos sus
ancestros.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Interfaces
Ejemplo de jerarqua

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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Interfaces
Ejemplo de jerarqua

150 [145 - 150]

La clase Cosa implementa las interfaces InterfazB e


InterfazC.
Esta u
ltima hereda de la interfaz InterfazA.
La clase debe implementar los metodos que especifican todas
las interfaces del ejemplo.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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, ademas crean un nivel de alcance para sus clases
y las variables y metodos que estan 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 mas 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
on al lenguaje de programaci
on Java

Introducci
on
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 notacion nombre paquete.nombre clase.
Los nombres de paquete estan formados por nombres
separados por puntos.
Esto no implica una jerarqua 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
on al lenguaje de programaci
on Java

Introducci
on
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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Visibilidad
Visibilidad de clases

Por defecto una clase solo 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
olo puede exitir un clase p
ublica por fichero y el nombre de
la clase p
ublica debe ser igual al nombre del fichero.
Al hacer publicas solo 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Visibilidad
Visibilidad de variables y metodos

155 [154 - 157]

Las variables y metodos 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 u
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, ademas de la
visibilidad por defecto, son visibles para las subclases de la
clase, aunque esten definidas fuera del paquete de la clase.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Visibilidad
Visibilidad de variables y metodos

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 metodos en una


subclase, el metodo de anulacion debe ser al memos tan visible
como el metodo anulado. Por ejemplo, podemos anular un metodo
private con un metodo public, pero no al reves.

156 [154 - 157]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 solo son visibles dentro del
paquete.
S
olo puede haber una interfaz p
ublica por fichero.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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
metodo. Por ejemplo:
c l a s s Animal {
class Cerebro {
...
}
}

158 [158 - 171]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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
nadimos
un metodo 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() estan


dentro del ambito 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
on al lenguaje de programaci
on Java

Introducci
on
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 metodos y variables de clase Animal.
Desde el interior del metodo realizaComportamiento() se
podra trabajar con la clase Cerebro y crear instancias de
Cerebro.
El codigo dentro de la clase Cerebro puede invocar al metodo
realizaComportamiento() de Animal.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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 especfica. 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Clases internas
Nos gustara 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 metodos
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 mas.

162 [158 - 171]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
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
on al lenguaje de programaci
on Java

Introducci
on
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 metodo 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Clases internas
Clases internas dentro de metodos

Las clases internas tambien pueden declararse dentro de metodos:


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 ambito del metodo incluidos los miembros de
Animal.

165 [158 - 171]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Clases internas
Clases internas dentro de metodos

Esto tiene limitaciones:


Los metodos tienen una vida limitada, cuando terminan sus
variables locales desaparecen, pero una instancia de Cerebro
vivira mientras queden referencias ella.
Por ello Java debe estar seguro de que cualquier variable local
utilizada por las instancias de Cerebro dentro de la
invocacion del metodo debe estar viva.
Todas las instancias de Cerebro creadas dentro de una
invocacion al metodo 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 metodos 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Clases internas
Ocultaci
on 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 mas 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Clases internas
Ocultaci
on 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Clases internas
Clases internas an
onimas

169 [158 - 171]

Las clases internas anonimas son una extension 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 declaracion de la clase Iterador haciendo:

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Clases internas
Clases internas an
onimas: 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
on al lenguaje de programaci
on Java

Introducci
on
Sintaxis
Objetos en java
Relaciones entre clases

Herencia
Interfaces
Paquetes
Visibilidad
Clases internas

Clases internas
Clases internas an
onimas: Ejemplo

Tambien podemos usarlo para anular metodos 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
on al lenguaje de programaci
on Java

172 [172 - 172]

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Parte II
Usos del lenguaje

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Indice

Threads
Introduccion
Sincronizacion

173 [173 - 173]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion

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
ultiples threads dentro de la misma aplicacion
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
ultiples threads de una aplicacion deben sincronizarse.
No puede haber varios threads intentando acceder a las
mismas variables sin nig
un tipo de coordinacion.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
Composicion
Al usar threads siempre hay dos actores principales:
Uno representa al thread
El otro contiene el metodo que el thread va a ejecutar.
A veces, es posible combinarlos, pero esto no cambia la relacion.

175 [174 - 191]

Un thread nace cuando creamos una instancia de la clase


java.lang.Thread.
El objeto Thread representa un thread real del interprete Java
y sirve como gestor que controla y sincroniza su ejecucion.
Con el podemos comenzar el thread, detenerlo o cancelarlo de
forma temporal.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion

176 [174 - 191]

El contructor de la clase Thread recibe informacion sobre


d
onde debe comenzar la ejecucion del thread.
Para indicar que debe ejecutar el thread existe la interfaz
java.lang.Runnable.
Esta interfaz define el metodo run() que es el que invocara 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 ejecucion del metodo
run() en el objeto Runnable (el objeto destino) que se
paso al thread.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion

177 [174 - 191]

Un Thread recien creado permanece inactivo hasta que


llamanos al metodo start().
Entoces el thread despierta y ejecuta el metodo run() de su
objeto destino.
S
olo se puede llamar a start() una vez en la vida de un
Thread.
El thread se sigue ejecutando hasta que que vuelve el metodo
run() del objeto destino.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
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 podra ser la encargada de dibujar una animacion 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
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
ues el otro. Vamos a a
nadir
concurrencia para que sea una carrera de verdad.

181 [174 - 191]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
Ejemplo: A
nadiendo 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
Recordamos

183 [174 - 191]

La interfaz Runnable permite crear un objeto arbitrario de


destino de un thread.

Este
es el uso general mas importante de la clase Thread.
En la mayora de los casos en los que se tiene que usar threads
se creara una clase que implemente la interfaz Runnable.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
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 metodo run() cuando llamamos a start().

184 [174 - 191]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
Otro modo

Para usar la nueva clase Animacion y llamamos a su metodo


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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
Control de un Thread

Los threads se inician con el metodo start(). Otros metodos de


contenido nos permiten ejecutar de forma explcita la ejecucion de
un Thread:

186 [174 - 191]

El metodo sleep() hace que el thread actual espere el


tiempo establecido, sin consumir mucho tiempo de la CPU.
El metodo interrupt() despierta a un thread que
esta durmiendo o que se encuentra bloqueado en una
operacion de E/S.
Los metodos wait() y join() coordinan la ejecucion de dos
o mas threads.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
Control de un Thread

187 [174 - 191]

A menudo necesitamos decirle a un thread que permanezca


inactivo durante un tiempo.
Para ello llamamos al metodo sleep() o invocar a
Thread.sleep().
En cualquiera de los dos metodos, la llamada hara que el
thread actualmente en ejecucion se retrase el n
umero
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 excepcion InterruptedException si es


interrumpido por otro thread usando interrupt().
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
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 metodo join().
join() hace que hace que quien llame se bloquee hasta que
el thread objetivo muere.
Esta es una forma muy simple de sincronizacion, mas adelante
veremos otros mecanismos.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
Vida de un Thread

Hay que tener cuidado con como terminan los threads:


Un thread puede vivir incluso despues de que la parte de la
aplicacion que la haba 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 aplicacion se finalice.
Podemos marcar ciertos threads para que sean eliminados
cuando solo queden ellos, esto se hace con el metodo
setDaemon().
Cuando los threads demonio son los u
nicos que quedan en la
maquina virtual, estos son eliminados.

190 [174 - 191]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Introduccion
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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion

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
un
indique el sistema operativo.
Java proporciona estructuras sencillas para la sincronizacion
de las actividades de los threads.
La sincronizacion se basa en el concepto de monitores que son
basicamente cerrojos.
Para acceder a un recurso compartido un thread tiene que
obtener el cerrojo.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Acceso en serie a metodos

193 [192 - 204]

La necesidad mas normal de sincronizacion 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Acceso en serie a metodos: Ejemplo

Imaginemos que tenemos un sintetizador de voz. No nos interesa


que m
ultiples 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Acceso en serie a metodos: 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Acceso en serie a metodos: Ejemplo

Esto no es lo que queremos. Marcamos el metodo 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Acceso en serie a metodos: 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Acceso en serie a metodos: Ejemplo

198 [192 - 204]

Vuelven a mezclarse
El motivo es que el cierre esta en el objeto
Se soluciona haciendo el metodo di(String frase) estatico
con lo que el cierre pasa a la clase

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Si se pone mas de un metodo synchronized, solo 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Bloques de c
odigo

La palabra clave synchronized se puede usar para serializar


el acceso a bloques de codigo 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Metodos 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 todava sucede dentro de los
bloques sincronizados y solo 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 despertara e intentara adquirir el nuevo cierre.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Metodos 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Metodos 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Introducci
on
Sincronizaci
on

Sincronizacion
Metodos 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
Ficheros

Indice

Entrada/Salida
E/S Estandar
Ficheros

205 [205 - 206]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
Ficheros

Entrada/Salida

206 [205 - 206]

La E/S de Java esta 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
Ficheros

Entrada/Salida
Primer ejemplo

207 [207 - 208]

El ejemplo mas basico es la entrada y la salida estandar


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 metodos read() y
skip(). El metodo 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 metodos print() y println()
con cualquier tipo basico Java como argumento.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
Ficheros

Entrada/Salida
Ficheros

209 [209 - 218]

El acceso basico se hace a traves 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
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 ) ;

Tambien 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
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 ) ;

Tambien 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
Ficheros

Entrada/Salida
Ficheros

215 [209 - 218]

Al usar un FileInputStream estamos leyendo bytes, en el


c
odigo 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 estan 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 continuacion veremos ejemplos de estos adaptadores
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
Ficheros

Entrada/Salida
Ficheros

InputStreamReader/OutputStreamReader
Convierten un InputStream/OutputStream en un
Reader/Writer.
BufferedInputStream/BufferedOutputStream/BufferedReader/BufferedWriter

A
naden memoria de almacenamiento temporal.
DataInputStream/DataOutputStream
Permiten leer modelos simples de datos como tipos
primitivos y String
PrintWriter/PrintStream
Simplifican la impresion de texto

216 [209 - 218]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

E/S Est
andar
Ficheros

Entrada/Salida
Ficheros: Ejemplo

218 [209 - 218]

Usamos un PrintWriter que nos permite usar el metodo


println
Convertimos el InputStream en un Reader y lo adaptamos
con un BufferedReader para usar readLine
Ademas vemos como podemos usar un FileWriter en lugar
de un FileOutputStream

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Indice

Interfaces Graficas de usuario


Hola mundo
Mini-aplicacion
Entrada de datos
Layouts
Ejercicio

219 [219 - 220]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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 ttulo 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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
nadir la etiqueta a la ventana, se a
nade al content
pane
En Java5 bastara 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 instruccion se hace que la ventana se cierre al darle


al boton de cerrar la ventana.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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 gestionar un evento.
La clase SwingUtilities controla la ejecucion 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Mini-aplicaci
on

En este ejemplo veremos:

225 [225 - 232]

Look and Feel


Establecer botones y etiquetas
A
nadir componentes a contenedores
Poner bordes a componentes
Manejar eventos

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Mini-aplicaci
on

Con UIManager.setLookAndFeel(LOOKANDFEEL);
establecemos la apariencia de la aplicacion.
El parametro 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Mini-aplicaci
on

Para crear un boton 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
nadirle comportamiento usamos un ActionListener:

227 [225 - 232]

button . addActionListener ( this ) ;


...
public void actionPerformed ( ActionEvent e ) {
...
}
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Mini-aplicaci
on

En general, para detectar cuando un usuario hace click en un


bot
on:

228 [225 - 232]

El programa debe tener un objeto que implemente la interfaz


ActionListener
Se debe registrar este objeto como action listener del boton
usando addActionListener
Cuando el usuario hace click el boton lanza un evento de
accion y llama al metodo actionPerformed

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Mini-aplicaci
on

Los componentes Swing pueden generar distintos tipos de eventos:


Lanzador del evento
Click en bot
on, Enter en campo de texto, o
se escoge item de un men
u.
Cierre de la ventana (ventana principal)
Pulsaci
on de un bot
on mientras el cursor
est
a sobre un componente
Se mueve el rat
on sobre un componente
El componente se hace visible
El componente consigue el foco
Cambia la selecci
on 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Mini-aplicaci
on

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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Mini-aplicaci
on

Usamos un contenedor para agrupar los componentes antes de


a
nadirlos 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
nadirmos los componentes y finalmente a
nadimos un borde.

231 [225 - 232]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Mini-aplicaci
on

Para a
nadir 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
nadidos del borde exterior.

232 [225 - 232]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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 metodo 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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
no natural. Es el layout por defecto.
BorderLayout Se usa si queremos que los componentes
ocupen todo el espacio libre.
GridLayout Componentes de mismo tama
no distribuidos en
filas y columnas.
BoxLayout Componentes en una fila o columa con diferentes
espacios entre ellos, distintas alineaciones o tama
nos.
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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Layouts: FlowLayout

236 [234 - 237]

Cuando un contenedor tienen un FlowLayout a


nadimos
elementos en el usando add(componente).
Los elementos se distribuyen en fila si variar su tama
no.
Es el layout por defecto.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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
no para logarlo) incluso si se modifica el tama
no de la
ventana.
Para a
nadir elementos se usa add(componente,
BorderLayout.REGION) donde REGION es una de las
regiones anteriores.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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 metodo setText(String t) para poner todo el
texto o append(String t) para ir a
nadiendo poco a poco.
Con getText() obtenemos todo el texto que contiene.

238 [238 - 246]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Acciones

Podemos establecer el comportamiento de un boton 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 metodo actionPerformed

240 [238 - 246]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Menu

Podemos a
nadir menus a las ventanas. Para ellos creamos un
JMenuBar y se lo a
nadimos al JFrame haciendo
setJMenuBar(menu)

242 [238 - 246]

El JMenuBar esta formado por elementos JMenu


Los JMenu contienen elementos del tipo JMenuItem
Los JMenuItem reciben como argumento una accion.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas de usuario


Popup

Ademas podemos a
nadir 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 boton derecho tenemos
que registrarnos en los eventos del raton.
Usamos el metodo addMouseListener que espera recibir un
MouseListener. Podemos extender la clase MouseAdapter y
anular los metodos que nos interesan.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Hola mundo
Mini-aplicaci
on
Entrada de datos
Layouts
Ejercicio

Interfaces Graficas 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 aplicacion
A
nadimos 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Indice

Interfaces Graficas de usuario II


Checkboxes
Botones de radio
ComboBox
Imagenes
Tabs
SplitPane
Rendimiento

247 [247 - 247]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas de usuario II


Checkboxes

248 [248 - 248]

Un checkbox es un boton especializado que muestra un estado


de seleccion.
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 aparecera al lado de la
marca de seleccion
Para conocer el estado usamos isSelected()
Si queremos modificarlo explcitamente usamos
setSelected(boolean b)
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas 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 aparecera al lado de la
marca de seleccion
Para conocer el estado usamos isSelected()
Si queremos modificarlo explcitamente usamos
setSelected(boolean b)
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas de usuario II


Botones de radio

250 [249 - 250]

Para lograr un comportamiento exclusivo (solo uno de los


botones esta seleccionado) se usa ButtonGroup
Esta clase se encarga de que solo un boton 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas 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 que 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas de usuario II


Im
agenes

252 [252 - 253]

El tratamiento de imagenes en Java es un mundo por si solo.


Veremos una forma sencilla de visualizar imagenes 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas de usuario II


Im
agenes

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 metodo getResource hace que el cargador de clases busque en
los directorios del classpath y en los .jar y devuelva una URL con la
direcci
on del fichero.

253 [252 - 253]

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas de usuario II


Tabs

254 [254 - 255]

En las interfaces graficas es com


un ver solapas que al
pincharlas muestran un contenido.
En Java se puede utilizar un contenedor especial para lograr
ese efecto: JTabbedPane
Para a
nadir elementos al panel se usa el metodo addTab que
creara 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
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas de usuario II


Tabs: Orientaci
on

Podemos cambiar e lugar en el que aparecen las solapas usando el


metodo setTabPlacement(int placement), el parametro puede
valer:

255 [254 - 255]

JTabbedPane.TOP
JTabbedPane.BOTTOM;
JTabbedPane.LEFT
JTabbedPane.RIGHT

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas 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
metodos setRightComponent(Component c) y
setLeftComponent(Component c)
Ahora podemos modificar el tama
no de los paneles con el
rat
on moviendo la barra divisora.

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas de usuario II


SplitPane

257 [256 - 257]

Podemos cambiar la orientacion de la barra de division


utilizando el metodo setOrientation(int orientation).
Los valores permitidos son:
JSplitPane.VERTICAL SPLIT
JSplitPane.HORIZONTAL SPLIT

Si se usa JSplitPane.HORIZONTAL SPLIT podemos a


nadir
los componentes usando setTopComponent(Component
comp) y setBottomComponent(Component comp)

Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas de usuario II


Rendimiento

Ya comentamos que los eventos se manejan en el thread de


eventos y que se tratan secuencialmente.
Ademas sabemos que el dibujado tambien ocurre ah.
Que sucede si hacemos una operacion muy costosa en un evento?
La interfaz queda bloqueada hasta que la operacion termine.
Puede haber distintas operaciones costosas:

258 [258 - 260]

Cargar una imagen grande.


Hacer peticiones a una base de datos remota.
Realizar un calculo complejo
...
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas de usuario II


Rendimiento

Es este tipo de casos deberiamos:


Crear un thread que realice la operacion 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 metodo construct() poniendo el codigo costoso
Anular el metodo finished() poniendo el c
odigo de
actualizacion de la interfaz.
Carlos Varela Paz (cvarela@dc.fi.udc.es)

Introducci
on al lenguaje de programaci
on Java

Threads
Entrada/Salida
Interfaces Gr
aficas de usuario
Interfaces Gr
aficas de usuario II

Checkboxes
Botones de radio
ComboBox
Im
agenes
Tabs
SplitPane
Rendimiento

Interfaces Graficas de usuario II


Rendimiento

260 [258 - 260]

contruct() de vuelve un Object que puede ser utilizado el


m`etodo getValue()
getValue() espera a que el thread generado en
construct() termine si no haba 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
on al lenguaje de programaci
on Java

Vous aimerez peut-être aussi