Transjava 2x1
Transjava 2x1
Transjava 2x1
5. Clases
5.1. Fundamentos . . . . . . . . . . . . . . . .
5.1.1. Forma general de una clase . . . . .
5.1.2. Una clase sencilla . . . . . . . . . .
5.2. Declaraci
on de objetos . . . . . . . . . . .
5.2.1. Operador new . . . . . . . . . . . .
5.3. Asignaci
on de variables referencia a objeto
5.4. M
etodos . . . . . . . . . . . . . . . . . . .
5.4.1. M
etodos con par
ametros . . . . . .
5.5. Constructores . . . . . . . . . . . . . . . .
5.5.1. Constructores con par
ametros . . .
5.6. this . . . . . . . . . . . . . . . . . . . . . .
5.7. Recogida de basura . . . . . . . . . . . . .
5.7.1. M
etodo finalize() . . . . . . . . . .
5.8. Ejemplo de clase: Clase Stack . . . . . . .
Nuevas Tecnologas de la
Programaci
on
Modulo 3: Programacion en Java en entorno UNIX
Andres Cano Utrera
Dpto. Ciencias de la Computacion e I.A
Universidad de Granada
Noviembre de 2009
Indice
1. Introducci
on al lenguaje Java
1.1. Origen de Java . . . . . . . . . . . . . . . .
1.2. Programaci
on orientada a objetos . . . . . .
1.2.1. Los tres principios de la programaci
on
1.3. Primer programa en Java . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
5
5
7
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
10
11
11
13
13
13
14
14
3. Operadores
3.1. Tabla de precedencia de operadores: . . . . . . . . . . . . . . . . . . . . . . . .
14
15
4. Sentencias de control
4.1. Sentencias de selecci
on . .
4.2. Sentencias de iteraci
on . .
4.3. Tratamiento de excepciones
4.4. Sentencias de salto . . . .
4.4.1. break . . . . . . . .
4.4.2. continue . . . . . .
4.4.3. return . . . . . . .
16
16
16
17
17
17
18
18
. . . . . . . . . . .
. . . . . . . . . . .
orientada a objetos
. . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
0-0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
matrices
. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
0-1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
19
19
19
19
20
20
22
22
24
25
26
27
27
27
28
6. M
etodos y clases
6.1. Sobrecarga de m
etodos . . . . . . . . . . . . . . . . .
6.1.1. Sobrecarga con conversi
on autom
atica de tipo
6.1.2. Sobrecarga de constructores . . . . . . . . . .
6.2. Objetos como par
ametros . . . . . . . . . . . . . . . .
6.3. Paso de argumentos . . . . . . . . . . . . . . . . . . .
6.4. Control de acceso . . . . . . . . . . . . . . . . . . . .
6.5. Especificador static . . . . . . . . . . . . . . . . . . .
6.6. Especificador final con datos . . . . . . . . . . . . . .
6.6.1. Constantes blancas . . . . . . . . . . . . . . .
6.7. Clase String . . . . . . . . . . . . . . . . . . . . . . .
6.8. Argumentos de la lnea de o
rdenes . . . . . . . . . . .
6.9. Clases internas . . . . . . . . . . . . . . . . . . . . . .
6.9.1. Clases internas est
aticas: nested classes . . . .
6.9.2. Clases internas no est
aticas: inner classes . . .
6.9.3. Clases internas locales . . . . . . . . . . . . .
6.9.4. Clases internas locales an
onimas . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
30
30
32
33
35
36
37
38
40
44
45
45
47
47
50
58
61
7. Herencia
7.1. Fundamentos . . . . . . . . . . . . . . . . . . . . . .
7.1.1. Una variable de la superclase puede referenciar
7.2. Uso de super . . . . . . . . . . . . . . . . . . . . . .
7.3. Orden de ejecuci
on de constructores . . . . . . . . . .
7.4. Sobreescritura de m
etodos (Overriding) . . . . . . . .
7.5. Selecci
on de m
etodo din
amica . . . . . . . . . . . . .
7.5.1. Aplicaci
on de sobreescritura de m
etodos . . . .
7.6. Clases abstractas . . . . . . . . . . . . . . . . . . . .
7.7. Utilizaci
on de final con la herencia . . . . . . . . . . .
.
a
.
.
.
.
.
.
.
. . . . . . . . . . . . .
un objeto de la subclase
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
63
63
65
66
68
69
70
71
73
75
8. Paquetes e Interfaces
8.1. Paquetes . . . . . . . . . . . . . . . . . . . . . .
8.1.1. Definici
on de un paquete . . . . . . . . .
8.1.2. La variable de entorno CLASSPATH . . .
8.1.3. Ejemplo de paquete: P25/MyPack . . .
8.2. Protecci
on de acceso . . . . . . . . . . . . . . .
8.2.1. Tipos de acceso a miembros de una clase
8.2.2. Tipos de acceso para una clase . . . . . .
8.3. Importar paquetes . . . . . . . . . . . . . . . . .
8.4. Interfaces . . . . . . . . . . . . . . . . . . . . .
8.4.1. Definici
on de una interfaz . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
76
76
76
76
77
78
78
78
81
83
83
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
INDICE
8.4.2.
8.4.3.
8.4.4.
8.4.5.
8.4.6.
0-2
Implementaci
on de una interfaz . . . . . . . . . . .
Acceso a implementaciones a trav
es de referencias de
Implementaci
on parcial . . . . . . . . . . . . . . . .
Variables en interfaces . . . . . . . . . . . . . . . .
Las interfaces se pueden extender . . . . . . . . . .
9. Gesti
on de excepciones
9.1. Fundamentos . . . . . . . . . . . . . . .
9.2. Tipos de excepci
on . . . . . . . . . . . .
9.3. Excepciones no capturadas . . . . . . . .
9.4. try y catch . . . . . . . . . . . . . . . . .
9.4.1. Descripci
on de una excepci
on . . .
9.5. Clausula catch m
ultiple . . . . . . . . . .
9.6. Sentencias try anidadas . . . . . . . . . .
9.7. Lanzar excepciones explcitamente: throw
9.8. Sentencia throws . . . . . . . . . . . . .
9.9. Sentencia finally . . . . . . . . . . . . . .
9.10. Subclases de excepciones propias . . . . .
. . . . . .
la interfaz
. . . . . .
. . . . . .
. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
84
85
85
86
87
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
89
. 89
. 89
. 90
. 91
. 92
. 92
. 95
. 96
. 98
. 99
. 100
10.Programaci
on Multihilo (Multihebra)
10.1. El hilo principal . . . . . . . . . . . . . . . . . . . .
10.2. Creaci
on de un hilo . . . . . . . . . . . . . . . . . .
10.2.1. Implementaci
on del interfaz Runnable . . . .
10.2.2. Extensi
on de la clase Thread . . . . . . . . .
10.2.3. Elecci
on de una de las dos opciones . . . . .
10.3. Creaci
on de m
ultiples hilos . . . . . . . . . . . . . .
10.4. Utilizaci
on de isAlive() y join() . . . . . . . . . . . .
10.5. Prioridades de los hilos . . . . . . . . . . . . . . . .
10.6. Sincronizaci
on . . . . . . . . . . . . . . . . . . . . .
10.6.1. Uso de m
etodos sincronizados . . . . . . . .
10.6.2. Sentencia synchronized . . . . . . . . . . . .
10.7. Comunicaci
on entre hilos . . . . . . . . . . . . . . .
10.7.1. Interbloqueos . . . . . . . . . . . . . . . . .
10.8. Suspender, reanudar y terminar hilos . . . . . . . .
10.8.1. En Java 1.1 y anteriores: suspend(), resume()
10.8.2. En Java 2 . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
y
.
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
stop()
. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
103
103
104
104
106
107
109
111
114
116
116
119
120
125
127
127
131
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
134
134
134
137
137
137
139
140
142
143
149
149
151
151
151
151
152
152
153
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
INDICE
0-3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
153
153
154
155
155
155
157
157
158
158
159
159
160
161
162
162
162
164
164
165
167
168
168
170
171
172
173
173
173
173
175
12.Swing
12.1. Introducci
on a las Java Foundation Classes (JFC) .
12.2. Introducci
on a Swing . . . . . . . . . . . . . . . . .
12.3. Primeros programas con Swing . . . . . . . . . . . .
12.4. Clase javax.swing.JComponent . . . . . . . . . . . .
12.5. Clases contenedoras . . . . . . . . . . . . . . . . . .
12.5.1. Contenedores pesados . . . . . . . . . . . . .
12.5.2. Contenedores ligeros . . . . . . . . . . . . .
12.6. Etiquetas, botones y cajas de comprobaci
on (check)
12.7. Men
us, barras de utilidades y acciones . . . . . . . .
12.8. Sliders, barras de progreso y Scrollbars . . . . . . .
12.9. Listas y cajas combinadas (combo boxes) . . . . . .
12.10.Componentes para entrada de texto . . . . . . . . .
12.11.Di
alogos predefinidos (choosers) . . . . . . . . . . .
12.12.Tablas y
arboles . . . . . . . . . . . . . . . . . . . .
12.13.Dibujando con Swing . . . . . . . . . . . . . . . . .
12.13.1.Soporte de doble buffer . . . . . . . . . . . .
12.13.2.Los m
etodos de dibujo en Swing . . . . . . .
12.13.3.Propiedades adicionales de los componentes .
12.13.4.Algunos aspectos sobre el dibujo en Swing .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
176
176
176
178
180
181
181
182
185
190
197
199
201
202
202
202
203
204
204
205
INDICE
0-4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
255
255
255
255
257
258
258
259
259
260
260
260
262
263
264
266
268
269
271
273
275
280
282
282
INDICE
0-5
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
clases
. . . .
. . . .
. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
285
288
288
291
293
293
294
294
295
296
299
301
301
302
302
304
304
AL LENGUAJE JAVA
INTRODUCCION
1.
Introducci
on al lenguaje Java
1.1.
Origen de Java
Linaje de Java
Java deriva su sintaxis de C y sus caractersticas orientadas a objetos
las deriva casi todas de C++.
El nacimiento de la programaci
on moderna
La aparici
on del lenguaje C en la decada de los 70 supuso para algunos
el comienzo de la edad moderna de los lenguajes de programaci
on.
Este lenguaje fue un lenguaje potente, eficiente y estructurado
que se poda aprender con cierta facilidad. C haca uso del
paradigma de la programaci
on estructurada.
Adem
as se dice que era un lenguaje para el programador (fue
dise
nado, implementado y desarrollado por programadores reales
que reflejaron su forma de entender la programaci
on).
A finales de los 70 y principios de los 80, C domin
o el mundo de la
programaci
on y todava hoy se usa bastante.
C++ aparece para poder construir programas cada vez m
as complejos,
mediante el uso de la programaci
on orientada a objetos.
A finales de los 80 y principios de los 90, el control lo tena la PDO y
C++.
Pareca que C++ era el lenguaje perfecto: alta eficiencia y uso del
paradigma orientado a objetos.
El desarrollo de Internet y la WWW provoc
o una nueva revoluci
on en
el mundo de la programacion.
Creaci
on de Java
La primera version de Java (llamada Oak) fue concebida en Sun
Microsystems Inc. en 1991 (por James Gosling, Patrick Naughton,
Chris Warth, Ed Frank y Mike Sheridan).
El anuncio p
ublico de Java se hizo en 1995.
AL LENGUAJE JAVA
INTRODUCCION
AL LENGUAJE JAVA
INTRODUCCION
El c
odigo binario: bytecode
La salida del compilador de Java no es codigo ejecutable, sino un
c
odigo binario intermedio (bytecode) que contiene un conjunto de
instrucciones altamente optimizadas, y que luego podr
an ejecutarse
mediante una maquina virtual (el interprete de Java).
AL LENGUAJE JAVA
INTRODUCCION
AL LENGUAJE JAVA
INTRODUCCION
Din
amico: Java no conecta todos los modulos de una aplicaci
on hasta
el tiempo de ejecucion.
1.2.
Programaci
on orientada a objetos
Encapsulamiento
Es un mecanismo que permite juntar el c
odigo y los datos que el c
odigo
manipula en una misma entidad.
El encapsulamiento es como un envoltorio protector que evita que
otro c
odigo que esta fuera pueda acceder arbitrariamente al c
odigo o a
los datos.
El acceso al c
odigo y a los datos se hace de forma controlada a traves
de una interfaz bien definida.
AL LENGUAJE JAVA
INTRODUCCION
AL LENGUAJE JAVA
INTRODUCCION
1.3.
Ejemplo: P1/Example.java
/*
Este es un primer programa de prueba.
Este archivo se llama "Example.java"
*/
class Example {
// El programa comienza con una llamada a main().
public static void main(String args[]) {
System.out.println("Hola mundo.");
}
}
Cuestiones sobre nomenclatura
En Java, un fichero fuente contiene una o m
as definiciones de clase.
El nombre de un fichero fuente suele ser el mismo de la clase que
contenga.
Los ficheros de programas en Java se guardar
an con la extensi
on .java
Debemos asegurarnos que coinciden may
usculas y min
usculas en
nombre de fichero y clase.
Compilaci
on del programa con jdk
Se ejecutar
a la orden:
javac Example.java
El compilador javac crea un archivo llamado Example.class que
contiene el bytecode compilado del programa.
Ejecuci
on del programa con jdk
Se ejecutar
a la orden:
java Example
La salida del programa sera:
Hola mundo
AL LENGUAJE JAVA
INTRODUCCION
An
alisis del primer programa de prueba
Comentarios de varias lneas
/*
Este es un primer programa de prueba.
Este archivo se llama "Example.java"
*/
Definicion de la clase
class Example {
La definicion de una clase, incluyendo todos sus miembros, estara entre
la llave de apertura ({) y la de cierre (}).
Comentario de una lnea
// El programa comienza con una llamada a main().
Cabecera del metodo main
public static void main(String args[]) {
Todas las aplicaciones Java comienzan su ejecucion llamando a
main.
La palabra public es un especificador de acceso (puede usarse fuera
de la clase en la que se declara).
Otro especificador de acceso es el private (puede usarse solo en
metodos de la misma clase).
La palabra static permite que main sea llamado sin tener que crear
un objeto de esta clase (Example).
La palabra void indica que main no devuelve ning
un valor.
El parametro String args[] declara una matriz de instancias de la
clase String que corresponde a los argumentos de la lnea de
ordenes.
Siguiente lnea de codigo:
System.out.println("Hola mundo.");
Esta lnea visualiza la cadena "Hola mundo" en la pantalla.
2.
2.1.
Tipos simples
2.2.
Enteros
Enteros
Todos los tipos son enteros con signo.
byte: 8 bits. [128, 127]
short: 16 bits. [32,768, 32,767]
int: 32 bits. [2,147,483,648, 2,147,483,647]
long: 64 bits. [9,223,372,036,854,775,808, 9,223,372,036,854,775,807]
Tipos en coma flotante
float: 32 bits. [3, 4 1038 , 3, 4 1038 ]
double: 64 bits. [1, 7 10308 , 1, 7 10308 ]
10
Literales
11
Car
acter
Se encierran entre comillas simples.
Se pueden usar secuencias de escape:
\141 (3 dgitos): Codigo en octal de la letra a
\u0061 (4 dgitos): Codigo en hexadecimal (car
acter Unicode) de la
letra a
\: Comilla simple
\\: Barra invertida
\r: Retorno de carro
\t: Tabulador \b: Retroceso
2.4.
12
Conversi
on de tipos
2.3.
int a;
byte b;
// ...
b = (byte) a;
Promoci
on de tipo autom
atica en expresiones
Adem
as de las asignaciones, tambien se pueden producir ciertas
conversiones automaticas de tipo en las expresiones.
Variables
La forma b
asica de declaracion de variables es:
De clase:
De metodo:
Los
ambitos se pueden anidar aunque las variables de un bloque interior
no pueden tener el mismo nombre de alguna de un bloque exterior.
Dentro de un bloque, las variables pueden declararse en cualquier
momento pero solo pueden usarse despues de declararse.
2.5.
13
OPERADORES
Vectores y matrices
2.5.3.
Ejemplo:
int[] a2=new int[3];
char[][] twoD2=new char[3][4];
Vectores
Declaraci
on
tipo nombre-vector[];
tipo[] nombre-matriz;
14
2.6.
Esto s
olo declara nombre-vector como vector de tipo, y le asigna null.
Punteros
Reserva de la memoria
nombre-vector=new tipo[tama~
no]
Esto hace que se inicialicen a 0 todos los elementos.
Declaraci
on y reserva al mismo tiempo
int vector_int[]=new int[12];
Inicializaci
on al declarar el vector int vector_int[]={3,2,7}
El interprete de Java comprueba siempre que no nos salimos de los
ndices del vector.
2.5.2.
Matrices multidimensionales
3.
Operadores
35
8
OPERADORES
15
SENTENCIAS DE CONTROL
16
4.
Ejemplo 2
-8
-4
4.1.
11111000
>>2
11111100
if( Boolean ) {
sentencias;
}
else {
sentencias;
}
int a=-1;
a = a >>> 24;
Si vemos las operaciones en binario:
3.1.
.
++
*
+
<<
<
==
&
^
|
&&
||
?:
=
switch
switch( expr1 ) {
case expr2:
sentencias;
break;
case expr3:
sentencias;
break;
default:
sentencias;
break;
}
()
!
~
% (se puede aplicar a flotantes)
>>>
<=
Sentencias de selecci
on
if/else
Ejemplo
Sentencias de control
>=
4.2.
Sentencias de iteraci
on
Bucles for
op=
*=
/=
%=
+=
-=
etc.)
SENTENCIAS DE CONTROL
17
Bucles while
while( Boolean ) {
sentencias;
}
Bucles do/while
do {
sentencias;
}while( Boolean );
4.3.
Tratamiento de excepciones
Excepciones: try-catch-throw-throws-finally
try {
sentencias;
} catch( Exception ) {
sentencias;
}
4.4.
Sentencias de salto
break
SENTENCIAS DE CONTROL
4.4.2.
18
continue
return
CLASES
5.
19
Clases
5.1.
Fundamentos
CLASES
5.2.
20
Declaraci
on de objetos
class Box {
double width;
double height;
double depth;
}
5.2.1.
Operador new
CLASES
21
Ejemplo: P2/BoxDemo.java
/* Un programa que utiliza la clase Box
Este archivo se debe llamar BoxDemo.java */
class Box {
double width;
double height;
double depth;
}
// Esta clase declara un objeto del tipo Box
class BoxDemo {
public static void main(String args[]) {
Box mybox = new Box();
double vol;
// asigna valores a las variables de instancia de mybox
mybox.width = 10;
mybox.height = 20;
mybox.depth = 15;
// calcula el volumen de la caja
vol = mybox.width * mybox.height * mybox.depth;
System.out.println("El volumen es " + vol);
}
}
CLASES
5.3.
22
Asignaci
on de variables referencia a objeto
5.4.
M
etodos
CLASES
23
Ejemplo: P3/BoxDemo4.java
/* Un programa que utiliza la clase Box
Este archivo se debe llamar BoxDemo4.java
*/
class Box {
double width;
double height;
double depth;
// calcula y devuelve el volumen
double volume() {
return width * height * depth;
}
}
// Esta clase declara un objeto del tipo Box
class BoxDemo4 {
public static void main(String args[]) {
Box mybox1 = new Box();
Box mybox2 = new Box();
double vol;
// asigna valores a las variables de instancia de mybox
mybox1.width = 10;
mybox1.height = 20;
mybox1.depth = 15;
CLASES
5.4.1.
vol = mybox1.volume();
System.out.println("El volumen es " + vol);
vol = mybox2.volume();
System.out.println("El volumen es " + vol);
}
M
etodos con par
ametros
Ejemplo: P4/BoxDemo5.java
mybox2.width = 3;
mybox2.height = 6;
mybox2.depth = 9;
24
}
}
CLASES
5.5.
25
Constructores
CLASES
5.5.1.
26
Constructores con par
ametros
Ejemplo: P6/BoxDemo7.java
class Box {
double width;
double height;
double depth;
Box() {
System.out.println("Constructor de Box");
width = 10;
height= 10;
depth = 10;
}
Box(double w,double h,double d) {
width = w;
height = h;
depth = d;
}
double volume() {
return width * height * depth; }
}
class BoxDemo7 {
public static void main(String args[]) {
Box mybox1 = new Box(10,20,15);
Box mybox2 = new Box(3,6,9);
Box mybox3 = new Box();
double vol;
vol = mybox1.volume();
System.out.println("El volumen es " + vol);
vol = mybox2.volume();
System.out.println("El volumen es " + vol);
vol = mybox3.volume();
System.out.println("El volumen es " + vol);
}
}
CLASES
5.6.
27
this
5.7.
Recogida de basura
M
etodo finalize()
CLASES
5.8.
28
CLASES
29
class TestStack {
public static void main(String args[]) {
Stack mystack1 = new Stack();
Stack mystack2 = new Stack();
// introduce algunos n
umeros en la pila
for(int i=0; i<10; i++) mystack1.push(i);
for(int i=10; i<20; i++) mystack2.push(i);
// extrae los n
umeros de la pila
System.out.println("Contenido de la pila mystack1:");
for(int i=0; i<10; i++)
System.out.println(mystack1.pop());
System.out.println("Contenido de la pila mystack2:");
for(int i=0; i<10; i++)
System.out.println(mystack2.pop());
}
}
METODOS
Y CLASES
6.
30
M
etodos y clases
6.1.
Sobrecarga de m
etodos
Consiste en que dos o mas metodos de una clase tienen el mismo nombre,
pero con listas de parametros distintos.
La sobrecarga es usada en Java para implementar el polimorfismo.
Java utiliza el tipo y/o el n
umero de argumentos como gua para ver a
cual metodo llamar.
El tipo que devuelve un metodo es insuficiente para distinguir dos
versiones de un metodo.
Ejemplo: P8/Overload.java
class OverloadDemo {
void test() {
System.out.println("Sin parametros");
}
// Sobrecarga el metodo test con un par
ametro entero
void test(int a) {
System.out.println("a: " + a);
}
// Sobrecarga el metodo test con dos parametros enteros
void test(int a, int b) {
System.out.println("a y b: " + a + " " + b);
}
// Sobrecarga el metodo test con un par
ametro double
double test(double a) {
System.out.println("double a: " + a);
return a*a;
}
}
METODOS
Y CLASES
31
class Overload {
public static void main(String args[]) {
OverloadDemo ob = new OverloadDemo();
double result;
// llama a todas las versiones de test()
ob.test();
ob.test(10);
ob.test(10, 20);
result = ob.test(123.2);
System.out.println("Resultado de ob.test(123.2): " + result);
}
}
La salida del programa sera:
Sin parametros
a: 10
a y b: 10 20
a double: 123.2
Resultado de ob.test(123.2): 15178.2
METODOS
Y CLASES
6.1.1.
32
Java busca una version del metodo cuyos parametros actuales coincidan
con los parametros formales, en n
umero y tipo. Si el tipo no es exacto
puede que se aplique conversi
on autom
atica de tipos.
class OverloadDemo {
void test() {
System.out.println("Sin parametros");
}
// Sobrecarga el metodo test con dos parametros enteros
void test(int a, int b) {
System.out.println("a y b: " + a + " " + b);
}
// Sobrecarga el metodo test con un par
ametro double
void test(double a) {
System.out.println("Dentro de test(double) a: " + a);
}
}
class Overload {
public static void main(String args[]) {
OverloadDemo ob = new OverloadDemo();
int i = 88;
ob.test();
ob.test(10, 20);
ob.test(i); // esto llama a test(double)
ob.test(123.2); // esto llama a test(double)
}
}
METODOS
Y CLASES
6.1.2.
33
Sobrecarga de constructores
Adem
as de los metodos normales, tambien pueden sobrecargarse los
constructores.
Ejemplo: P9/OverloadCons.java
class Box {
double width;
double height;
double depth;
Box(double w, double h, double d) {
width = w;
height = h;
depth = d;
}
Box() {
width = -1; // utiliza -1 para indicar
height = -1; // que una caja no est
a
depth = -1; // inicializada
}
Box(double len) {
width = height = depth = len;
}
double volume() {
return width * height * depth;
}
}
METODOS
Y CLASES
class OverloadCons {
public static void
Box mybox1 = new
Box mybox2 = new
Box mycube = new
double vol;
34
main(String args[]) {
Box(10, 20, 15);
Box();
Box(7);
vol = mybox1.volume();
System.out.println("El volumen de mybox1 es " + vol);
vol = mybox2.volume();
System.out.println("El volumen de mybox2 es " + vol);
vol = mycube.volume();
System.out.println("El volumen de mycube es " + vol);
}
}
METODOS
Y CLASES
6.2.
35
METODOS
Y CLASES
6.3.
36
Paso de argumentos
METODOS
Y CLASES
37
class CallByRef {
public static void main(String args[]) {
Test ob = new Test(15, 20);
System.out.println("ob.a y ob.b antes de la llamada: " +
ob.a + " " + ob.b);
ob.meth(ob);
System.out.println("ob.a y ob.b despu
es de la llamada: " +
ob.a + " " + ob.b);
}
}
6.4.
METODOS
Y CLASES
class AccessTest {
public static void main(String args[]) {
Test ob = new Test();
//
private: S
olo es accesible por miembros de la misma clase.
}
Control de acceso
38
6.5.
Especificador static
class Test {
int a; // acceso por defecto
public int b; // acceso publico
private int c; // acceso privado
void setc(int i) { // establece el valor de c
c = i;
}
int getc() { // obtiene el valor de c
return c;
}
}
METODOS
Y CLASES
39
METODOS
Y CLASES
40
Ejemplo: P14/UseStatic.java
6.6.
class UseStatic {
static int a = 3;
static int b;
int
int
int
int
int
FILE_NEW = 1;
FILE_OPEN = 2;
FILE_SAVE = 3;
FILE_SAVEAS = 4;
FILE_QUIT = 5;
METODOS
Y CLASES
41
METODOS
Y CLASES
fd1.print("fd1");
System.out.println("Creating new FinalData");
FinalData fd2 = new FinalData();
fd1.print("fd1");
fd2.print("fd2");
42
}
}
Salida del programa
fd1: i4 = 1, i5 = 2
Creating new FinalData
fd1: i4 = 1, i5 = 2
fd2: i4 = 16, i5 = 2
METODOS
Y CLASES
Ejemplo con par
ametros final en un m
etodo:
P66/FinalArguments.java
class Gizmo {
public void spin() {}
}
public class FinalArguments {
void with(final Gizmo g) {
//! g = new Gizmo(); // Ilegal -- g es final
g.spin();
}
void without(Gizmo g) {
g = new Gizmo(); // OK -- g no es final
g.spin();
}
// void f(final int i) { i++; } // No se puede cambiar
// S
olo se puede leer de un tipo de dato primitivo:
int g(final int i) { return i + 1; }
public static void main(String[] args) {
FinalArguments bf = new FinalArguments();
Gizmo g = new Gizmo();
bf.without(g);
bf.with(g);
}
}
43
METODOS
Y CLASES
6.6.1.
44
Constantes blancas
METODOS
Y CLASES
6.7.
45
Clase String
Es una clase muy usada, que sirve para almacenar cadenas de caracteres
(incluso los literales).
Los objetos String no pueden modificar su contenido.
Los objetos StringBuffer si que pueden modificarse.
El operador + permite concatenar cadenas.
El metodo boolean equals(String objeto) compara si dos cadenas
son iguales.
El metodo int length() obtiene la longitud de una cadena.
El metodo char charAt(int pos) obtiene el car
acter que hay en la
posici
on pos.
Ejemplo: P15/StringDemo2.java
// Muestra la utilizaci
on de algunos metodo de la clase String
class StringDemo2 {
public static void main(String args[]) {
String strOb1 = "Primera cadena";
String strOb2 = "Segunda cadena";
String strOb3 = strOb1;
System.out.println("La longitud de strOb1 es: " +
strOb1.length());
System.out.println("El car
acter de la posici
on 3 de strOb1 es: " +
strOb1.charAt(3));
if(strOb1.equals(strOb2))
System.out.println("strOb1 == strOb2");
else
System.out.println("strOb1 != strOb2");
if(strOb1.equals(strOb3))
System.out.println("strOb1 == strOb3");
else
System.out.println("strOb1 != strOb3");
}
}
METODOS
Y CLASES
6.8.
Argumentos de la lnea de
ordenes
Ejemplo: P16/CommandLine.java
// Presenta todos los argumentos de la l
nea de
ordenes
class CommandLine {
public static void main(String args[]) {
for(int i=0; i<args.length; i++)
System.out.println("args[" + i + "]: " +
args[i]);
}
}
Si ejecutamos este programa con:
java CommandLine esto es una prueba 100 -1
obtendremos como salida:
args[0]:
args[1]:
args[2]:
args[3]:
args[4]:
args[5]:
esto
es
una
prueba
100
-1
46
METODOS
Y CLASES
6.9.
47
Clases internas
6
7
8
9
10
11
12
13
14
15
16
17
18
6.9.1.
METODOS
Y CLASES
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
48
METODOS
Y CLASES
49
import java.util.Hashtable;
import java.util.Enumeration;
/** Class representing an undirected graph composed
* of nodes. The node class is a top-level class
* nested within the Graph1 class.
*/
public class Graph1 {
private Hashtable nodeList = new Hashtable();
9
10
11
12
13
14
15
METODOS
Y CLASES
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
50
METODOS
Y CLASES
6.9.2.
51
METODOS
Y CLASES
Los metodos de una clase interna no estatica tienen acceso a todas las
variables y metodos de la clase externa de la misma forma que cualquier
otro metodo no estatico de la clase externa.
Ejemplo de clase interna no est
atica: P60/InnerClassDemo.java
1
2
3
4
5
6
7
8
9
10
11
12
class Outer {
int outer_x = 100;
void test() {
Inner inner = new Inner();
inner.display();
}
class Inner {
void display() {
System.out.println("display: outer_x = " + outer_x);
}
}
}
13
14
15
16
17
18
19
class InnerClassDemo {
public static void main(String args[]) {
Outer outer = new Outer();
outer.test();
}
}
52
interface Selector {
boolean end();
Object current();
void next();
}
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
METODOS
Y CLASES
53
METODOS
Y CLASES
10
11
12
13
14
import java.util.Hashtable;
import java.util.Enumeration;
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
54
METODOS
Y CLASES
55
41
42
43
44
45
46
47
50
51
54
55
56
57
53
52
METODOS
Y CLASES
56
48
49
5
6
7
8
9
10
11
12
13
14
class WithInner {
class Inner {}
}
public class InheritInner extends WithInner.Inner {
//! InheritInner() {} // Wont compile
InheritInner(WithInner wi) {
wi.super();
}
public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
} ///:
METODOS
Y CLASES
57
6.9.3.
58
import java.applet.*;
import java.awt.event.*;
/*
<applet code="InnerClassDemo" width=200 height=100>
</applet>
*/
public class InnerClassDemo extends Applet {
public void init() {
addMouseListener(new MyMouseAdapter());
}
class MyMouseAdapter extends MouseAdapter {
public void mousePressed(MouseEvent me) {
showStatus("Mouse Pressed");
}
}
}
METODOS
Y CLASES
class Outer {
int outer_x = 100;
void test() {
for(int i=0; i<5; i++) {
class Inner {
void display() {
System.out.println("display: outer_x = " + outer_x);
}
}
Inner inner = new Inner();
inner.display();
}
}
}
class InnerClassDemo {
public static void main(String args[]) {
Outer outer = new Outer();
outer.test();
}
}
outer_x
outer_x
outer_x
outer_x
outer_x
=
=
=
=
=
100
100
100
100
100
METODOS
Y CLASES
59
METODOS
Y CLASES
Los objetos de una clase interna local pueden tener una vida m
as
all
a del
ambito en que se declaro la clase interna.
Los metodos de las clases internas locales tienen acceso a sus propios
campos, las variables locales final, los argumentos del metodo final y
los campos del objeto de la clase externa en que este incluida.
Ejemplo: P128/Parcel5.java
1
2
3
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Ejemplo: P128/Parcel5.java
1
2
60
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public MyResult() {
normalField = 2;
}
public double getAnswer() {
return (double) input1 / input2
- equationInput
+ localVar[2]
- normalField;
}
18
19
20
21
22
23
24
25
26
}
return new MyResult();
27
28
29
30
31
32
33
34
35
36
METODOS
Y CLASES
6.9.4.
61
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
62
METODOS
Y CLASES
20
HERENCIA
7.
63
Herencia
7.1.
Fundamentos
Para definir que una subclase hereda de otra clase usamos extends.
Java no permite la herencia m
ultiple.
La subclase no puede acceder a aquellos miembros declarados como
private en la superclase.
Ejemplo: P17/DemoBoxWeight.java
// Este programa utiliza la herencia para extender la clase Box.
class Box {
double width;
double height;
double depth;
Box(Box ob) {
width = ob.width;
height = ob.height;
depth = ob.depth;
}
Box(double w, double h, double d) {
width = w;
height = h;
depth = d;
}
HERENCIA
64
Box() {
width = -1;
height = -1;
depth = -1;
}
Box(double len) {
width = height = depth = len;
}
double volume() {
return width * height * depth;
}
}
class BoxWeight extends Box {
double weight; // peso de la caja
BoxWeight(double w, double h, double d, double m) {
width = w;
height = h;
depth = d;
weight = m;
}
}
class DemoBoxWeight {
public static void main(String args[]) {
BoxWeight mybox1 = new BoxWeight(10, 20, 15, 34.3);
BoxWeight mybox2 = new BoxWeight(2, 3, 4, 0.076);
double vol;
vol = mybox1.volume();
System.out.println("Volumen de mybox1 es " + vol);
System.out.println("Peso de mybox1 es " + mybox1.weight);
System.out.println();
vol = mybox2.volume();
System.out.println("Volumen de mybox2 es " + vol);
System.out.println("Peso de mybox2 es " + mybox2.weight);
}
}
HERENCIA
7.1.1.
65
HERENCIA
7.2.
//
}
}
Uso de super
66
HERENCIA
67
HERENCIA
7.3.
68
Orden de ejecuci
on de constructores
HERENCIA
7.4.
69
Sobreescritura de m
etodos (Overriding)
HERENCIA
7.5.
70
Selecci
on de m
etodo din
amica
HERENCIA
class Dispatch {
public static void main(String args[]) {
A a = new A(); // objeto de tipo A
B b = new B(); // objeto de tipo B
C c = new C(); // objeto de tipo C
A r; // obtiene una referencia del tipo
r = a; // r hace referencia a un objeto
r.callme(); // llama al metodo callme()
r = b; // r hace referencia a un objeto
r.callme(); // llama al metodo callme()
r = c; // r hace referencia a un objeto
r.callme(); // llama al metodo callme()
}
}
7.5.1.
71
A
A
de A
B
de B
C
de C
Aplicaci
on de sobreescritura de m
etodos
Ejemplo: P23/FindAreas.java
class Figure {
double dim1;
double dim2;
Figure(double a, double b) {
dim1 = a;
dim2 = b;
}
double area() {
System.out.println("Area para Figure es indefinida.");
return 0;
}
}
HERENCIA
72
HERENCIA
7.6.
73
Clases abstractas
HERENCIA
74
HERENCIA
7.7.
75
Utilizaci
on de final con la herencia
PAQUETES E INTERFACES
8.
76
Paquetes e Interfaces
8.1.
Paquetes
Definici
on de un paquete
final class A {
// ...
}
// La clase siguiente no es v
alida.
class B extends A { // ERROR! No se puede crear una subclase de A
// ...
}
PAQUETES E INTERFACES
8.1.2.
77
PAQUETES E INTERFACES
class AccountBalance {
public static void main(String args[]) {
Balance current[] = new Balance[3];
current[0] =
current[1] =
current[2] =
for(int i=0;
Compilaci
on: Situarse en directorio prueba y ejecutar
javac PaquetePrueba.java o bien situarse en directorio padre de
prueba y ejecutar javac prueba/PaquetePrueba.java
Ejecuci
on: Situarse en directorio padre de prueba y ejecutar
java prueba.PaquetePrueba o bien a
nadir directorio padre de
prueba a CLASSPATH y ejecutar java prueba.PaquetePrueba
desde cualquier directorio.
8.1.3.
78
}
}
8.2.
Protecci
on de acceso
package MyPack;
Paquetes: Act
uan como recipientes de clases y otros paquetes
subordinados.
class Balance {
String name;
double bal;
Clases: Act
uan como recipientes de datos y codigo.
Balance(String n, double b) {
name = n;
bal = b;
}
void show() {
if(bal<0)
System.out.print("-->> ");
System.out.println(name + ": $" + bal);
}
}
8.2.1.
Desde m
etodo en ...
private
sin modif.
protected
public
misma clase
no
no
no
no
no
no
no
8.2.2.
Acceso por defecto: Accesible solo por codigo del mismo paquete
Acceso public: Accesible por cualquier codigo
PAQUETES E INTERFACES
Ejemplo: P26
package p1;
public class Protection {
int n = 1;
private int n_pri = 2;
protected int n_pro = 3;
public int n_pub = 4;
public Protection() {
System.out.println("constructor base ");
System.out.println("n = " + n);
System.out.println("n_pri = " + n_pri);
System.out.println("n_pro = " + n_pro);
System.out.println("n_pub = " + n_pub);
}
}
class Derived extends Protection {
Derived() {
System.out.println("constructor de Derived");
System.out.println("n = " + n);
// System.out.println("n_pri = " + n_pri);
System.out.println("n_pro = " + n_pro);
System.out.println("n_pub = " + n_pub);
}
}
class SamePackage {
SamePackage() {
Protection p = new Protection();
System.out.println("constructor de SamePackage");
System.out.println("n = " + p.n);
// System.out.println("n_pri = " + p.n_pri);
System.out.println("n_pro = " + p.n_pro);
System.out.println("n_pub = " + p.n_pub);
}
}
79
PAQUETES E INTERFACES
package p2;
class Protection2 extends p1.Protection {
Protection2() {
System.out.println("constructor de Protection2");
// System.out.println("n = " + n);
// System.out.println("n_pri = " + n_pri);
System.out.println("n_pro = " + n_pro);
System.out.println("n_pub = " + n_pub);
}
}
class OtherPackage {
OtherPackage() {
p1.Protection p = new p1.Protection();
System.out.println("other package constructor");
// System.out.println("n = " + p.n);
// System.out.println("n_pri = " + p.n_pri);
// System.out.println("n_pro = " + p.n_pro);
System.out.println("n_pub = " + p.n_pub);
}
}
80
PAQUETES E INTERFACES
8.3.
81
PAQUETES E INTERFACES
Importar paquetes
82
import MyPack.*;
class TestBalance {
public static void main(String args[]) {
/* Como Balance es p
ublica, se puede utilizar la
clase Balance y llamar a su constructor. */
Balance test = new Balance("J. J. Jaspers", 99.88);
test.show(); // tambi
en se puede llamar al metodo show()
}
}
PAQUETES E INTERFACES
8.4.
83
Interfaces
Son sint
acticamente como las clases, pero no tienen variables de instancia y
los metodos declarados no contienen cuerpo.
Se utilizan para especificar lo que debe hacer una clase, pero no c
omo
lo hace.
Una clase puede implementar cualquier n
umero de interfaces.
8.4.1.
Definici
on de una interfaz
PAQUETES E INTERFACES
84
Ejemplo definici
on de interfaz
interface Callback {
void callback(int param);
}
8.4.2.
Implementaci
on de una interfaz
PAQUETES E INTERFACES
8.4.3.
85
PAQUETES E INTERFACES
8.4.4.
86
Implementaci
on parcial
Variables en interfaces
PAQUETES E INTERFACES
87
PAQUETES E INTERFACES
Ejemplo: P31/IFExtend.java
interface A {
void meth1();
void meth2();
}
interface B extends A {
void meth3();
}
class MyClass implements B {
public void meth1() {
System.out.println("Implemento meth1().");
}
public void meth2() {
System.out.println("Implemento meth2().");
}
public void meth3() {
System.out.println("Implemento meth3().");
}
}
class IFExtend {
public static void main(String arg[]) {
MyClass ob = new MyClass();
ob.meth1();
ob.meth2();
ob.meth3();
}
}
88
DE EXCEPCIONES
GESTION
9.
89
Gesti
on de excepciones
Una excepci
on es una condicion anormal que surge en una secuencia de
c
odigo durante la ejecucion de un programa. O sea, es un error en tiempo
de ejecuci
on.
9.1.
DE EXCEPCIONES
GESTION
9.2.
La gesti
on de excepciones usa las palabras reservadas try, catch,
throw, throws y finally.
Tipos de excepci
on
Todos los tipos de excepcion son subclase de Throwable. Esta clase tiene
dos subclases:
Fundamentos
90
9.3.
Excepciones no capturadas
Ejemplo: P32/Exc1.java
try {
// bloque de c
odigo
}
catch (TipoExcepcion1 exOb){
// gestor de excepciones para TipoExcepcion1
}
catch (TipoExcepcion2 exOb){
// gestor de excepciones para TipoExcepcion2
}
// ...
finally {
// bloque de c
odigo que se ejecutara antes de
// que termine el bloque try
}
class Exc1 {
static void subroutine() {
int d = 0;
int a = 10 / d;
}
public static void main(String args[]) {
Exc1.subroutine();
}
}
Cuando el interprete detecta la division por 0 construye un objeto de
excepcion y lanza la excepcion. Esto detiene la ejecucion de Exc1, ya
que no hemos incluido un gestor de la excepci
on.
Cualquier excepcion no tratada por el programa sera tratada por el
gestor por defecto que muestra la excepcion y el trazado de la pila en la
salida estandar, y termina el programa.
DE EXCEPCIONES
GESTION
91
9.4.
try y catch
DE EXCEPCIONES
GESTION
92
Descripci
on de una excepci
on
DE EXCEPCIONES
GESTION
9.5.
93
Clausula catch m
ultiple
DE EXCEPCIONES
GESTION
94
Ejemplo: P36/SuperSubCatch.java
class SuperSubCatch {
public static void main(String args[]) {
try {
int a = 0;
int b = 42 / a;
}
catch(Exception e) {
System.out.println("catch para cualquier tipo de excepci
on.");
}
/* Este catch nunca se ejecutar
a */
catch(ArithmeticException e) { // ERROR - no alcanzable
System.out.println("Esto nunca se ejecutar
a.");
}
}
}
DE EXCEPCIONES
GESTION
9.6.
95
DE EXCEPCIONES
GESTION
Ejemplo: P38/MethNestTry.java
siguiente
*/
siguiente
*/
}
}
96
Una sentencia try puede estar incluida dentro del bloque de otra
sentencia try.
class NestTry {
public static void main(String args[]) {
try {
int a = args.length;
/* Si no hay ning
un argumento en la l
nea, de
ordenes, la
sentencia generar
a una excepci
on de divisi
on por cero.
int b = 42 / a;
System.out.println("a = " + a);
try { // bloque try anidado
/* Si se utiliza un argumento en la l
nea, de
ordenes, la
sentencia generar
a una excepci
on de divisi
on por cero.
if(a==1) a = a/(a-a); // divisi
on por cero
DE EXCEPCIONES
GESTION
9.7.
97
DE EXCEPCIONES
GESTION
9.8.
98
Sentencia throws
Sirve para listar los tipos de excepcion que un metodo puede lanzar.
Debe usarse para proteger los metodos que usan a este, si tal metodo
lanza la excepcion pero no la maneja.
Es necesario usarla con todas las excepciones excepto Error y
RuntimeException y sus subclases.
Si las excepciones que lanza el metodo y no maneja no se ponen en
throws se producira error de compilacion.
Forma general de declaraci
on de m
etodo con throws
tipo metodo(lista_de_parametros) throws lista_de_excepciones
{
// cuerpo del metodo
}
Ejemplo: P40/ThrowsDemo.java
// Programa err
oneo que no compila
class ThrowsDemo {
static void throwOne() {
System.out.println("Dentro de throwOne.");
throw new IllegalAccessException("demo");
}
public static void main(String args[]) {
throwOne();
}
}
El metodo que use al del throws debe capturar todas las excepciones
listadas con la sentencia throws.
DE EXCEPCIONES
GESTION
99
DE EXCEPCIONES
GESTION
static void procB() {// Ejecuta la sentencia return dentro del try
try {
System.out.println("Dentro de procB");
return;
} finally {
System.out.println("Sentencia finally de procB");
}
}
static void procC() {// Ejecuta un bloque try normalmente
try {
System.out.println("Dentro de procC");
} finally {
System.out.println("Sentencia finally de procC");
}
}
public static void main(String args[]) {
try {procA();
} catch (Exception e) {
System.out.println("Excepci
on capturada");
}
procB(); procC();
}
Ejemplo: P41/ThrowsDemo.java
// Programa correcto
class ThrowsDemo {
static void throwOne() throws IllegalAccessException {
System.out.println("Dentro de throwOne.");
throw new IllegalAccessException("demo");
}
public static void main(String args[]) {
try {
throwOne();
} catch (IllegalAccessException e) {
System.out.println("Captura " + e);
}
}
}
9.9.
Sentencia finally
100
}
Salida del anterior programa
Dentro de
Sentencia
Excepci
on
Dentro de
Sentencia
Dentro de
Sentencia
procA
finally de procA
capturada
procB
finally de procB
procC
finally de procC
DE EXCEPCIONES
GESTION
9.10.
101
DE EXCEPCIONES
GESTION
class ExceptionDemo {
static void compute(int a) throws MyException {
System.out.println("Ejecuta compute(" + a + ")");
if(a > 10)
throw new MyException(a);
System.out.println("Finalizaci
on normal");
}
public static void main(String args[]) {
try {
compute(1);
compute(20);
} catch (MyException e) {
System.out.println("Captura " + e);
}
}
}
Salida de este programa
Ejecuta compute(1)
Finalizaci
on normal
Ejecuta compute(20)
Captura MyException[20]
102
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
10.
103
Programaci
on Multihilo (Multihebra)
10.1.
El hilo principal
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
Salida del programa
Hilo actual: Thread[main,5,main]
Despu
es del cambio de nombre: Thread[Mi hilo,5,main]
5
4
3
2
1
10.2.
Debe ser el u
ltimo que termine su ejecucion. Cuando el hilo principal
finaliza, termina el programa.
Ejemplo de acceso al hilo principal:
P44/CurrentThreadDemo.java
class CurrentThreadDemo {
public static void main(String args[]) {
Thread t = Thread.currentThread();
System.out.println("Hilo actual: " + t);
t.setName("Mi hilo"); //cambia el nombre del hilo
System.out.println("Despu
es del cambio de nombre: " + t);
try {
for(int n = 5; n > 0; n--) {
System.out.println(n);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("Interrupci
on del hilo principal");}
}
}
104
Creaci
on de un hilo
Implementaci
on del interfaz Runnable
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
105
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
Ejemplo: P45/ThreadDemo.java
Hilo
Hilo
Hilo
Hilo
Hilo
Hilo
Hilo
Hilo
Hilo
Sale
Hilo
Hilo
Sale
106
10.2.2.
Extensi
on de la clase Thread
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
107
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
Ejemplo: P46/ExtendThread.java
10.2.3.
108
Elecci
on de una de las dos opciones
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
10.3.
109
Creaci
on de m
ultiples hilos
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
110
class MultiThreadDemo {
public static void main(String args[]) {
new NewThread("Uno"); // comienzan los hilos
new NewThread("Dos");
new NewThread("Tres");
try {
// espera un tiempo para que terminen los otros hilos
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("Interrupci
on del hilo principal");
}
System.out.println("Sale del hilo principal.");
}
}
Salida del programa
Nuevo hilo: Thread[Uno,5,main]
Nuevo hilo: Thread[Dos,5,main]
Nuevo hilo: Thread[Tres,5,main]
Uno: 5
Dos: 5
Tres: 5
Uno: 4
Dos: 4
Tres: 4
Uno: 3
Dos: 3
Tres: 3
Uno: 2
Dos: 2
Tres: 2
Uno: 1
Dos: 1
Tres: 1
Sale del hilo.Uno
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
111
10.4.
Utilizaci
on de isAlive() y join()
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
112
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
Salida del programa
Nuevo hilo: Thread[Uno,5,main]
Nuevo hilo: Thread[Dos,5,main]
Nuevo hilo: Thread[Tres,5,main]
El hilo Uno est
a vivo: true
El hilo Dos est
a vivo: true
El hilo Tres est
a vivo: true
Espera finalizaci
on de los otros hilos.
Uno: 5
Dos: 5
Tres: 5
Uno: 4
Dos: 4
Tres: 4
Uno: 3
Dos: 3
Tres: 3
Uno: 2
Dos: 2
Tres: 2
Uno: 1
Dos: 1
Tres: 1
Sale del hilo Uno
Sale del hilo Dos
Sale del hilo Tres
El hilo Uno est
a vivo: false
El hilo Dos est
a vivo false
El hilo Tres est
a vivo: false
Sale del hilo principal.
113
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
10.5.
114
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
115
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
116
10.6.
Sincronizaci
on
Uso de m
etodos sincronizados
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
117
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
118
class Synch {
public static void main(String args[]) {
Callme target = new Callme();
Caller ob1 = new Caller(target, "Hola");
Caller ob2 = new Caller(target, "Sincronizado");
Caller ob3 = new Caller(target, "Mundo");
try {
ob1.t.join();
ob2.t.join();
ob3.t.join();
} catch(InterruptedException e) {
System.out.println("Interrumpido");
}
}
}
Salida del anterior programa
[Hola[Sincronizado[Mundo]
]
]
El resultado de este programa muestra que la salida de los tres
mensajes aparece mezclada, ya que los tres hilos estan ejecutando el
metodo call() del mismo objeto a la vez.
Solucion: Restringimos el acceso a call() a un solo hilo en un
momento determinado.
Ejemplo: P51/Synch.java
class Callme {
synchronized void call(String msg) {
...
Nueva salida:
[Hola]
[Sincronizado]
[Mundo]
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
10.6.2.
119
Sentencia synchronized
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
120
10.7.
Comunicaci
on entre hilos
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
121
Productor/consumidor de un s
olo car
acter (versi
on err
onea):
P53/PC.java
class Q {
int n;
synchronized int get() {
System.out.println("Obtengo: " + n);
return n;
}
synchronized void put(int n) {
this.n = n;
System.out.println("Pongo: " + n);
}
}
class Producer implements Runnable {
Q q;
Producer(Q q) {
this.q = q;
new Thread(this, "Productor").start();
}
public void run() {
int i = 0;
while(true) {
q.put(i++);
}
}
}
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
class Consumer implements Runnable {
Q q;
Consumer(Q q) {
this.q = q;
new Thread(this, "Consumidor").start();
}
public void run() {
while(true) {
q.get();
}
}
}
class PC {
public static void main(String args[]) {
Q q = new Q();
new Producer(q);
new Consumer(q);
System.out.println("Pulsa Control-C para parar.");
}
}
Salida del programa
Pongo: 1
Obtengo:
Obtengo:
Obtengo:
Obtengo:
Obtengo:
Pongo: 2
Pongo: 3
Pongo: 4
Pongo: 5
Pongo: 6
Pongo: 7
Obtengo:
1
1
1
1
1
122
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
123
Soluci
on correcta con wait y notify: P54/PCFixed.java
class Q {
int n;
boolean valueSet = false;
synchronized int get() {
if(!valueSet)
try {
wait();
} catch(InterruptedException e) {
System.out.println("InterruptedException capturada");
}
System.out.println("Obtengo: " + n);
valueSet = false;
notify();
return n;
}
synchronized void put(int n) {
if(valueSet)
try {
wait();
} catch(InterruptedException e) {
System.out.println("InterruptedException capturada");
}
this.n = n;
valueSet = true;
System.out.println("Pongo: " + n);
notify();
}
}
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
class Producer implements Runnable {
Q q;
Producer(Q q) {
this.q = q;
new Thread(this, "Productor").start();
}
public void run() {
int i = 0;
while(true) {
q.put(i++);
}
}
}
class Consumer implements Runnable {
Q q;
Consumer(Q q) {
this.q = q;
new Thread(this, "Consumidor").start();
}
public void run() {
while(true) {
q.get();
}
}
}
class PCFixed {
public static void main(String args[]) {
Q q = new Q();
new Producer(q);
new Consumer(q);
System.out.println("Pulsa Control-C para parar.");
}
}
124
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
125
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
126
Pongo: 1
Obtengo:
Pongo: 2
Obtengo:
Pongo: 3
Obtengo:
Pongo: 4
Obtengo:
Pongo: 5
Obtengo:
Pongo: 6
Obtengo:
Pongo: 7
Obtengo:
class A {
synchronized void foo(B b) {
String name = Thread.currentThread().getName();
System.out.println(name + " entr
o en A.foo");
try {
Thread.sleep(1000);
} catch(Exception e) {
System.out.println("A Interrumpido");
}
System.out.println(name + " intentando llamar a B.last()");
b.last();
}
synchronized void last() {
System.out.println("Dentro de A.last");
}
}
class B {
synchronized void bar(A a) {
String name = Thread.currentThread().getName();
System.out.println(name + " entr
o en B.bar");
try {
Thread.sleep(1000);
} catch(Exception e) {
System.out.println("B Interrumpido");
}
System.out.println(name + " intentando llamar a A.last()");
a.last();
}
synchronized void last() {
System.out.println("Dentro de A.last");
}
}
10.7.1.
1
2
3
4
5
6
7
Interbloqueos
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
127
10.8.
La suspensi
on de la ejecucion de un hilo es u
til en algunos casos.
Por ejemplo, un hilo puede usarse para mostrar la hora actual. Si
el usuario no desea verla en un momento determinado, entonces
tal hilo debera suspenderse.
Una vez suspendido un hilo, este puede reanudar su ejecuci
on como
veremos.
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
10.8.1.
128
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
129
class SuspendResume {
public static void main(String args[]) {
NewThread ob1 = new NewThread("Uno");
NewThread ob2 = new NewThread("Dos");
try {
Thread.sleep(1000);
ob1.t.suspend();
System.out.println("Suspende el hilo Uno");
Thread.sleep(1000);
ob1.t.resume();
System.out.println("Reanuda el hilo Uno");
ob2.t.suspend();
System.out.println("Suspende el hilo Dos");
Thread.sleep(1000);
ob2.t.resume();
System.out.println("Reanuda el hilo Dos");
} catch (InterruptedException e) {
System.out.println("Interrupci
on del hilo principal");
}
// espera hasta que terminen los otros hilos
try {
System.out.println("Espera finalizaci
on de los otros hilos.");
ob1.t.join();
ob2.t.join();
} catch (InterruptedException e) {
System.out.println("Interrupci
on del hilo principal");
}
System.out.println("Sale del hilo principal.");
}
}
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
Salida del anterior programa
Nuevo hilo: Thread[Uno,5,main]
Nuevo hilo: Thread[Dos,5,main]
Uno: 15
Dos: 15
Uno: 14
Dos: 14
Uno: 13
Dos: 13
Uno: 12
Dos: 12
Uno: 11
Dos: 11
Suspende el hilo Uno
Dos: 10
Dos: 9
Dos: 8
Dos: 7
Dos: 6
Reanuda el hilo Uno
Suspende el hilo Dos
Uno: 10
Uno: 9
Uno: 8
Uno: 7
Uno: 6
Reanuda el hilo Dos
Espera finalizaci
on de los otros hilos.
Dos: 5
Uno: 5
Dos: 4
Uno: 4
Dos: 3
Uno: 3
Dos: 2
130
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
Uno:
Dos:
Uno:
Sale
Sale
Sale
131
2
1
1
del hilo Dos
del hilo Uno
del hilo principal.
10.8.2.
En Java 2
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
132
10
MULTIHILO (MULTIHEBRA)
PROGRAMACION
133
11
11.
134
11.1.
Introducci
on
11.2.
Modelo de delegaci
on de eventos
Event sources: Son los objetos sobre los que se producen los eventos.
Suelen ser los componentes del interfaz grafico.
Estos objetos registran los objetos (Event listeners) que habran de
gestionarlos.
Event listeners: Objetos que gestionan los eventos.
Disponen de metodos que se llamaran automaticamente cuando se
produzca un evento en el objeto fuente.
La forma de garantizar que disponen de los metodos apropiados
para gestionar los eventos es obligarles a implementar una
determinada interfaz Listener.
11
135
11
136
11
11.3.
Introducci
on a los componentes y eventos
11.3.1.
Jerarqua de componentes
137
11
138
11.3.2.
Jerarqua de eventos
Todos los eventos de Java son objetos de clases que pertenecen a una
determinada jerarqua de clases.
11
139
Relaci
on entre Componentes y Eventos generados
Component
Eventos
Significado
Button
ActionEvent
Click en bot
on
Checkbox
ItemEvent
CheckboxMenuItem
ItemEvent
Choice
ItemEvent
Component
ComponentEvent
FocusEvent
KeyEvent
MouseEvent
Container
ContainerEvent
A
nadir o eliminar un componente
de un container
List
ActionEvent
ItemEvent
MenuItem
ActionEvent
Scrollbar
AdjustementEvent
TextComponent
TextEvent
Cambiar el texto
TextField
ActionEvent
Window
WindowEvent
Adem
as de los eventos de la tabla, hay que tener en cuenta que los
eventos propios de una superclase del componente pueden afectar
tambien a este componente.
Por ejemplo la clase TextArea no tiene ning
un evento especfico
propio, pero puede recibir los de su superclase TextComponent.
11
140
Cada objeto que puede recibir un evento (event source), debe registrar
uno o mas objetos para que los gestione (event listener). Para ello
usamos un metodo que tiene la forma:
eventSourceObject.addEventListener(eventListenerObject);
donde eventSourceObject es el objeto en el que se produce el evento,
y eventListenerObject es el objeto que debera gestionar los eventos.
La clase del eventListenerObject debe implementar un interfaz
Listener de un tipo correspondiente al tipo de evento asociado.
La clase receptora de eventos proporciona la declaracion de los metodos
que seran llamados cuando se produzca un evento.
Una vez registrado el objeto que gestionara el evento, perteneciente a
una clase que implemente el interfaz Listener correspondiente, se deben
definir todos los metodos de dicha interfaz.
La siguiente tabla relaciona los distintos tipos de eventos, con la
interfaz que se debe implementar para gestionarlos. Ademas muestra
los metodos declarados en cada interfaz.
11
141
Evento
Listener
M
etodos del Listener
ActionEvent
ActionListener
actionPerformed()
AdjustementEvent
AdjustementListener
adjustementValueChanged()
ComponentEvent
ComponenListener
componentHidden(),
componentMoved()
componentResized(),
componetShown()
ContainerEvent
ContainerListener
componentAdded(),
componentRemoved()
FocusEvent
FocusListener
focusGained(), focusLost()
ItemEvent
ItemListener
itemStateChanged()
KeyEvent
KeyListener
keyPressed(), keyReleased(),
keyTyped()
MouseEvent
MouseListener
mouseClicked() ,mouseEntered(),
mouseExited(), mousePressed(),
mouseReleased()
MouseMotionListener
mouseDragged(), mouseMoved()
TextEvent
TextListener
textValueChanged()
WindowEvent
WindowListener
windowActivated(),
windowDeactivated(),
windowClosed(),
windowClosing(),
windowIconified(),
windowDeiconified(),
windowOpened()
11
142
Clases Adapter
11
143
Ejemplos de gesti
on de eventos
11
144
11
145
class IHM {
public IHM() {
MiFrame miFrame1 = new MiFrame( "Frame1" );
miFrame1.setVisible( true );
MiFrame miFrame2 = new MiFrame( "Frame2" );
miFrame2.setVisible( true );
Proceso1 procesoVentana1 = new Proceso1();
miFrame1.addWindowListener( procesoVentana1 );
miFrame2.addWindowListener( procesoVentana1 );
ProcesoRaton procesoRaton = new ProcesoRaton( miFrame1,
miFrame2 );
miFrame1.addMouseListener( procesoRaton );
miFrame2.addMouseListener( procesoRaton ); }
}
class ProcesoRaton extends MouseAdapter{
MiFrame frameRef1,frameRef2;
ProcesoRaton( MiFrame frame1,MiFrame frame2 ) {
frameRef1 = frame1; frameRef2 = frame2; }
public void mousePressed( MouseEvent evt ) {
if(evt.getComponent().getName().compareTo("Frame1")==0){
frameRef1.ratonX = evt.getX();
frameRef1.ratonY = evt.getY();
frameRef1.repaint();}
else {
frameRef2.ratonX = evt.getX();
frameRef2.ratonY = evt.getY();
frameRef2.repaint();
}
}
}
class Proceso1 extends WindowAdapter {
public void windowClosing( WindowEvent evt ) {
System.exit( 0 );
}
}
11
146
11
147
11
148
11
11.4.
149
11
150
M
etodos de Component
Funci
on que realizan
boolean isVisible()
Chequear o establecer
void setVisible(boolean)
la visibilidad de un componente
boolean isShowing()
isEnabled()
setEnabled()
Point getLocation()
Obtener la posici
on de la esquina
Point getLocationScreen()
setLocation(Point)
setLocation(int x, int y)
especificada respecto
al container o pantalla
Dimension getSize()
componente
void setSize(Dimension d)
Rectangle getBounds()
void setBounds(Rectangle)
de un componente
Metodos gr
aficos para dibujar
repaint()
en el componente
update(Graphics)
setBackground(Color)
setForeground(Color)
11.4.1.
Clase Component
Es una clase abstracta de la que derivan todas las clases del AWT.
Representa todo lo que tiene posicion, tama
no, puede ser pintado en
pantalla y puede recibir eventos.
Son los controles basicos de las aplicaciones.
11
151
Clase ComponentEvent
11
152
Clase FocusEvent
Clase Container
Funci
on que realizan
A
nadir un componente
al contenedor
Object constraint)
Object Component getComponent(int n)
Obtener el componente n
Component[] getComponents()
LayoutManager getLayout()
void remove(int n)
Eliminar el componente n
void removeAll()
11
153
11
154
Clase ContainerEvent
Clase Window
Clase WindowEvent
Funci
on que realiza
Frame(),
Constructores
Frame(String title)
String getTitle()
11.4.10.
Clase Frame
(ver AWT/java1312.java)
setTitle(String)
MenuBar getMenuBar()
setMenuBar(MenuBar)
la barra de men
us
remove(MenuComponent)
Image getIconImage()
setIconImage(Image)
setResizable(boolean)
Determinan o chequean si se
boolean isResizable()
dispose()
11
155
Clase Dialog
11
156
M
etodo de Button
Funci
on que realiza
Button(String)
Constructores
addActionListener(ActionListener)
A
nade o borra un receptor de
removeActionListener(ActionListener)
setLabel()
Establece o devuelve la
getLabel()
setActionCommand(String)
String getActionCommand()
Button()
Ejemplo de uso
11.4.12.
Clase FileDialog
Clase Panel
Clase Button
11
157
Clase ActionEvent
11
Clase ItemEvent
11.4.18.
158
Clase Choice
11
159
Ejemplo
Choice choice;
choice = new Choice();
choice.add("Primer Choice");
choice.add("Segundo Choice");
choice.add("Tercer Choice");
choice.select("Tercer Choice");
11.4.19.
11
160
Clase Label
Ejemplo
List miLista = new List();
for( int i=0; i < 15; i++ )
miLista.add( "Elemento "+i );
miLista.setMultipleMode( true );
miLista.select( 1 );
11.4.21.
Clase Canvas
11.4.20.
Clase List
11
161
11
162
Ejemplo AWT/java1310.java
Ejemplo
class MiCanvas extends Canvas {
int posicionX;
int posicionY;
public MiCanvas() {
this.setBackground( Color.green );
}
public void paint( Graphics g ) {
g.drawString( "" + posicionX + ", " + posicionY,
posicionX,posicionY );
}
}
MiCanvas miObjCanvas = new MiCanvas();
11.4.22.
Ejemplo AWT/java1311.java
Ejemplo
Scrollbar scroll = new Scrollbar(Scrollbar.HORIZONTAL,0,64,0,255 );
11.4.23.
Clase AdjustmentEvent
Clase ScrollPane
11
163
11
164
11.4.26.
Clase TextEvent
Clase KeyEvent
Ejemplo de creaci
on de un
area de texto (ver ejemplo
AWT/java1306.java)
TextArea miAreaTexto = new TextArea( "",5,20,
TextArea.SCROLLBARS_VERTICAL_ONLY );
for( int i=0; i < 10; i++ )
miAreaTexto.append( "linea "+i+"\n" );
11
11.5.
165
Men
us
11
166
11
11.6.
167
11
11.7.
168
(ver http:
//java.sun.com/products/jfc/tsc/articles/painting/index.html)
La hebra despachadora de eventos (event dispatch thread) se encarga
de repintar los componentes cuando se solicita en nuestro codigo.
En AWT hay dos mecasimos por los que se producen las operaciones de
repintado, dependiendo de quien sea el que ordene ese repintado, el
sistema o la aplicaci
on.
Sistema: el es quien indica a un Componente que debe regenerar su
contenido debido a:
El componente se hace visible por primera vez.
El componente ha cambiado de tama
no.
El componente se ha deteriorado y necesita ser regenerado (por
ejemplo, porque se oculta otra ventana que estaba encima).
Aplicaci
on: El propio componente decide la necesidad de
actualizacion, normalmente debido a alg
un cambio en su estado
interno (por ejemplo un boton detecta que el raton ha sido pulsado
sobre el y debe pasar de estado normal a estado pulsado).
11.7.1.
M
etodos para repintado
11
169
el c
rculo, fijando el color al de frente
x,y,d,d );
la circunferencia de borde, en color negro
Color.black );
x,y,d,d );
}
void update(Graphics g):
La implementacion por defecto para componentes pesados (como
por ejemplo Canvas) redibuja el componente con el color de fondo y
luego llama a paint().
En componenentes ligeros (por ejemplo clase Component) no se
borra el fondo.
11
170
Aplicaci
on:
El programa determina si parte o todo el componente debe ser
repintado, en respuesta a cambios en alg
un estado interno.
El programa invoca al metodo repaint() sobre el componente, el
cual lanza una peticion a AWT indicandole que ese componente
necesita ser repintado.
AWT hace que la hebra despachadora de eventos llame a update()
sobre el componente.
En el caso de que se produzcan m
ultiples llamadas al metodo
repaint() antes de que se inicie el repintado, todas se reuniran
en una sola; el algoritmo para decidir cuando reunir todas las
llamadas a repaint() en una sola es dependiente de la
implementacion.
Cuando se reunen las llamadas a repaint(), la zona que se
actualizara sera la union de los rectangulos indicados en cada
una de las peticiones de repintado.
11
171
-->
update()
-->
paint()
11
172
-->
update()
-->
paint()
11
173
Animaciones
11
Clase java.awt.Graphics
11.7.5.
Eliminaci
on del parpadeo
Soluciones al parpadeo:
Mover im
agenes
174
11
Clase java.awt.Graphics2D
175
12
SWING
12.
176
Swing
12.1.
Introducci
on a las Java Foundation Classes
(JFC)
12.2.
Introducci
on a Swing
12
SWING
177
12
SWING
178
12.3.
Swing est
a compuesto de mas de 250 clases y 75 interfaces agrupados
en las siguientes categoras:
Componente JComponent que extiende a java.awt.Container y
un conjunto de componentes (del paquete javax.swing) subclase de
JComponent (que comienzan con la letra J):
Todos los componentes Swing son contenedores y son
descendientes de java.awt.Component
Clases de objetos no visibles tales como clases de eventos. (No
comienzan con la letra J)
Conjunto de interfaces que son implementados por sus componentes
y clases soporte.
Las aplicaciones usan los componentes Swing y AWT de la misma
forma: mismos manejadores de posicionamiento (layout managers),
objetos de eventos, receptores de eventos.
Diferencia: el content-pane en clases JFrame, JApplet, JDialog y
JWindow.
Ahora no se usa add para a
nadir componentes directamente a un
contenedor que implemente el interfaz RootPaneContainer.
Tales contenedores tienen un contenedor content-pane donde se
colocan los componentes.
El interfaz RootPaneContainer define el metodo
getContentPane() para acceder al objeto content-pane (de la clase
JRootPane).
Por defecto el content-pane de un JFrame usa BorderLayout.
Otra diferencia: TextArea y List disponen de barras de scroll, pero
JTextArea y JList deben ser colocados en un contenedor
JScrollPane para que la tengan.
import javax.swing.*;
public class JHolaMundo extends JFrame {
public static void main( String argv[] ) {
new JHolaMundo();
}
JHolaMundo() {
addWindowListener(new Proceso1());
JLabel hola = new JLabel( "Hola Mundo!" );
getContentPane().add( hola,"Center" );
setSize( 200,100);
setVisible( true );
}
}
class Proceso1 extends WindowAdapter {
public void windowClosing( WindowEvent evt ) {
System.exit( 0 );
}
}
12
SWING
179
12
SWING
180
12.4.
Clase javax.swing.JComponent
12
SWING
181
12
SWING
Clase javax.swing.JWindow:
Son ventanas vacas que no tienen ttulo ni barra de men
us.
Se usa para crear componentes optimizados.
Usa por defecto BorderLayout.
JWindow(Frame parent)
12.5.2.
12.5.
Clases contenedoras
Contenedores pesados
boolean modal)
String title)
String title, boolean modal):
la interaccion con otras ventanas mientras
Clase javax.swing.JFrame:
Es una ventana con bordes y barra de ttulos (y puede que tambien
una barra de men
us).
Extiende a java.awt.Frame.
Usa por defecto BorderLayout.
JFrame()
JFrame(String title)
182
Contenedores ligeros
12
SWING
183
12
SWING
184
12
SWING
185
/** El main
* @param args no usado
*/
public static void main( String[] args ) {
new DesktopAndDialog(
"Example Desktop with Dialog" );
}
}
12
SWING
186
12.6.
Clase javax.swing.JCheckBox:
Extiende a JToggleButton
JCheckBox()
JCheckBox(Icon icon)
JCheckBox(String label)
JCheckBox(String label, Icon icon)
JCheckBox(Icon icon,boolean selected)
JCheckBox(String label,boolean selected)
JCheckBox(String label, Icon icon,boolean selected)
(ver Swing/java1404.java)
12
SWING
187
Clase javax.swing.JRadioButton:
Extiende a JToggleButton
JRadioButton()
JRadioButton(Icon icon)
JRadioButton(String label)
JRadioButton(String label, Icon icon)
JRadioButton(Icon icon,boolean selected)
JRadioButton(String label,boolean selected)
JRadioButton(String label, Icon icon,boolean selected)
Clase javax.swing.ButtonGroup: Objeto para contener un grupo de
botones (JToggleButton, JRadioButton o JCheckBox) mutuamente
exclusivos.
El metodo buttongroup.add(boton) a
nade un bot
on al grupo.
ButtonGroup()
12
SWING
188
12
SWING
189
12
SWING
12.7.
190
Men
us, barras de utilidades y acciones
12
SWING
191
12
SWING
192
12
SWING
193
12
SWING
edit.add( cta );
tb.add( cta );
CopyAction cpa = new CopyAction();
edit.add( cpa );
tb.add( cpa );
PasteAction pa = new PasteAction();
edit.add( pa );
tb.add( pa );
setJMenuBar( mb );
Container cp = getContentPane();
cp.add( tb, BorderLayout.NORTH );
cp.add( actionInfo, BorderLayout.CENTER );
setSize( 350, 200 );
setVisible( true );
}
class NewAction extends AbstractAction {
public NewAction() {
super( "new", new ImageIcon( "new.gif" ) );
}
public void actionPerformed( ActionEvent e ) {
actionInfo.setText( "new selected" );
}
}
class SaveAction extends AbstractAction {
public SaveAction() {
super( "save", new ImageIcon( "save.gif" ) );
}
public void actionPerformed( ActionEvent e ) {
actionInfo.setText( "save selected" );
}
}
194
12
SWING
195
12
SWING
196
12
SWING
12.8.
197
12
SWING
198
JSlider()
JScrollPane(Component view)
JSlider(BoundedRangeModel brm)
JScrollPane(int vsbPolicy,inthsbPolicy)
JScrollPane(Component view, int vsbPolicy,int hsbPolicy)
JSlider(int orientation)
JSlider(int min, int max)
JSlider(int min, int max, int value)
JSlider(int orientation, int min, int max, int value)
(ver ejemplo Swing/java14-13.java y Swing/java1428.java)
12
SWING
12.9.
199
12
SWING
200
Ejemplo:
private JComboBox crustBox;
private JList toppingList;
crustBox = new JComboBox( new Object[] {
"thick and chewy",
"thin and crispy",
"Chicago deep dish"
}
);
toppingList = new JList( new Object[] {
"pepperoni",
"sausage",
"ham",
"grilled chicken",
"mushrooms",
"green peppers",
"hot peppers",
"black olives",
"tomato slices",
"sun-dried tomatoes",
"extra cheese",
"pineapple",
"anchovies"
}
);
toppingList.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
JScrollPane scrollToppingList
= new JScrollPane( toppingList );
12
SWING
201
12
SWING
202
12.11.
Di
alogos predefinidos (choosers)
12.10.
Clase javax.swing.JOptionPane
(ver Swing/P7/Choosers.java)
12.12.
Tablas y
arboles
12
SWING
12.13.
203
(ver http:
//java.sun.com/products/jfc/tsc/articles/painting/index.html y
http://java.sun.com/docs/book/tutorial/uiswing/14painting/
index.html)
(Ver los ejemplos Swing/CoordinatesDemo.java,
Swing/SelectionDemo.java Swing/IconDisplayer.java y
serpienteSwing/
Swing sigue el modelo basico de pintado de AWT, extendiendolo para
mejorar su rendimiento.
El metodo paint() en componentes Swing es llamado como
resultado de llamadas del sistema y de aplicaci
on.
update() nunca se llama para componentes Swing.
Soporta tambien las llamadas a repaint() para repintar los
componentes.
Swing utiliza doble buffer para dibujar los componentes
Proporciona el API de RepaintManager para los programas que
quieran desarrollar su propio mecanismo de pintado (ver
http://java.sun.com/products/jfc/tsc/articles/painting/
index.html para mas detalles).
12.13.1.
12
SWING
204
Los m
etodos de dibujo en Swing
Las reglas que se aplican a los componentes ligeros del AWT, tambien se
aplican a los componentes Swing; por ejemplo, paint() se llama cuando es
necesario el repintado, excepto que en el caso de Swing, la llamada a
paint() se convierte en la llamada a tres metodos separados, que siempre
se invocan en el siguiente orden:
protected void paintComponent( Graphics g ): Por defecto,
dibuja el background del componente, si este es opaco, y luego dibuja
su contenido.
protected void paintBorder( Graphics g ): Dibuja el borde del
componente.
protected void paintChildren( Graphics g ): Indica que se
dibujen los componentes que contenga este componente.
1.-Background
2.-Contenido
3.-Borde
4.-Hijos
(si es opaco)
(si tiene)
(si tiene)
(si tiene)
12
SWING
12.13.3.
205
Propiedades adicionales de los componentes
12
SWING
12.13.4.
206
Algunos aspectos sobre el dibujo en Swing
13
13.
207
13.1.
13
13.2.
208
Clase File
13
209
13
210
import java.io.File;
class FileDemo {
static void p(String s) {
System.out.println(s);
}
public static void main(String args[]) {
File f1 = new File("FileDemo.java");
p("File Name: " + f1.getName());
p("Path: " + f1.getPath());
p("Abs Path: " + f1.getAbsolutePath());
p("Parent: " + f1.getParent());
p(f1.exists() ? "exists" : "does not exist");
p(f1.canWrite() ? "is writeable" : "is not writeable");
p(f1.canRead() ? "is readable" : "is not readable");
p("is " + (f1.isDirectory() ? "" : "not" + " a directory"));
p(f1.isFile() ? "is normal file" : "might be a named pipe");
p(f1.isAbsolute() ? "is absolute" : "is not absolute");
p("File last modified: " + f1.lastModified());
p("File size: " + f1.length() + " Bytes");
}
}
13
211
13
13.3.
212
13
213
13
214
Clase java.io.OutputStream
Superclase abstracta de todos los flujos orientados a salida de bytes.
Los metodos de esta clase devuelven void y lanzan una IOException si
se producen condiciones de error.
Constructor:
OutputStream()
Metodos
void close(): Cierra el flujo y libera los recursos que utiliza.
void flush(): Fuerza a escribir los posibles bytes que haya
almacenados en un buffer de memoria.
void write(int b)
void write(byte[] bytebuffer)
void write(byte bytebuffer[], int offset, int count):
Escribe un byte o un array de bytes en el flujo.
13
215
13
216
13
217
13
218
Clase ByteArrayInputStream
Flujo de entrada que usa una matriz de bytes como origen de los datos.
Constructores:
ByteArrayInputStream(byte matriz[])
ByteArrayInputStream(byte matriz[],int position, int numBytes)
Ejemplo de uso de ByteArrayInputStream:
JavaIO/P5/ByteArrayInputStreamDemo.java
import java.io.*;
class ByteArrayInputStreamDemo {
public static void main(String args[]) throws IOException {
String tmp = "abcdefghijklmnopqrstuvwxyz";
byte b[] = tmp.getBytes();
ByteArrayInputStream input1 = new ByteArrayInputStream(b);
ByteArrayInputStream input2 = new ByteArrayInputStream(b, 0, 3);
}
}
13
219
13
220
Clase ByteArrayOutputStream
Flujo de salida que usa una matriz de bytes como salida de los datos.
Constructores:
ByteArrayOutputStream() Crea un b
ufer con 32 bytes.
ByteArrayOutputStream(int numBytes): Crea un b
ufer con el
tama
no especificado.
Ejemplo de uso de ByteArrayOutputStream:
JavaIO/P7/ByteArrayOutputStreamDemo.java
import java.io.*;
class ByteArrayOutputStreamDemo {
public static void main(String args[]) throws IOException {
ByteArrayOutputStream f = new ByteArrayOutputStream();
String s = "This should end up in the array";
byte buf[] = s.getBytes();
f.write(buf);
System.out.println("Buffer as a string");
System.out.println(f.toString());
System.out.println("Into array");
byte b[] = f.toByteArray();
for (int i=0; i<b.length; i++) {
System.out.print((char) b[i]); }
System.out.println("\nTo an OutputStream()");
OutputStream f2 = new FileOutputStream("test.txt");
f.writeTo(f2);
f2.close();
System.out.println("Doing a reset");
f.reset();
for (int i=0; i<3; i++) f.write(X);
System.out.println(f.toString());
}
}
13
221
13.3.4.
13
222
Flujos con un b
ufer de bytes
Clase BufferedInputStream
Constructores
BufferedInputStream(InputStream ent): Crea el b
ufer con 512
bytes.
BufferedInputStream(InputStream ent, int size): Crea el
b
ufer con el tama
no especificado.
Ejemplo de uso de BufferedInputStream:
JavaIO/P8/BufferedInputStreamDemo.java
import java.io.*;
class BufferedInputStreamDemo {
public static void main(String args[]) throws IOException {
String s = "This is a © copyright symbol " +
"but this is © not.\n";
byte buf[] = s.getBytes();
ByteArrayInputStream in = new ByteArrayInputStream(buf);
BufferedInputStream f = new BufferedInputStream(in);
int c;
boolean marked = false;
while ((c = f.read()) != -1) {
switch(c) {
case &:
if (!marked) {
f.mark(32);
marked = true;
}
else {
marked = false; }
break;
case ;:
if (marked) {
marked = false;
System.out.print("(c)");
} else
System.out.print((char) c);
break;
13
223
13
224
Clase BufferedOutputStream
Es similar a cualquier OutputStream con la excepcion que se a
nade un
metodo flush() que se usa para asegurar que los datos del b
ufer se
escriben fsicamente en el dispositivo de salida. El objetivo de esta clase es
solamente incrementar la velocidad, reduciendo el n
umero de veces que el
sistema escribe datos.
Constructores
BufferedOutputStream(OutputStream sal): Crea el b
ufer con 512
bytes.
BufferedOutputStream(OutputStream sal, int size): Crea el
b
ufer con el tama
no especificado.
13
225
Clase PushbackInputStream
Permite devolver un byte al flujo de entrada con void unread(int ch).
Constructor:
PushbackInputStream(InputStream ent)
Ejemplo de uso de PushbackInputStream:
JavaIO/P9/PushbackInputStreamDemo.java
import java.io.*;
class PushbackInputStreamDemo {
public static void main(String args[]) throws IOException {
String s = "if (a == 4) a = 0;\n";
byte buf[] = s.getBytes();
ByteArrayInputStream in = new ByteArrayInputStream(buf);
PushbackInputStream f = new PushbackInputStream(in);
int c;
while ((c = f.read()) != -1) {
switch(c) {
case =:
if ((c = f.read()) == =)
System.out.print(".eq.");
else {
System.out.print("<-");
f.unread(c);
}
break;
default: System.out.print((char) c);
break;
}
}
}
}
Salida del programa
if (a .eq. 4) a <- 0;
13
226
Clase PrintStream
13
227
13
228
13
229
try {
while (true) {
price = in.readDouble();
in.readChar();
// throws out the tab
unit = in.readInt();
in.readChar();
// throws out the tab
char chr;
desc = new StringBuffer(20);
char lineSep = System.getProperty(
"line.separator").charAt(0);
while ((chr = in.readChar()) != lineSep)
desc.append(chr);
System.out.println("Youve ordered " + unit +
" units of " + desc + " at $" + price);
total = total + unit * price;
}
} catch (EOFException e) {
}
System.out.println("For a TOTAL of: $" + total);
in.close();
}
}
13
Clase SequenceInputStream
Permite concatenar m
ultiples flujos del tipo InputStream.
Constructores:
SequenceInputStream(InputStream primero,
InputStream segundo)
SequenceInputStream(Enumeration enum)
Ejemplo de uso de SequenceInputStream:
JavaIO/P10/SequenceInputStreamDemo.java
import java.io.*;
import java.util.*;
class InputStreamEnumerator implements Enumeration {
private Enumeration files;
public InputStreamEnumerator(Vector files) {
this.files = files.elements();
}
public boolean hasMoreElements() {
return files.hasMoreElements();
}
public Object nextElement() {
try {
return new FileInputStream(
files.nextElement().toString());
} catch (Exception e) {
return null;
}
}
}
230
13
231
class SequenceInputStreamDemo {
public static void main(String args[]) throws Exception {
int c;
Vector files = new Vector();
files.addElement("SequenceInputStreamDemo.java");
files.addElement("../P9/PushbackInputStreamDemo.java");
InputStreamEnumerator e = new InputStreamEnumerator(files);
InputStream input = new SequenceInputStream(e);
while ((c = input.read()) != -1) {
System.out.print((char) c);
}
input.close();
}
}
13
13.4.
232
Clase RandomAccessFile
13
13.5.
233
13
234
Clase Reader
Es una clase abstracta que define el modelo de Java de entrada de
caracteres.
Los metodos de esta clase lanzan una IOException cuando ocurren errores.
Metodos
abstract void close(): Cierra el flujo y libera los recursos que
usa.
void mark(int readlimit): Establece una marca en la posicion
actual del flujo, que permite regresar posteriormente a esa posicion.
boolean markSupported(): Indica si el flujo permite poner marcas.
int read()
int read(char[] buffer)
abstract int read(char[] buffer, int offset, int length):
Lee caracteres del flujo de entrada.
void reset(): Reposiciona el flujo en la marca establecida
previamente.
long skip(long charcount): Salta charcount caracteres
devolviendo el n
umero de caracteres realmente saltados.
Clase Writer
Es una clase abstracta que define el modelo de salida de caracteres.
Todos sus metodos devuelven void y lanzan una IOException en caso de
error.
Metodos
abstract void close(): Cierra el flujo y libera los recursos que
utiliza.
abstract void flush(): Fuerza a escribir los posibles caracteres
que haya almacenados en un buffer de memoria.
13
235
13
236
13.5.2.
Constructor:
InputStreamReader(InputStream in)
OutputStreamWriter(OutputStream out)
Ejemplo:
BufferedReader in
= new BufferedReader(new InputStreamReader(System.in));
13.5.4.
13
inputStream)
inputStream, int bufSize)
outputStream)
outputStream, int bufSize)
237
13
Clase PushbackReader
13.5.6.
238
Clase PrintWriter
13
13.6.
239
Flujos predefinidos
13
240
En Java 1.0, la u
nica forma de realizar entrada por la consola era
mediante un flujo de bytes.
En Java 2, la forma preferida para realizar entrada por la consola es
mediante un flujo de caracteres.
Para ello haremos uso de la clase BufferedReader usando por ejemplo
el constructor BufferedReader(Reader inputReader) en la siguiente
forma:
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
Ejemplo de lectura de caracteres: JavaIO/P17/BRRead.java
import java.io.*;
class BRRead {
public static void main(String args[])
throws IOException
{
char c;
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter characters, q to quit.");
// read characters
do {
c = (char) br.read();
System.out.println(c);
} while(c != q);
}
}
13
241
13
242
13
13.7.
243
13
M
as ejemplos de utilizaci
on de flujos de E/S
244
13
13.8.
245
Clase StreamTokenizer
13
246
13
247
13
13.9.
248
Serializaci
on de objetos
13
249
13
250
Ejemplo de uso:
13
251
13
252
catch ( IOException x ) {
System.out.println( x );
x.printStackTrace();
}
}
}
13.9.1.
Especificaci
on del n
umero de versi
on
Interfaz Externalizable
13
253
13
254
14
14.
255
14.1.
14.1.1.
Revisi
on de clases de envoltura
14
256
Fundamentos de Autoboxing/Unboxing
Java usa tipos primitivos (int, double, etc) para guardar los tipos de
datos b
asicos, por razones de eficiencia: los tipos primitivos no son
parte de la jerarqua de clases.
Java proporciona clases de envoltura (wrappers) que permiten
encapsular un tipo primitivo en un objeto.
Boolean
Byte
Character
Double
Float
Long
Integer
Short
double doubleValue()
float floatValue()
int intValue()
long longValue()
short shortValue()
14
257
Autoboxing en llamadas a m
etodos
14
258
Autoboxing/Unboxing en expresiones
14.1.5.
14
259
// Autobox/unbox a boolean.
Boolean b = true;
// Below, b is auto-unboxed when used in
// a conditional expression, such as an if.
if(b) System.out.println("b is true");
// Autobox/unbox a char.
Character ch = x; // box a char
char ch2 = ch; // unbox a char
System.out.println("ch2 is " + ch2);
14
14.2.
Generics
14.2.1.
Qu
e son los generics?
}
}
14.1.6.
Una clase, interfaz o metodo que usa un tipo parametrizado se dice que
es generico.
14.1.7.
260
Los generics a
naden seguridad de tipos ya que no hay que usar castings
explcitos para pasar de Object al tipo concreto que se este usando.
14.2.2.
Un ejemplo simple
14
261
14
Ejemplo
Gen<Integer> iOb;
iOb = new Gen<Double>(88.0); // Error en compilaci
on
Otro ejemplo
System.out.println();
C
omo mejoran los generics la seguridad de tipos?
262
14
263
14
ob2 = o2;
}
// Show types of T and V.
void showTypes() {
System.out.println("Type of T is " +
ob1.getClass().getName());
System.out.println("Type of V is " +
ob2.getClass().getName());
}
T getob1() {
return ob1;
}
V getob2() {
return ob2;
}
System.out.println();
// Create another NonGen object and
// store a String in it.
NonGen strOb = new NonGen("Non-Generics Test");
// Show the type of data used by strOb.
strOb.showType();
// Get the value of strOb.
// Again, notice that a cast is necessary.
String str = (String) strOb.getob();
System.out.println("value: " + str);
264
}
// Demonstrate TwoGen.
class SimpGen {
public static void main(String args[]) {
TwoGen<Integer, String> tgObj =
new TwoGen<Integer, String>(88, "Generics");
}
}
14.2.5.
Tipos limitados
A veces nos interesa crear una clase generica que solo sirva para tipos
de una determinada clase y subclases
Ejemplo erroneo
// Stats attempts (unsuccessfully) to
// create a generic class that can compute
// the average of an array of numbers of
// any given type.
//
// The class contains an error!
class Stats<T> {
T[] nums; // nums is an array of type T
// Pass the constructor a reference to
// an array of type T.
Stats(T[] o) {
nums = o;
}
// Return type double in all cases.
double average() {
double sum = 0.0;
14
265
14
266
Con par
ametros limitados (bounded types) podemos crear un lmite
superior para la superclase de la que deben derivar obligatoriamente los
argumentos tipo.
//
//
//
//
double x = strob.average();
System.out.println("strob average is " + v);
}
14.2.6.
14
267
14
268
14
269
14
<lista-par
ametros-tipo> tipo-retorno nombre-m
etodo(
lista-par
ametros) { //...
Ejemplo de m
etodo gen
erico: P82/GenMethDemo.java
// Demonstrate a simple generic method.
class GenMethDemo {
// Determine if an object is in an array.
static <T, V extends T> boolean isIn(T x, V[] y) {
for(int i=0; i < y.length; i++)
if(x.equals(y[i])) return true;
return false;
}
public static void main(String args[]) {
// Use isIn() on Integers.
Integer nums[] = { 1, 2, 3, 4, 5 };
if(isIn(2, nums))
System.out.println("2 is in nums");
if(!isIn(7, nums))
System.out.println("7 is not in nums");
System.out.println();
M
etodos gen
ericos
Es posible crear m
etodos gen
ericos que usan uno o mas parametros
tipo dentro de una clase no generica.
270
//
//
}
}
Constructores gen
ericos
Los constructores tambien pueden ser genericos aunque su clase no lo
sea.
Ejemplo de m
etodo gen
erico: P83/GenConsDemo.java
// Use a generic constructor.
class GenCons {
private double val;
14
271
14
272
void showval() {
System.out.println("val: " + val);
}
}
class GenConsDemo {
public static void main(String args[]) {
14.2.9.
Interfaces gen
ericos
Los interfaces tambien pueden ser genericos al igual que las clases:
Ejemplo de m
etodo gen
erico: P84/GenIFDemo.java
// A generic interface example.
// A Min/Max interface.
interface MinMax<T extends Comparable<T>> {
T min();
T max();
}
// Now, implement MinMax
class MyClass<T extends Comparable<T>> implements MinMax<T> {
T[] vals;
MyClass(T[] o) { vals = o; }
// Return the minimum value in vals.
public T min() {
T v = vals[0];
for(int i=1; i < vals.length; i++)
if(vals[i].compareTo(v) < 0) v = vals[i];
return v;
}
// Return the maximum value in vals.
public T max() {
T v = vals[0];
for(int i=1; i < vals.length; i++)
if(vals[i].compareTo(v) > 0) v = vals[i];
return v;
}
}
class GenIFDemo {
public static void main(String args[]) {
// Error
class MyClass<T extends Comparable<T>>
implements MinMax<T extends Comparable <T>> {
14
273
14
Tipos rasos y c
odigo heredado
Para que c
odigo antiguo (anterior a la versi
on 5.0) pueda funcionar con
c
odigo generico, Java permite que una clase generica pueda usarse sin
argumentos tipo: esto creara un tipo raso (raw type).
Por ejemplo, para crear un objeto de la clase Gen sustituyendo el
tipo T por Object:
Gen raw = new Gen(new Double(98.6));
El inconveniente es que se pierde la seguridad de tipos de los
genericos.
Ejemplo de raw tipe: P85/RawDemo.java
// Demonstrate a raw type.
class Gen<T> {
T ob; // declare an object of type T
// Pass the constructor a reference to
// an object of type T.
Gen(T o) {
ob = o;
}
// Return ob.
T getob() {
return ob;
}
}
// Demonstrate raw type.
class RawDemo {
public static void main(String args[]) {
// Create a Gen object for Integers.
Gen<Integer> iOb = new Gen<Integer>(88);
// Create a Gen object for Strings.
Gen<String> strOb = new Gen<String>("Generics Test");
274
//
//
//
}
}
14
275
14
return ob2;
}
}
// Create an object of type Gen2.
class HierDemo {
public static void main(String args[]) {
La u
nica particularidad es que cualquier argumento tipo necesitado en
una superclase debe ser pasado a las subclases.
Superclases gen
ericas
Ejemplo de jerarqua de clases
// A simple generic class heirarchy.
class Gen<T> {
T ob;
System.out.print(x.getob());
System.out.println(x.getob2());
}
}
Subclase gen
erica
Una clase no generica puede ser perfectamente superclase de una clase
generica.
Gen(T o) {
ob = o;
}
// Return ob.
T getob() {
return ob;
}
}
// A subclass of Gen.
class Gen2<T> extends Gen<T> {
Gen2(T o) {
super(o);
}
}
}
// A generic subclass.
class Gen<T> extends NonGen {
T ob; // declare an object of type T
// Pass the constructor a reference to
// an object of type T.
Gen(T o, int i) {
super(i);
ob = o;
}
// Return ob.
T getob() {
return ob;
}
}
// A subclass of Gen that defines a second
// type parameter, called V.
class Gen2<T, V> extends Gen<T> {
V ob2;
Gen2(T o, V o2) {
super(o);
ob2 = o2;
}
V getob2() {
276
}
// Create a Gen object.
class HierDemo2 {
public static void main(String args[]) {
// Create a Gen object for String.
Gen<String> w = new Gen<String>("Hello", 47);
System.out.print(w.getob() + " ");
14
277
14
278
Comparaci
on de tipos en tiempo de ejecuci
on con una jerarqua
gen
erica
El operador instanceof puede aplicarse a objetos de clases genericas.
Ejemplo de instanceof: P88/HierDemo3.java
// Use the instanceof operator with a generic class hierarchy.
class Gen<T> {
T ob;
Gen(T o) {
ob = o;
}
// Return ob.
T getob() {
return ob;
}
}
// A subclass of Gen.
class Gen2<T> extends Gen<T> {
Gen2(T o) {
super(o);
}
}
// Demonstrate runtime type ID implications of generic class hierarchy.
class HierDemo3 {
public static void main(String args[]) {
// Create a Gen object for Integers.
Gen<Integer> iOb = new Gen<Integer>(88);
// Create a Gen2 object for Integers.
Gen2<Integer> iOb2 = new Gen2<Integer>(99);
// Create a Gen2 object for Strings.
Gen2<String> strOb2 = new Gen2<String>("Generics Test");
// See if iOb2 is some form of Gen2.
if(iOb2 instanceof Gen2<?>)
System.out.println("iOb2 is instance of Gen2");
// See if iOb2 is some form of Gen.
if(iOb2 instanceof Gen<?>)
System.out.println("iOb2 is instance of Gen");
System.out.println();
// See if strOb2 is a Gen2.
if(strOb2 instanceof Gen2<?>)
System.out.println("strOb is instance of Gen2");
// See if strOb2 is a Gen.
if(strOb2 instanceof Gen<?>)
System.out.println("strOb is instance of Gen");
System.out.println();
// See if iOb is an instance of Gen2, which its not.
if(iOb instanceof Gen2<?>)
14
279
14
//
//
System.out.println(iOb2.getob());
System.out.println(strOb2.getob());
}
}
14.2.12.
Sobreescritura de m
etodos en una clase gen
erica
Gen
ericos y colecciones
280
En c
odigo pre-generico las colecciones almacenan referencias a Object,
para poder guardar objetos de cualquier clase.
Esto es una fuente de errores:
14
281
14
14.2.13.
// ...
// These two overloaded methods are ambiguous.
// and will not compile.
void set(T o) {
ob1 = o;
}
class ArrayList<E>
Ejemplo de uso de colecci
on en versi
on gen
erica:
P90/NewStyle.java
// Modern, generics version.
import java.util.*;
class NewStyle {
public static void main(String args[]) {
// Now, list holds references of type String.
ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
// Notice that Iterator is also generic.
Iterator<String> itr = list.iterator();
//
Errores de ambig
uedad
//
282
void set(V o) {
ob2 = o;
}
}
14.2.14.
Los par
ametros tipo no pueden instanciarse
Ejemplo
// Cant create an instance of T.
class Gen<T> {
T ob;
Gen() {
ob = new T(); // Illegal!!!
}
}
14
283
Ning
un miembro static puede usar un par
ametro tipo declarado en la
clase.
Ejemplo
14
class Wrong<T> {
// Wrong, no static variables of type T.
static T ob;
T vals[]; // OK
Gen(T o, T[] nums) {
ob = o;
Si que es v
alido declarar metodos genericos static, que definan sus
propios par
ametros tipo (ver ejemplo de secci
on M
etodos gen
ericos).
284
// This is OK.
Gen<?> gens[] = new Gen<?>[10]; // OK
}
}
14
14.3.
285
El bucle for-each
14
286
}
}
14
287
14
288
El bucle for-each permite iterar sobre los objetos de cualquier clase que
implemente Iterable, por ejemplo las clases de coleccion.
Ejemplo de bucle for-each en una colecci
on:
P95/AvgCollection.java
// Using a for-each for loop with a collection.
import java.util.*;
class AvgCollection {
static double getAvg(ArrayList<Double> nums) {
double sum = 0.0;
for(double itr : nums)
sum = sum + itr;
list.add(10.14);
list.add(20.22);
list.add(30.78);
list.add(40.46);
double avg = getAvg(list);
}
}
}
Creaci
on de objetos iterables
14
289
14
Iterator<T> iterator()
El interfaz Iterator se define como:
interface Iterator<E>
Iterator define los metodos:
}
class ForEachIterable {
public static void main(String args[]) {
StrIterable x = new StrIterable("This is a test.");
// Show each character.
for(char ch : x)
System.out.print(ch);
System.out.println();
}
}
290
14
14.4.
291
14
for(int x : v)
System.out.print(x + " ");
System.out.println();
}
public static void main(String args[])
{
vaTest("One vararg: ", 10);
vaTest("Three varargs: ", 1, 2, 3);
vaTest("No varargs: ");
}
for(int x : v)
System.out.print(x + " ");
System.out.println();
}
292
14
293
Sobrecarga de m
etodos vararg
14
294
for(int x : v)
System.out.print(x + " ");
System.out.println();
System.out.println();
for(boolean x : v)
System.out.print(x + " ");
System.out.println();
}
static void vaTest(String msg, int ... v) {
System.out.print("vaTest(String, int ...): " +
msg + v.length +
" Contents: ");
for(int x : v)
System.out.print(x + " ");
System.out.println();
}
public static void main(String args[])
{
vaTest(1, 2, 3);
vaTest("Testing: ", 10, 20);
vaTest(true, false, false);
}
}
14.4.2.
Varargs y ambig
uedad
Otro ejemplo:
static void vaTest(int ... v){ // ...
static void vaTest(int n, int ... v){ // ...
Aqu, el compilador no sabra a que metodo llamar cuando se hace:
vaTest(1);
14.5.
Enumeraciones
14.5.1.
Introducci
on
14
295
enumeraci
on, que es implcitamente un miembro public y static de
Apple.
Las variables enumeration se declaran y usan en la misma forma en
que se hace para variables de tipos primitivos:
Apple ap;
Ejemplo de uso de enumeraci
on: P101/EnumDemo.java
// An enumeration of apple varieties.
enum Apple {
Jonathan, GoldenDel, RedDel, Winsap, Cortland
}
class EnumDemo {
public static void main(String args[])
{
Apple ap;
ap = Apple.RedDel;
// Output an enum value.
System.out.println("Value of ap: " + ap);
System.out.println();
14
296
ap = Apple.GoldenDel;
// Compare two enum values.
if(ap == Apple.GoldenDel)
System.out.println("ap conatins GoldenDel.\n");
// Use an enum to control a switch statement.
switch(ap) {
case Jonathan:
System.out.println("Jonathan is red.");
break;
case GoldenDel:
System.out.println("Golden Delicious is yellow.");
break;
case RedDel:
System.out.println("Red Delicious is red.");
break;
case Winsap:
System.out.println("Winsap is red.");
break;
case Cortland:
System.out.println("Cortland is red.");
break;
}
}
}
14.5.3.
14.5.2.
M
etodos values() y valueOf()
14
297
14
298
14
299
14
Restricciones:
if(ap.compareTo(ap2) > 0)
System.out.println(ap2 + " comes before " + ap);
if(ap.compareTo(ap3) == 0)
System.out.println(ap + " equals " + ap3);
Clase Enum
System.out.println();
if(ap.equals(ap2))
System.out.println("Error!");
if(ap.equals(ap3))
System.out.println(ap + " equals " + ap3);
if(ap == ap3)
System.out.println(ap + " == " + ap3);
}
}
300
14
14.6.
301
Static import
Al usar una sentencia import static es posible usar los miembros static
de una clase directamente sin tener que incluir delante el nombre de la
clase.
Ejemplo de import static: P105/Hypot.java
14
302
}
}
14.6.1.
14.6.3.
Ambig
uedad
14
303
14
14.7.
Annotations (Metadata)
304
14.8.
Entrada/Salida formateada
14
305
Tambien a
nade la capacidad de leer entrada formateada,
indepedientemente de si viene de un fichero, teclado, String u otra
fuente.
14
}
}
306