0% encontró este documento útil (0 votos)
67 vistas152 páginas

Introduccion Al Java

El documento presenta un índice de los temas cubiertos en un curso de programación en Java, incluyendo introducción al lenguaje, tipos de datos, operadores, sentencias de control, clases, herencia, paquetes, excepciones y programación multihilo. Cubre conceptos básicos de Java así como características avanzadas del lenguaje.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
67 vistas152 páginas

Introduccion Al Java

El documento presenta un índice de los temas cubiertos en un curso de programación en Java, incluyendo introducción al lenguaje, tipos de datos, operadores, sentencias de control, clases, herencia, paquetes, excepciones y programación multihilo. Cubre conceptos básicos de Java así como características avanzadas del lenguaje.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 152

INDICE

0-0

Indice
1. Primer programa en Java
1.1. Cuestiones sobre nomenclatura . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Compilaci
on y ejecuci
on del programa con CLDC . . . . . . . . . . . . . . . .

1
1
1

2. Tipos de datos, variables y matrices


2.1. Tipos simples . . . . . . . . . . . . . . . . . . .
2.2. Literales . . . . . . . . . . . . . . . . . . . . . .
2.3. Variables . . . . . . . . . . . . . . . . . . . . . .
2.4. Conversi
on de tipos . . . . . . . . . . . . . . . .
2.5. Vectores y matrices . . . . . . . . . . . . . . . .
2.5.1. Vectores . . . . . . . . . . . . . . . . . .
2.5.2. Matrices multidimensionales . . . . . . .
2.5.3. Sintaxis alternativa para la declaraci
on de
2.6. Punteros . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.

4
4
5
6
6
8
8
8
9
9

3. Operadores
3.1. Tabla de precedencia de operadores: . . . . . . . . . . . . . . . . . . . . . . . .

9
10

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 . . . . . . . .

. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
matrices
. . . . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

11
11
11
12
12
12
13
13

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.8. Ejemplo de clase (Clase Stack): P7/TestStack.java

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

14
14
14
14
15
15
17
17
19
20
21
22
22
23

. . . . .
de tipo
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

25
25
27
28
30
32
33
34
35
36
36

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

6. M
etodos y clases
6.1. Sobrecarga de m
etodos . . . . . . . . . . . .
6.1.1. Sobrecarga con conversi
on autom
atica
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 variables . . . . . . .
6.7. Clase String . . . . . . . . . . . . . . . . . .
6.8. Argumentos de la lnea de ordenes . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

INDICE

0-1

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
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .

38
38
40
41
43
44
45
46
48
50

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 . . . . . . . . . . . . . . .
8.4.2. Implementaci
on de una interfaz . . . . . . . . . . .
8.4.3. Acceso a implementaciones a trav
es de referencias de
8.4.4. Implementaci
on parcial . . . . . . . . . . . . . . . .
8.4.5. Variables en interfaces . . . . . . . . . . . . . . . .
8.4.6. Las interfaces se pueden extender . . . . . . . . . .

. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
la interfaz
. . . . . .
. . . . . .
. . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

51
51
51
51
53
54
54
54
57
59
59
60
61
61
62
63

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. Cl
ausula 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 . . . . .

65
65
66
68
70
71
71
74
76
77
79
80

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

10.Programaci
on Multihilo (Multihebra)
10.1. Hebras en CLDC . . . . . . . . . . . . . . .
10.2. El hilo principal . . . . . . . . . . . . . . . .
10.3. Creaci
on de un hilo . . . . . . . . . . . . . .
10.3.1. Implementaci
on del interfaz Runnable
10.3.2. Extensi
on de la clase Thread . . . . .
10.3.3. Elecci
on de una de las dos opciones .
10.4. Creaci
on de m
ultiples hilos . . . . . . . . . .
10.5. Utilizaci
on de isAlive() y join() . . . . . . . .
10.6. Prioridades de los hilos . . . . . . . . . . . .
10.7. Sincronizaci
on . . . . . . . . . . . . . . . . .
10.7.1. Uso de m
etodos sincronizados . . . .
10.7.2. Sentencia synchronized . . . . . . . .
10.8. Comunicaci
on entre hilos . . . . . . . . . . .
10.8.1. Interbloqueos . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

82
. 82
. 83
. 84
. 84
. 86
. 87
. 88
. 90
. 93
. 95
. 95
. 98
. 99
. 104

INDICE

10.9. Suspender, reanudar y terminar hilos

0-2

. . . . . . . . . . . . . . . . . . . . . . . 107

11.Connected Limited Device Configuration: CLDC


11.1. Qu
e son las configuraciones en J2ME? . . . . . . . . . . .
11.2. La configuraci
on CLDC . . . . . . . . . . . . . . . . . . . .
11.2.1. La m
aquina virtual Java de CLDC . . . . . . . . . .
11.3. La librera de clases de CLDC . . . . . . . . . . . . . . . .
11.3.1. Paquete java.lang . . . . . . . . . . . . . . . . . . .
11.3.2. Paquete java.util . . . . . . . . . . . . . . . . . . .
11.4. Entrada/salida en Java . . . . . . . . . . . . . . . . . . . .
11.4.1. Introducci
on . . . . . . . . . . . . . . . . . . . . . .
11.4.2. Clases de CLDC para E/S de datos: Paquete java.io
11.4.3. Clases para flujos de bytes . . . . . . . . . . . . . .
11.4.4. Clases para flujos de caracteres . . . . . . . . . . . .
11.5. Paquete javax.microedition.io . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

110
110
110
110
111
111
117
132
132
132
134
145
148

1.

Primer programa en Java

P1/HolaMundo.java
/* Este es un primer programa de prueba.
Este archivo se llama "HolaMundo.java" */
class HolaMundo {
// El programa comienza con una llamada a main().
public static void main(String args[]) {
System.out.println("Hola mundo.");
}
}

1.1.

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.

1.2.

Compilaci
on y ejecuci
on del programa con CLDC

Los primeros programas que hacen uso s


olo de caractersticas de CLDC los
compilaremos y ejecutaremos usando el paquete j2me_cldc-1_1 que
est
a instalado en:
$HOME/java/j2me_cldc
Es conveniente crear un directorio temporal d
onde se generar
an las clases
compiladas (ficheros .class).
mkdir tmpclasses

1.2 Compilaci
on y ejecuci
on del programa con CLDC

Compilaci
on Para compilar usaremos el compilador de J2SE (jdk1.5)
que est
a instalado en las aulas de ordenadores en el directorio:
/usr/local/jdk1.5.0_06
javac -bootclasspath $CLDC_PATH/common/api/classes
-d tmpclasses HolaMundo.java
El compilador javac crea un archivo llamado HolaMundo.class en el
directorio tmpclasses que contiene el bytecode compilado del
programa.
La opci
on -bootclasspath es usada para modificar el directorio del
que se toman las clases b
asicas de Java en la compilaci
on. Son
utilizadas las libreras b
asicas de CLDC en lugar de las de J2SE.
Preverificaci
on
preverify -classpath $CLDC_PATH/common/api/classes:tmpclasses
-d . HolaMundo
Esta orden crea un nuevo fichero HolaMundo.class a partir del fichero
HolaMundo.class del directorio tmpclasses. En este caso es creado en el
directorio actual.
Ejecuci
on
kvm -classpath . HolaMundo
Salida del programa
Hola mundo

1.2 Compilaci
on y ejecuci
on del programa con CLDC

An
alisis del primer programa de prueba
Comentarios de varias lneas
/*
Este es un primer programa de prueba.
Este archivo se llama "HolaMundo.java"
*/
Definici
on de la clase
public class HolaMundo {
La definici
on de una clase, incluyendo todos sus miembros, estar
a 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 ejecuci
on llamando a
main. Sin embargo, cuando hacemos un Midlet, los programas no
comienzan por main sino que ejecutan el constructor y luego el
metodo startApp().
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 s
olo en
metodos de la misma clase).
La palabra static permite que main sea llamado sin tener que crear
un objeto de esta clase (HolaMundo).
La palabra void indica que main no devuelve ning
un valor.
El par
ametro String args[] declara una matriz de instancias de la
clase String que corresponde a los argumentos de la lnea de
ordenes.
Siguiente lnea de c
odigo:
System.out.println("Hola mundo.");
Esta lnea visualiza la cadena "Hola mundo" en la pantalla.

2.

Tipos de datos, variables y matrices


Java es un lenguaje fuertemente tipado:
Cada variable tiene un tipo, cada expresi
on tiene un tipo y cada
tipo est
a definido estrictamente.
En todas las asignaciones (directas o a traves de par
ametros) se
comprueba la compatibilidad de los tipos.
Java es m
as estricto que C en asignaciones y paso de par
ametros.

2.1.

Tipos simples

No son orientados a objetos y son an


alogos a los de C (por razones de
eficiencia).
Todos los tipos de datos tienen un rango definido estrictamente a
diferencia de C (por razones de portabilidad).
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
S
olo disponibles en la versi
on 1.1 de CLDC.
float: 32 bits. [3, 4 1038 , 3, 4 1038 ]
double: 64 bits. [1, 7 10308 , 1, 7 10308 ]

2.2 Literales

Caracteres
Java utiliza c
odigo Unicode para representar caracteres.
Es un conjunto de caracteres completamente internacional con todos
los caracteres de todas las lenguas del mundo.
char: 16 bits ([0, 65536])
Los caracteres ASCII van del [0, 127] y el ISO-Latin-1 (caracteres
extendidos) del [0, 255]
Booleanos
boolean: Puede tomar los valores true o false

2.2.

Literales

Enteros
Base decimal: 1, 2, 3, etc
Base octal: 09
Hexadecimal: Se antepone 0x o 0X.
Long: Se a
nade L. Ej: 101L
Coma flotante
S
olo disponibles en la versi
on 1.1 de CLDC. Son de doble precisi
on por
defecto (double).
Notaci
on est
andar: 2,0, 3,14, ,66
Notaci
on cientfica: 6,022E23
A
nadiendo al final F se considera float, y a
nadiendo D double.
Booleanos: true y false

2.3 Variables

Car
acter
Se encierran entre comillas simples.
Se pueden usar secuencias de escape:
\141 (3 dgitos): C
odigo en octal de la letra a
\u0061 (4 dgitos): C
odigo en hexadecimal (car
acter Unicode) de la
letra a
\: Comilla simple
\\: Barra invertida
\r: Retorno de carro
\t: Tabulador \b: Retroceso
Cadena: Entre comillas dobles

2.3.

Variables

La forma b
asica de declaraci
on de variables es:
tipo identificador [=valor][,identificador[=valor]...];
tipo es un tipo b
asico, nombre de una clase o de un interfaz.
Los inicializadores pueden ser din
amicos:
double a=3.0, b=4.0;
double c=Math.sqrt(a*a + b*b)
El anterior c
odigo usa operaciones en coma flotante, que s
olo est
an
disponibles en CLDC 1.1
Java permite declarar variables dentro de cualquier bloque.
Java tiene dos tipos de
ambito
De clase:
De metodo:
Los a
mbitos 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 s
olo pueden usarse despues de declararse.

2.4 Conversi
on de tipos

2.4.

Conversi
on de tipos

Funciona de forma parecida a C++


Conversi
on autom
atica de Java
La conversi
on autom
atica de tipos se hace si:
Los dos tipos son compatibles. Ejemplo: se puede asignar int a un
long
El tipo destino es m
as grande que el tipo origen
Los tipos char y boolean no son compatibles con el resto.
Conversi
on de tipos incompatibles
Cuando queramos asignar a un tipo peque
no, otro mayor haremos uso de
una conversi
on explcita:
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 autom
aticas de tipo en las expresiones.
short y byte promocionan a int en expresiones para hacer los c
alculos.
Si un operador es long todo se promociona a long
Si un operador es float todo se promociona a float
Si un operador es double todo se promociona a double
Ejemplo de c
odigo con error de compilaci
on:
byte b=50;
b = b*2; //Error, no se puede asignar un int a un byte

2.5 Vectores y matrices

2.5.

Vectores y matrices

Hay algunas diferencias en el funcionamiento de los vectores y matrices


respecto a C y C++
2.5.1.

Vectores

Declaraci
on
tipo nombre-vector[];
Esto s
olo declara nombre-vector como vector de tipo, y le asigna null.
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

En Java las matrices son consideradas matrices de matrices.


Declaraci
on y reserva de memoria: int twoD[][]=new int[4][5];
Podemos reservar cada fila de forma independiente:
int twoD[][]=new int[4][];
twoD[0]=new int[1];
twoD[1]=new int[2];
twoD[2]=new int[3];
twoD[3]=new int[2];

2.6 Punteros
2.5.3.

9
Sintaxis alternativa para la declaraci
on de matrices

tipo[] nombre-matriz;
Ejemplo:
int[] a2=new int[3];
char[][] twoD2=new char[3][4];

2.6.

Punteros

Java no permite punteros que puedan ser accedidos y/o modificados


por el programador, ya que eso permitira que los applets rompieran el
cortafuegos existente entre el entorno de ejecuci
on y el host cliente.

3.

Operadores

La mayora de los operadores de Java funcionan igual que los de C/C++,


salvo algunas excepciones (los operadores a nivel de bits de desplazamiento
a la derecha).
Los tipos enteros se representan mediante codificaci
on en complemento
a dos: los n
umeros negativos se representan invirtiendo sus bits y
sumando 1.
Desplazamiento a la derecha: valor >> num
Ejemplo 1
int a=35;
a = a >> 2; // ahora a contiene el valor 8
Si vemos las operaciones en binario:
00100011
>>2
00001000

35
8

3.1 Tabla de precedencia de operadores:

10

Este operador >> rellena el nuevo bit superior con el contenido de su


valor previo:
Ejemplo 2
11111000
>>2
11111100

-8
-4

Desplazamiento a la derecha sin signo: valor >>> num


Rellena el bit superior con cero.
Ejemplo
int a=-1;
a = a >> 24;
Si vemos las operaciones en binario:
11111111 11111111 11111111 11111111
>>24
00000000 00000000 00000000 11111111

3.1.
.
++
*
+
<<
<
==
&
^
|
&&
||
?:
=

-1 en binario como entero


255 en binario como entero

Tabla de precedencia de operadores:


[]
-/
>>
>
!=

op=

()
!
~
% (se puede aplicar a flotantes)
>>>
<=

*=

>=

/=

%=

+=

-=

etc.)

11

4.

Sentencias de control

De nuevo son pr
acticamente identicas a las de C/C++ salvo en las
sentencias break y continue

4.1.

Sentencias de selecci
on

if/else
if( Boolean ) {
sentencias;
}
else {
sentencias;
}
switch
switch( expr1 ) {
case expr2:
sentencias;
break;
case expr3:
sentencias;
break;
default:
sentencias;
break;
}

4.2.

Sentencias de iteraci
on

Bucles for
for( expr1 inicio; expr2 test; expr3 incremento ) {
sentencias;
}

4.3 Tratamiento de excepciones

12

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

Las sentencias break y continue se recomienda no usarlas, pues


rompen con la filosofa de la programaci
on estructurada:
4.4.1.

break

Tiene tres usos:


Para terminar una secuencia de sentencias en un switch
Para salir de un bucle
Como una forma de goto: break etiqueta

4.4 Sentencias de salto


4.4.2.

13

continue

Tiene dos usos:


Salir anticipadamente de una iteraci
on de un bucle (sin procesar el resto
del c
odigo de esa iteraci
on).
Igual que antes pero se especifica una etiqueta para describir el bucle
que lo engloba al que se aplica.
Ejemplo 1
uno: for( ) {
dos: for( ){
continue;
// seguir
a en el bucle interno
continue uno; // seguir
a en el bucle principal
break uno;
// se saldr
a del bucle principal
}
}
4.4.3.

return

Tiene el mismo uso de C/C++


Ejemplo 2
int func()
{
if( a == 0 )
return 1;
return 0; // es imprescindible
}

14

5.

Clases

5.1.

Fundamentos

Clase: La clase es la definici


on general de una entidad sobre la que
estamos interesados en realizar alg
un tipo de procesamiento
inform
atico.
Ejemplo: personas, coches, libros, alumnos, productos.
La clase es la base de la PDO en Java.
Objeto: Elemento real asociado a una clase (instancia de una clase).
5.1.1.

Forma general de una clase

En Java, a diferencia de C++, la declaraci


on de la clase y la
implementaci
on de los metodos se almacena en el mismo lugar:
class nombre_de_clase {
tipo variable_de_instancia1;
// ...
tipo variable_de_instanciaN;
tipo nombre_de_m
etodo1(lista_de_par
ametros) {
// cuerpo del m
etodo
}
// ...
tipo nombre_de_m
etodoN(lista_de_par
ametros) {
// cuerpo del m
etodo
}
}
5.1.2.

Una clase sencilla

class Box {
double width;
double height;
double depth;
}

5.2 Declaraci
on de objetos

5.2.

15

Declaraci
on de objetos

Para crear objetos de una clase se dan dos pasos:


Declarar una variable del tipo de la clase.
Obtener una copia fsica y real del objeto con el operador new
asign
andosela a la variable.
Box mybox=new Box();
o bien
Box mybox; // declara la referencia a un objeto
mybox=new Box(); // reserva espacio para el objeto

Sentencia
Box mybox;

Efecto
null
mybox

mybox=new Box();
mybox

5.2.1.

witdth
height
depth

Operador new

El operador new reserva memoria din


amicamente para un objeto.
variable = new nombre_de_clase();
Tambien hace que se llame al constructor de la clase. En este caso se
llama al constructor por defecto.

5.2 Declaraci
on de objetos

16

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);
}
}

5.3 Asignaci
on de variables referencia a objeto

5.3.

17

Asignaci
on de variables referencia a objeto

Las variables referencia a objeto se comportan de manera diferente a lo


que se podra esperar en asignaciones.
Box b1 = new Box();
Box b2 = b1;

b1

witdth
height
depth

b2
5.4.

M
etodos

Como dijimos anteriormente dentro de las clases podemos tener


variables de instancia y metodos.
La sintaxis para definir un metodo es la misma de C y C++:
tipo nombre_de_m
etodo(lista_de_par
ametros){
// cuerpo del m
etodo
}
Dentro de los metodos podemos usar las variables de instancia
directamente.
Para llamar a un metodo usamos:
objeto.nombre_metodo(parametros);

5.4 Metodos

18

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;
mybox2.width = 3;
mybox2.height = 6;
mybox2.depth = 9;
vol = mybox1.volume();
System.out.println("El volumen es " + vol);
vol = mybox2.volume();
System.out.println("El volumen es " + vol);
}
}

5.4 Metodos
5.4.1.

M
etodos con par
ametros

P4/BoxDemo5.java
/* Un programa que utiliza la clase Box */
class Box {
double width;
double height;
double depth;
// calcula y devuelve el volumen
double volume() {
return width * height * depth;
}
// establece las dimensiones de la caja
void setDim(double w, double h, double d) {
width = w;
height= h;
depth = d;
}
}
// Esta clase declara un objeto del tipo Box
class BoxDemo5 {
public static void main(String args[]) {
Box mybox1 = new Box();
Box mybox2 = new Box();
double vol;
// inicializa cada caja
mybox1.setDim(10,20,15);
mybox2.setDim(3,6,9);
vol = mybox1.volume();
System.out.println("El volumen es " + vol);
vol = mybox2.volume();
System.out.println("El volumen es " + vol);
}
}

19

5.5 Constructores

5.5.

20

Constructores

El constructor inicializa el objeto inmediatamente despues de su


creaci
on.
Tiene el mismo nombre que la clase, y no devuelve nada (ni siquiera
void).
Cuando no especificamos un constructor, Java crea un constructor por
defecto , que inicializa todas las variables de instancia a cero.
P5/BoxDemo6.java
class Box {
double width;
double height;
double depth;
Box() {
System.out.println("Constructor de Box");
width = 10;
height= 10;
depth = 10;
}
double volume() {
return width * height * depth;
}
}
class BoxDemo6 {
public static void main(String args[]) {
Box mybox1 = new Box();
Box mybox2 = new Box();
double vol;
vol = mybox1.volume();
System.out.println("El volumen es " + vol);
vol = mybox2.volume();
System.out.println("El volumen es " + vol);
}
}

5.5 Constructores
5.5.1.

Constructores con par


ametros

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);
}
}

21

5.6 this

5.6.

22

this

Los metodos pueden referenciar al objeto que lo invoc


o con la palabra
clave this.
Ejemplo de su utilidad
Box(double w,double h,double d) {
this.width = width;
this.height = height;
this.depth = depth;
}

5.7.

Recogida de basura

Java libera los objetos de manera autom


atica cuando ya no hay
ninguna referencia a esos objetos.
En J2SE tenemos en la clase Object el metodo void finalize(), pero
no en CLDC. Tal metodo es llamado autom
aticamente por el recolector
de basura cuando no existe ninguna referencia al objeto.
Cuando no necesitemos un objeto en CLDC es conveniente asignarle el
valor null a la variable que lo apunta para que el recolector de basura
pueda actuar.

5.8 Ejemplo de clase (Clase Stack): P7/TestStack.java

5.8.

23

Ejemplo de clase (Clase Stack): P7/TestStack.java

La clase permite el encapsulamiento de datos y c


odigo.
La clase es como una caja negra: No hace falta saber que ocurre dentro
para poder utilizarla.
class Stack {
int stck[] = new int[10];
int tos;
Stack() {/*Inicializa la posici
on superior de la pila*/
tos = -1;
}
void push(int item) {/*Introduce un elemento en la pila*/
if(tos==9)
System.out.println("La pila esta llena");
else
stck[++tos] = item;
}
int pop() {/*Extrae un elemento de la pila*/
if(tos < 0) {
System.out.println("La pila esta vac
a");
return 0;
}
else
return stck[tos--];
}
}

5.8 Ejemplo de clase (Clase Stack): P7/TestStack.java

24

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());
}
}

25

6.

M
etodos y clases

6.1.

Sobrecarga de m
etodos

Consiste en que dos o m


as metodos de una clase tienen el mismo nombre,
pero con listas de par
ametros 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.
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;
}
}

6.1 Sobrecarga de metodos

26

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

6.1 Sobrecarga de metodos


6.1.1.

27

Sobrecarga con conversi


on autom
atica de tipo

Java busca una versi


on del metodo cuyos par
ametros actuales coincidan
con los par
ametros 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)
}
}

6.1 Sobrecarga de metodos


6.1.2.

28

Sobrecarga de constructores

Adem
as de los metodos normales, tambien pueden sobrecargarse los
constructores.
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;
}
}

6.1 Sobrecarga de metodos


class OverloadCons {
public static void
Box mybox1 = new
Box mybox2 = new
Box mycube = new
double vol;

29

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);
}
}

6.2 Objetos como par


ametros

6.2.

30

Objetos como par


ametros

Un objeto de una determinada clase puede ser par


ametro de un metodo de
esa u otra clase.
P10/PassOb.java
class Test {
int a, b;
Test(int i, int j) {
a = i;
b = j;
}
// devuelve true si o es igual al objeto llamante
boolean equals(Test o) {
if(o.a == a && o.b == b) return true;
else return false;
}
}
class PassOb {
public static void main(String args[]) {
Test ob1 = new Test(100, 22);
Test ob2 = new Test(100, 22);
Test ob3 = new Test(-1, -1);
System.out.println("ob1 == ob2: " + ob1.equals(ob2));
System.out.println("ob1 == ob3: " + ob1.equals(ob3));
}
}

6.2 Objetos como par


ametros

31

Uno de los ejemplos m


as usuales es en constructores para hacer copias de
objetos:
Box(Box ob) {
width = ob.width;
height = ob.height;
depth = ob.depth;
}
Box mybox = new Box(10,20,15);
Box myclone = new Box(mybox);

6.3 Paso de argumentos

6.3.

32

Paso de argumentos

El paso de tipos simples a los metodos es siempre por valor.


Los objetos se pasan siempre por referencia.
P11/CallByValue.java
class Test {
void meth(int i, int j) {
i *= 2;
j /= 2;
}
}
class CallByValue {
public static void main(String args[]) {
Test ob = new Test();
int a = 15, b = 20;
System.out.println("a y b antes de la llamada:"+a+" "+b);
ob.meth(a, b);
System.out.println("a y b despues de la llamada:"+a+" "+b);
}
}

class Test {
int a, b;
Test(int i, int j) {
a = i;
b = j;
}
// pasa un objecto
void meth(Test o) {
o.a *= 2;
o.b /= 2;
}
}

6.4 Control de acceso

33

P12/CallByRef.java
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.

Control de acceso

Los especificadores de acceso para variables de instancia y metodos son:


private: S
olo es accesible por miembros de la misma clase.
public: Accesible por miembros de cualquier clase.
protected: Est
a relacionado con la herencia.
Por defecto: si no se indica nada los miembros son p
ublicos dentro de
su mismo paquete
P13/AccessTest.java
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;
}
}

6.5 Especificador static

34

class AccessTest {
public static void main(String args[]) {
Test ob = new Test();
// Esto es correcto, a y b pueden ser accedidas directamente
ob.a = 10;
ob.b = 20;
// Esto no es correcto y generara un error de compilaci
on
ob.c = 100; // Error!

//

// Se debe acceder a c a trav


es de sus m
etodos
ob.setc(100); // OK
System.out.println("a, b, y c: " + ob.a + " " +
ob.b + " " + ob.getc());
}
}

6.5.

Especificador static

Un miembro static puede ser usado sin crear ning


un objeto de su clase.
Puede aplicarse a variables de instancia y metodos
Las variables static son variables globales. Existe una sola copia de
la variable para todos los objetos de su clase.
Los metodos static
S
olo pueden llamar a metodos static
S
olo deben acceder a datos static
No pueden usar this o super
Una clase puede tener un bloque static que se ejecuta una sola vez
cuando la clase se carga por primera vez.

6.6 Especificador final con variables

35

P14/UseStatic.java
class UseStatic {
static int a = 3;
static int b;
static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
static {
System.out.println("Bloque est
atico inicializado.");
b = a * 4;
}
public static void main(String args[]) {
meth(42);
}
}

6.6.

Especificador final con variables

Una variable final es una variable en la que no podemos modificar su


contenido.
Las variables final deben inicializarse al declararlas.
Son similares al const de C/C++
Suele utilizar identificadores en may
uscula:
final
final
final
final
final

int
int
int
int
int

FILE_NEW = 1;
FILE_OPEN = 2;
FILE_SAVE = 3;
FILE_SAVEAS = 4;
FILE_QUIT = 5;

Existe una sola copia de ellas para todos los objetos de la clase.
Las variables final suelen ser tambien static.

6.7 Clase String

6.7.

36

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.
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");
}
}

6.8 Argumentos de la lnea de ordenes

6.8.

Argumentos de la lnea de ordenes

P16/CommandLine.java
// Presenta todos los argumentos de la linea 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:
kvm -classpath . 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

37

38

7.

Herencia

La herencia es uno de los pilares de la PDO ya que permite la creaci


on de
clasificaciones jer
arquicas.
Permite definir una clase general que define caractersticas comunes a
un conjunto de elementos relacionados.
Cada subclase puede a
nadir aquellas cosas particulares a ella.
Las subclases heredan todas las variables de instancia y los metodos
definidos por la superclase, y luego pueden a
nadir sus propios
elementos.

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.
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;
}

7.1 Fundamentos

39

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);
}
}

7.1 Fundamentos
7.1.1.

40

Una variable de la superclase puede referenciar a un


objeto de la subclase

El tipo de la variable referencia, (y no el del objeto al que apunta) es el que


determina los miembros que son accesibles.
P18/RefDemo.java
class RefDemo {
public static void main(String args[]) {
BoxWeight weightbox = new BoxWeight(3, 5, 7, 8.37);
Box plainbox = new Box();
double vol;
vol = weightbox.volume();
System.out.println("El volumen de weightbox ex " + vol);
System.out.println("El peso de weightbox es " +
weightbox.weight);
System.out.println();
// asigna una referencia de BoxWeight a una referencia de Box
plainbox = weightbox;
vol = plainbox.volume(); // OK, volume() definido en Box
System.out.println("Volumen de plainbox es " + vol);
/* La siguiente sentencia no es v
alida porque plainbox
no define un miembro llamado weight. */
System.out.println("El peso de plainbox es " +
// plainbox.weight);

//
}
}

7.2 Uso de super

7.2.

41

Uso de super

La palabra reservada super permite a una subclase referenciar a su


superclase inmediata. Es utilizada en las siguientes situaciones:
1. Para llamar al constructor de la superclase desde el constructor de la
subclase.
En este caso super() debe ser la primera sentencia ejecutada
dentro del constructor.
2. Para acceder a un miembro de la superclase que ha sido ocultado por
un miembro de la subclase.
Ejemplo de uso en caso 1
class BoxWeight extends Box {
double weight;
BoxWeight(double w, double h, double d, double m) {
super(w, h, d); // llama al constructor de la superclase
weight = m;
}
BoxWeight(BoxWeight ob) {
super(ob);
weight = ob.weight;
}
}

7.2 Uso de super

42

Ejemplo de uso en caso 2: P19/UseSuper.java


// Utilizaci
on de super para evitar la ocultaci
on de nombres
class A {
int i;
}
class B extends A {
int i; // esta i oculta la i de A
B(int a, int b) {
super.i = a; // i in A
i = b; // i in B
}
void show() {
System.out.println("i en la superclase: " + super.i);
System.out.println("i en la subclase: " + i);
}
}
class UseSuper {
public static void main(String args[]) {
B subOb = new B(1, 2);
subOb.show();
}
}

7.3 Orden de ejecuci


on de constructores

7.3.

43

Orden de ejecuci
on de constructores

Los constructores de una jerarqua de clases se ejecutan en el orden de


derivaci
on.
Ejemplo: P20/CallingCons.java
// Muestra cuando se ejecutan los constructores.
class A {
A() {
System.out.println("En el constructor de A.");
}
}
class B extends A {
B() {
System.out.println("En el constructor de B.");
}
}
class C extends B {
C() {
System.out.println("En el constructor de C.");
}
}
class CallingCons {
public static void main(String args[]) {
C c = new C();
}
}
La salida del programa es:
En el constructor de A.
En el constructor de B.
En el constructor de C.

7.4 Sobreescritura de metodos (Overriding)

7.4.

44

Sobreescritura de m
etodos (Overriding)

Consiste en construir un metodo en una subclase con el mismo nombre,


par
ametros y tipo que otro metodo de una de sus superclases (inmediata o
no).
Ejemplo: P21/Override.java
class A {
int i, j;
A(int a, int b) {
i = a;
j = b;
}
void show() {
System.out.println("i y j: " + i + " " + j);
}
}
class B extends A {
int k;
B(int a, int b, int c) {
super(a, b);
k = c;
}
// muestra k -- sobreescribe el metodo show() de A
void show() {
System.out.println("k: " + k);
}
}
class Override {
public static void main(String args[]) {
B subOb = new B(1, 2, 3);
subOb.show(); // llama al metodo show() de B
}
}

7.5 Selecci
on de metodo din
amica

7.5.

45

Selecci
on de m
etodo din
amica

Es el mecanismo mediante el cual una llamada a una funci


on sobreescrita
se resuelve en tiempo de ejecuci
on en lugar de en tiempo de compilaci
on:
polimorfismo en tiempo de ejecuci
on
Cuando un metodo sobreescrito se llama a traves de una referencia
de la superclase, Java determina la versi
on del metodo que debe
ejecutar en funci
on del objeto que est
a siendo referenciado.
Ejemplo: P22/Dispatch.java
class A {
void callme() {
System.out.println("Llama al metodo callme dentro de A");
}
}
class B extends A {
void callme() {
System.out.println("Llama al metodo callme dentro de B");
}
}
class C extends A {
void callme() {
System.out.println("Llama al metodo callme dentro de C");
}
}

7.5 Selecci
on de metodo din
amica
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.

46

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;
}
}

7.5 Selecci
on de metodo din
amica

47

class Rectangle extends Figure {


Rectangle(double a, double b) {
super(a, b);
}
double area() {
System.out.println("Dentro de Area para Rectangle.");
return dim1 * dim2;
}
}
class Triangle extends Figure {
Triangle(double a, double b) {
super(a, b);
}
double area() {
System.out.println("Dentro de Area para Triangle.");
return dim1 * dim2 / 2;
}
}
class FindAreas {
public static void main(String args[]) {
Figure f = new Figure(10, 10);
Rectangle r = new Rectangle(9, 5);
Triangle t = new Triangle(10, 8);
Figure figref;
figref = r;
System.out.println("Area es " + figref.area());
figref = t;
System.out.println("Area es " + figref.area());
figref = f;
System.out.println("Area es " + figref.area());
}
}

7.6 Clases abstractas

7.6.

48

Clases abstractas

Permiten definir una superclase que define la estructura de las subclases,


sin proporcionar una implementaci
on completa de sus metodos.
Todos los metodos abstractos (abstract) deben ser sobreescritos por
las subclases.
Los metodos abstractos tienen la forma:
abstract tipo nombre(par
ametros);
Cualquier clase con uno o m
as metodos abstractos debe declararse
como abstract
No se pueden crear objetos de clases abstractas (usando new)
No se pueden crear constructores abstract o metodos static abstract
Si podemos declarar variables referencia de una clase abstracta
Ejemplo: P24/AbstractAreas.java
abstract class Figure {
double dim1, dim2;
Figure(double a, double b) {
dim1 = a;
dim2 = b;
}
abstract double area();
}
class Rectangle extends Figure {
Rectangle(double a, double b) {
super(a, b);
}
double area() {
System.out.println("Dentro del metodo area para un Rectangle.");
return dim1 * dim2;
}
}

7.6 Clases abstractas

49

class Triangle extends Figure {


Triangle(double a, double b) {
super(a, b);
}
double area() {
System.out.println("Dentro del metodo area para un Triangle.");
return dim1 * dim2 / 2;
}
}
class AbstractAreas {
public static void main(String args[]) {
// Figure f = new Figure(10, 10); // Esto no es correcto
Rectangle r = new Rectangle(9, 5);
Triangle t = new Triangle(10, 8);
Figure figref; // esto es CORRECTO, no se crea ning
un objeto
figref = r;
System.out.println("Area es " + figref.area());
figref = t;
System.out.println("Area es " + figref.area());
}
}

7.7 Utilizaci
on de final con la herencia

7.7.

50

Utilizaci
on de final con la herencia

La palabra reservada final tiene tres usos:


1. Para creaci
on de constantes con nombre.
2. Para evitar sobreescritura de metodos
Los metodos declarados como final no pueden ser sobreescritos
3. Para evitar la herencia
Se usa final en la declaraci
on de la clase para evitar que la clase
sea heredada: O sea, todos sus metodos ser
an final
implcitamente.
Ejemplo de uso en caso 2
class A {
final void meth() {
System.out.println("Este es un metodo final.");
}
}
class B extends A {
void meth() { // ERROR! No se puede sobreescribir.
System.out.println("No es correcto!");
}
}
Ejemplo de uso en caso 3
final class A {
// ...
}
// La clase siguiente no es v
alida.
class B extends A { // ERROR! No se puede crear una subclase de A
// ...
}

51

8.

Paquetes e Interfaces

8.1.

Paquetes

Un paquete es un contenedor de clases, que se usa para mantener el espacio


de nombres de clase, dividido en compartimentos.
Se almacenan de manera jer
arquica: Java usa los directorios del sistema
de archivos para almacenar los paquetes
Ejemplo: Las clases del paquete MiPaquete (ficheros .class y
.java) se almacenar
an en directorio MiPaquete
Se importan explcitamente en las definiciones de nuevas clases con la
sentencia
import nombre-paquete;
Permiten restringir la visibilidad de las clases que contiene:
Se pueden definir clases en un paquete sin que el mundo exterior
sepa que est
an all.
Se pueden definir miembros de una clase, que sean s
olo accesibles por
miembros del mismo paquete
8.1.1.

Definici
on de un paquete

Incluiremos la siguiente sentencia como primera sentencia del archivo


fuente .java
package nombre-paquete
Todas las clases de ese archivo ser
an de ese paquete
Si no ponemos esta sentencia, las clases pertenecen al paquete por
defecto
Una misma sentencia package puede incluirse en varios archivos fuente
Se puede crear una jerarqua de paquetes:
package paq1[.paq2[.paq3]];
Ejemplo: java.awt.image

8.1 Paquetes
8.1.2.

52

La variable de entorno CLASSPATH

Supongamos que construimos la clase PaquetePrueba perteneciente al


paquete prueba, dentro del fichero PaquetePrueba.java (directorio
prueba)
Compilaci
on: Situarse en directorio prueba y ejecutar
javac -bootclasspath $CLDC_PATH/common/api/classes
-d tmpclasses prueba/PaquetePrueba.java
Preverificaci
on
preverify -classpath $CLDC_PATH/common/api/classes:tmpclasses
-d . prueba/PaquetePrueba
o bien
preverify -classpath $CLDC_PATH/common/api/classes:tmpclasses
-d . tmpclasses
Ejecuci
on: Situarse en directorio padre de prueba y ejecutar
kvm -classpath . prueba.PaquetePrueba
o bien a
nadir directorio padre de prueba a CLASSPATH y ejecutar
kvm prueba.PaquetePrueba

8.1 Paquetes
8.1.3.

53

Ejemplo de paquete: P25/MyPack

package MyPack;
class Balance {
String name;
double bal;
Balance(String n, double b) {
name = n;
bal = b;
}
void show() {
if(bal<0)
System.out.print("-->> ");
System.out.println(name + ": $" + bal);
}
}
class AccountBalance {
public static void main(String args[]) {
Balance current[] = new Balance[3];
current[0] =
current[1] =
current[2] =
for(int i=0;
}
}

new Balance("K. J. Fielding", 123.23);


new Balance("Will Tell", 157.02);
new Balance("Tom Jackson", -12.33);
i<3; i++) current[i].show();

8.2 Protecci
on de acceso

8.2.

54

Protecci
on de acceso

Las clases y los paquetes son dos medios de encapsular y contener el


espacio de nombres y el a
mbito de las variables y metodos.
Paquetes: Act
uan como recipientes de clases y otros paquetes
subordinados.
Clases: Act
uan como recipientes de datos y c
odigo.
8.2.1.

Tipos de acceso a miembros de una clase

Desde m
etodo en ...

private

sin modif.

protected

public

misma clase

subclase del mismo paquete

no

no subclase del mismo paquete

no

subclase de diferente paquete

no

no

no subclase de diferente paquete

no

no

no

8.2.2.

Tipos de acceso para una clase

Acceso por defecto: Accesible s


olo por c
odigo del mismo paquete
Acceso public: Accesible por cualquier c
odigo

8.2 Protecci
on de acceso
Ejemplo: P26 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);
}
}

55

8.2 Protecci
on de acceso
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);
}
}

56

8.3 Importar paquetes

8.3.

57

Importar paquetes

Todas las clases est


andar de Java est
an almacenadas en alg
un paquete con
nombre. Para usar una de esas clases debemos usar su nombre completo.
Por ejemplo para la clase Date usaramos java.util.Date. Otra
posibilidad es usar la sentencia import.
import: Permite que se puedan ver ciertas clases o paquetes enteros
sin tener que introducir la estructura de paquetes en que est
an
incluidos, separados por puntos.
Debe ir tras la sentencia package:
import paquete[.paquete2].(nombre_clase|*);
Al usar * especificamos que se importa el paquete completo. Esto
incrementa el tiempo de compilaci
on, pero no el de ejecuci
on.
Las clases est
andar de Java est
an dentro del paquete java.
Las funciones b
asicas del lenguaje se almacenan en el paquete.
java.lang, el cual es importado por defecto.
Al importar un paquete, s
olo est
an disponibles los elementos p
ublicos
de ese paquete para clases que no sean subclases del c
odigo importado.

8.3 Importar paquetes

58

Ejemplo: P27
MyPack/Balance.java
package MyPack;
/* La clase Balance, su constructor, y su metodo show()
deben ser p
ublicos. Esto significa que pueden ser utilizados por
c
odigo que no sea una subclase y est
e fuera de su paquete.
*/
public class Balance {
String name;
double bal;
public Balance(String n, double b) {
name = n;
bal = b;
}
public void show() {
if(bal<0)
System.out.print("-->> ");
System.out.println(name + ": $" + bal);
}
}
TestBalance.java
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()
}
}

8.4 Interfaces

8.4.

59

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

Una interfaz se define casi igual que una clase:


acceso interface nombre {
tipo_devuelto m
etodo1(lista_de_par
ametros);
tipo_devuelto m
etodo2(lista_de_par
ametros);
tipo var_final1=valor;
tipo var_final2=valor;
// ...
tipo_devuelto m
etodoN(lista_de_par
ametros);
tipo var_finalN=valor;
}
acceso puede ser public o no usarse.
Si no se utiliza (acceso por defecto) la interfaz est
a s
olo disponible
para otros miembros del paquete en el que ha sido declarada.
Si se usa public, puede ser usada por cualquier c
odigo (todos los
metodos y variables son implcitamente p
ublicos).
Los metodos de una interfaz son b
asicamente metodos abstractos (no
tienen cuerpo de implementaci
on).
Un interfaz puede tener variables pero ser
an implcitamente final y
static.

8.4 Interfaces

60

Ejemplo definici
on de interfaz
interface Callback {
void callback(int param);
}
8.4.2.

Implementaci
on de una interfaz

Para implementar una interfaz, la clase debe implementar todos los


metodos de la interfaz. Se usa la palabra reservada implements.
Una vez declarada la interfaz, puede ser implementada por varias clases.
Cuando implementemos un metodo de una interfaz, tiene que
declararse como public.
Si una clase implementa dos interfaces que declaran el mismo metodo,
entonces los clientes de cada interfaz usar
an el mismo metodo.
Ejemplo de uso de interfaces: P28
class Client implements Callback {
public void callback(int p) {
System.out.println("callback llamado con " + p);
}
void nonIfaceMeth() {
System.out.println("Las clases que implementan interfaces " +
"adem
as pueden definir otros miembros.");
}
}
class TestIface {
public static void main(String args[]) {
Callback c = new Client();
c.callback(42);
}
}

8.4 Interfaces
8.4.3.

61

Acceso a implementaciones a trav


es de referencias de la
interfaz

Se pueden declarar variables usando como tipo un interfaz, para


referenciar objetos de clases que implementan ese interfaz.
El metodo al que se llamar
a con una variable as, se determina en
tiempo de ejecuci
on.
Ejemplo
class TestIface {
public static void main(String args[]) {
Callback c = new Client();
c.callback(42);
}
}
Con estas variables s
olo se pueden usar los metodos que hay en la
interfaz.
Otro ejemplo: P29
// Otra implementaci
on de Callback.
class AnotherClient implements Callback {
public void callback(int p) {
System.out.println("Otra versi
on de callback");
System.out.println("El cuadrado de p es " + (p*p));
}
}
class TestIface2 {
public static void main(String args[]) {
Callback c = new Client();
AnotherClient ob = new AnotherClient();
c.callback(42);
c = ob; // c hace referencia a un objeto AnotherClient
c.callback(42);
}
}

8.4 Interfaces
8.4.4.

62

Implementaci
on parcial

Si una clase incluye una interfaz, pero no implementa todos sus


metodos, entonces debe ser declarada como abstract.
8.4.5.

Variables en interfaces

Las variables se usan para importar constantes compartidas en


m
ultiples clases.
Si una interfaz no tiene ning
un metodo, entonces cualquier clase que
incluya esta interfaz no tendr
a que implementar nada.
Ejemplo: P30/AskMe.java
import java.util.Random;
interface SharedConstants {
int NO = 0;
int YES = 1;
int MAYBE = 2;
int LATER = 3;
int SOON = 4;
int NEVER = 5;
}
class Question implements SharedConstants {
Random rand = new Random();
int ask() {
int prob = (int) (100 * rand.nextDouble());
if (prob < 30) return NO;
// 30%
else if (prob < 60) return YES;
// 30%
else if (prob < 75) return LATER; // 15%
else if (prob < 98) return SOON; // 13%
else return NEVER;
// 2%
}
}

8.4 Interfaces

63

class AskMe implements SharedConstants {


static void answer(int result) {
switch(result) {
case NO:
System.out.println("No"); break;
case YES:
System.out.println("Si"); break;
case MAYBE:
System.out.println("Puede ser"); break;
case LATER:
System.out.println("Mas tarde"); break;
case SOON:
System.out.println("Pronto"); break;
case NEVER:
System.out.println("Nunca"); break;
}
}
public static void main(String args[]) {
Question q = new Question();
answer(q.ask());
answer(q.ask());
answer(q.ask());
answer(q.ask());
}
}
8.4.6.

Las interfaces se pueden extender

Una interfaz puede heredar otra utilizando la palabra reservada


extends.
Una clase que implemente una interfaz que herede de otra, debe
implementar todos los metodos de la cadena de herencia.

8.4 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();
}
}

64

65

9.

Gesti
on de excepciones

Una excepci
on es una condici
on anormal que surge en una secuencia de
c
odigo durante la ejecuci
on de un programa. O sea, es un error en tiempo
de ejecuci
on.
Excepciones y errores
CLDC incluye la mayora de las excepciones definidas por el paquete
java.lang de J2SE, pero la mayora de las clases de error se han
eliminado, dejando s
olo las siguientes:
java.lang.Error
java.lang.OutOfMemoryError
java.lang.VirtualMachineError
El metodo Throwable.printStackTrace() es parte de la
especificaci
on de CLDC (aunque no lo es la versi
on sobrecargada que
redirige el trazado de la pila (stack) a otro sitio diferente al flujo de
salida de error).
Sin embargo el formato de salida de este metodo es dependiente
de la implementaci
on. En KVM este metodo s
olo escribe el
nombre de la excepci
on.

9.1.

Fundamentos

Cuando surge una condici


on excepcional se crea un objeto que
representa la excepci
on, y se enva al metodo que ha provocado la
excepci
on.
Este metodo puede gestionar la excepci
on el mismo o bien
pasarla al metodo llamante. En cualquier caso, la excepci
on es
capturada y procesada en alg
un punto.
La gesti
on de excepciones usa las palabras reservadas try, catch,
throw, throws y finally.

9.2 Tipos de excepci


on

66

Forma general de un bloque de gesti


on de excepciones
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
}

9.2.

Tipos de excepci
on

Todos los tipos de excepci


on son subclase de Throwable. Esta clase tiene
dos subclases:
1. Exception: Se usa para las excepciones que deberan capturar los
programas de usuario.
Esta clase tiene como subclase a RuntimeException, que
representa excepciones definidas autom
aticamente por los
programas (divisi
on por 0, ndice inv
alido de matriz, etc).
Adem
as tiene otras subclases como ClassNotFoundException,
InterruptedException, etc.
2. Error: Excepciones que no se suelen capturar en condiciones normales.
Suelen ser fallos catastr
oficos no gestionados por nuestros
programas. Ejemplo: desbordamiento de la pila. En CLDC 1.1
hay dos subclases de Error: VirtualMachineError y
NoClassDefFoundError.

9.2 Tipos de excepci


on
java.lang
Object

67

NoClassDefFoundError
Throwable

Error
VirtualMachineError

Exception

OutOfMemoryError

ClassNotFoundException

ConnectionNotFoundException

IllegalAccessException

EOFException

InstantiationException

InterruptedIOException

InterruptedException

UnsouportedIOException

IOException

UTFDataFormatException
ArithmeticException
ArrayStoreException
ClassCastException
EmptyStackException
IllegalThreadStateException
IllegalArgumentException
NumberFormatException

RuntimeException

IllegalMonitorStateException
ArrayIndexOutOfBoundsException
IndexOutOfBoundsException
StringIndexOutOfBoundsException
NegativeArraySizeException
NoSuchElementException
NullPointerException
SecurityException

Clase

Interfaz

Clase abstracta

Extiende
Implementa

9.3 Excepciones no capturadas

9.3.

68

Excepciones no capturadas

Ejemplo: P32/Exc1.java
class Exc1 {
static void subroutine() {
int d = 0;
int a = 10 / d;
}
public static void main(String args[]) {
System.out.println("Antes de Exc1.subroutine");
Exc1.subroutine();
System.out.println("Despues de Exc1.subroutine");
}
}
Cuando la m
aquina virtual Java detecta la divisi
on por 0 construye un
objeto de excepci
on y lanza la excepci
on. Esto detiene la ejecuci
on de
Exc1, ya que no hemos incluido un gestor de la excepci
on.
Cualquier excepci
on no tratada por el programa ser
a tratada por el
gestor por defecto.
En el caso de J2SE, el gestor por defecto muestra la excepci
on y
el trazado de la pila en la salida est
andar, y termina el programa.
Salida del programa
Antes de Exc1.subroutine
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Exc1.subroutine(Exc1.java:4)
at Exc1.main(Exc1.java:8)

En el caso de CLDC lo u
nico que hace es terminar el programa.
Salida del programa
Antes de Exc1.subroutine

9.3 Excepciones no capturadas

69

En CLDC podemos usar la versi


on de depuraci
on de la KVM
(programa kvm_g) para obtener el trazado de la pila cuando se lanza la
excepci
on. Necesitamos adem
as hacer uso del metodo
Trowable.printStackTrace() en la siguiente forma
(P32/Exc1.version2.java):
try{
int a = 10 / d;
}
catch (Exception ex){
ex.printStackTrace();
}
Ahora la salida sera la siguiente:
Antes de Exc1.subroutine
java.lang.ArithmeticException
at Exc1.subroutine(+5)
at Exc1.main(+11)
Despues de Exc1.subroutine

9.4 try y catch

9.4.

70

try y catch

Si incluimos nuestro propio gestor de excepciones evitamos que el programa


termine autom
aticamente. Usaremos un bloque try-catch.
Ejemplo: P33/Exc2.java
class Exc2 {
public static void main(String args[]) {
int d, a;
try { // controla un bloque de c
odigo.
d = 0;
a = 42 / d;
System.out.println("Esto no se imprimir
a.");
}
catch (ArithmeticException e) {// captura el error de divisi
on
System.out.println("Divisi
on por cero.");
}
System.out.println("Despu
es de la sentencia catch.");
}
}

9.4 try y catch

71

El objetivo de una sentencia catch bien dise


nada debera ser resolver la
condici
on de excepci
on y continuar.
Otro ejemplo: P34/HandleError.java
// Gestiona una excepci
on y continua.
import java.util.Random;
class HandleError {
public static void main(String args[]) {
int a=0, b=0, c=0;
Random r = new Random();
for(int i=0; i<32000; i++) {
try {
b = r.nextInt();
c = r.nextInt();
a = 12345 / (b/c);
} catch (ArithmeticException e) {
System.out.println("Division por cero.");
a = 0; // asigna a la variable el valor 0 y continua
}
System.out.println("a: " + a);
}
}
}
9.4.1.

Descripci
on de una excepci
on

La clase Throwable sobreescribe el metodo toString() de la clase


Object, devolviendo una cadena con la descripci
on de la excepci
on.
catch (ArithmeticException e) {
System.out.println("Excepcion: " + e);
a = 0; // hacer a=0 y continuar
}
Salida producida cuando se produce la excepci
on
Excepcion: java.lang.ArithmeticException

9.5 Cl
ausula catch m
ultiple

9.5.

72

Cl
ausula catch m
ultiple

En algunos casos un bloque de c


odigo puede activar m
as de un tipo de
excepci
on. Usaremos varios bloques catch.
El siguiente programa produce una excepci
on si se ejecuta sin par
ametros y
otra distinta si se ejecuta con un par
ametro.
Ejemplo: P35/MultiCatch.java
class MultiCatch {
public static void main(String args[]) {
try {
int a = args.length;
System.out.println("a = " + a);
int b = 42 / a;
int c[] = { 1 };
c[42] = 99;
} catch(ArithmeticException e) {
System.out.println("Division por 0: " + e);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Indice fuera de limites: " + e);
}
System.out.println("Despues del bloque try/catch.");
}
}
Al ordenar los bloques catch, las subclases de excepci
on deben ir antes que
la superclase (en caso contrario no se ejecutaran nunca y dara error de
compilaci
on por c
odigo no alcanzable).

9.5 Cl
ausula catch m
ultiple

73

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.");
}
}
}

9.6 Sentencias try anidadas

9.6.

74

Sentencias try anidadas

Una sentencia try puede estar incluida dentro del bloque de otra
sentencia try.
Cuando un try no tiene catch para una excepci
on se busca si lo hay en
el try m
as externo, y as sucesivamente.
Ejemplo: P37/NestTry.java
class NestTry {
public static void main(String args[]) {
try {
int a = args.length;
/* Si no hay ning
un argumento en la l
nea de o
rdenes
se 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 o
rdenes
se generar
a una excepci
on de divisi
on por cero. */
if(a==1) a = a/(a-a); // divisi
on por cero
/* Si se le pasan dos argumentos en la l
nea de o
rdenes,
se genera una excepci
on al sobrepasar los l
mites
del tama~
no de la matriz. */
if(a==2) {
int c[] = { 1 };
c[42] = 99; // genera una excepci
on de fuera de l
mites
}
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Indice fuera de limites: " + e);
}
} catch(ArithmeticException e) {
System.out.println("Divisi
on por 0: " + e);
}
}
}

9.6 Sentencias try anidadas

75

Sentencias try anidadas en forma menos obvia


Ejemplo: P38/MethNestTry.java
/* Las sentencias try pueden estar impl
citamente anidadas
a trav
es de llamadas a m
etodos. */
class MethNestTry {
static void nesttry(int a) {
try { // bloque try anidado
/* Si se utiliza un argumento en la l
nea de o
rdenes, la
siguiente sentencia efect
ua divisi
on por cero */
if(a==1) a = a/(a-a); // divisi
on por zero
/* Si se le pasan dos argumentos en la l
nea de o
rdenes,
se sobrepasan los l
mites de la matriz */
if(a==2) {
int c[] = { 1 };
c[42] = 99; // genera una excepci
on de fuera de l
mites
}
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Indice fuera de limites: " + e);
}
}

9.7 Lanzar excepciones explcitamente: throw

76

public static void main(String args[]) {


try {
int a = args.length;
/* Si no hay ning
un argumento en la l
nea de o
rdenes, la
siguiente sentencia generar
a una excepci
on de divisi
on
por cero */
int b = 42 / a;
System.out.println("a = " + a);
nesttry(a);
} catch(ArithmeticException e) {
System.out.println("Divisi
on por 0: " + e);
}
}
}

9.7.

Lanzar excepciones explcitamente: throw

Usando la sentencia throw es posible hacer que el programa lance una


excepci
on de manera explcita: throw objetoThrowable;
El objetoThrowable puede obtenerse mediante:
1. El par
ametro de una sentencia catch.
2. Con el operador new .
Ejemplo: P39/ThrowDemo.java
class ThrowDemo {
static void demoproc() {
try {
throw new NullPointerException("demo");
} catch(NullPointerException e) {
System.out.println("Captura dentro de demoproc.");
throw e; // relanza la excepci
on
}
}

9.8 Sentencia throws

77

public static void main(String args[]) {


try {
demoproc();
} catch(NullPointerException e) {
System.out.println("Nueva captura: " + e);
}
}
}
El flujo de ejecuci
on se detiene tras la sentencia throw (cualquier sentencia
posterior no se ejecuta).
Salida del anterior ejemplo:
Captura dentro de demoproc.
Nueva captura: java.lang.NullPointerException: demo

9.8.

Sentencia throws

Sirve para listar los tipos de excepci


on que un metodo puede lanzar.
Debe usarse para proteger los metodos que usan a este, si tal metodo
lanza la excepci
on 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 producir
a error de compilaci
on.
Forma general de declaraci
on de m
etodo con throws
tipo metodo(lista_de_parametros) throws lista_de_excepciones
{
// cuerpo del metodo
}

9.8 Sentencia throws

78

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
listada con el throws.
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

9.9.

79

Sentencia finally

Se puede usar esta sentencia en un bloque try-catch para ejecutar un


bloque de c
odigo despues de ejecutar las sentencias del try y del catch.
Se ejecutar
a tanto si se lanza, como si no una excepci
on, y aunque no
haya ning
un catch que capture esa excepci
on.
Podra usarse por ejemplo para cerrar los archivos abiertos.
Ejemplo de uso de finally: P42/FinallyDemo.java
class FinallyDemo {
static void procA() {// Lanza una excepci
on fuera del metodo
try {
System.out.println("Dentro de procA");
throw new RuntimeException("demo");
} finally {
System.out.println("Sentencia finally de procA");
}
}
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");
}
}

9.10 Subclases de excepciones propias

80

public static void main(String args[]) {


try {procA();
} catch (Exception e) {
System.out.println("Excepci
on capturada");
}
procB(); procC();
}
}
Salida del anterior programa
Dentro de
Sentencia
Excepci
on
Dentro de
Sentencia
Dentro de
Sentencia

9.10.

procA
finally de procA
capturada
procB
finally de procB
procC
finally de procC

Subclases de excepciones propias

Sirven para crear tipos propios de excepci


on que permitan tratar
situaciones especficas en una aplicaci
on.
Para ello s
olo hay que definir una subclase de Exception.
Estas subclases de excepciones no necesitan implementar nada.
La clase Exception no define ning
un metodo, s
olo hereda los de
Throwable.

9.10 Subclases de excepciones propias


Ejemplo: P43/ExceptionDemo.java
class MyException extends Exception {
private int detail;
MyException(int a) {
detail = a;
}
public String toString() {
return "MyException[" + detail + "]";
}
}
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);
}
}
}
La salida de este programa sera:
Ejecuta compute(1)
Finalizaci
on normal
Ejecuta compute(20)
Captura MyException[20]

81

82

10.

Programaci
on Multihilo (Multihebra)

Un programa multihilo contiene dos o m


as partes que pueden
ejecutarse concurrentemente (aunque s
olo tengamos una CPU).
Esto permite escribir programas muy eficientes que utilizan al m
aximo
la CPU, reduciendo al mnimo, el tiempo que est
a sin usarse.
Java incluye caractersticas directamente en el lenguaje y API, para
construir programas multihilo (a diferencia de otros lenguajes).

10.1.

Hebras en CLDC

Las m
aquinas virtuales de CLDC requieren proporcionar un entorno de
programaci
on multitarea incluso si el dispositivo no dispone de ella.
Los mecanismos usados en J2SE para soportar la multitarea (palabra
reservada synchronized, los metodos Object.wait(),
Object.notify() y Object.notifyAll(), y la clase Thread) est
an
incluidos en CLDC.
Algunas diferencias
Sin embargo CLDC no soporta grupos de hebras o la clase
ThreadGroup.
El metodo setName() no existe. El metodo getName() existe s
olo en
CLDC 1.1
Los metodos (deprecated) resume(), suspend y stop() se han
eliminado.
Los metodos destroy(), interrupt() y isInterrupted() no existen.
El metodo dumpStack() se ha eliminado.

10.2 El hilo principal

10.2.

83

El hilo principal

El hilo principal es lanzado siempre por la JVM (Java Virtual


Machine) al ejecutar una aplicaci
on.
Desde este hilo se crear
an el resto de hilos del programa.
Debe ser el u
ltimo que termine su ejecuci
on. 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);
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");}
}
}
Salida del programa
Hilo actual: Thread[Thread-0,5]
5
4
3
2
1

10.3 Creaci
on de un hilo

84

En CLDC, cuando se usa t como argumento de println() aparece el


nombre de la hebra y su prioridad.
En CLDC no existe un metodo setName(String) en la clase Thread
como en J2SE, lo que hace que s
olo podamos asociar un nombre con el
constructor Thread(String).

10.3.

Creaci
on de un hilo

En Java hay dos formas de crear nuevos hilos:


Implementando el interfaz Runnable.
Extendiendo la clase Thread.
10.3.1.

Implementaci
on del interfaz Runnable

Consiste en declarar una clase que implemente Runnable y


sobreescribir el metodo run():
public abstract void run()
Dentro de run() incluimos el c
odigo a ejecutar por el nuevo hilo.
Luego se crea un objeto de la clase Thread dentro de esa clase. Al
constructor de Thread le pasamos como argumento el objeto creado de
la nueva clase (instancia de una clase que implemente Runnable):
Thread(Runnable objetoHilo,String nombreHilo)
Finalmente llamamos al metodo start() con el objeto anterior.
synchronized void start()

10.3 Creaci
on de un hilo

85

Ejemplo: P45/ThreadDemo.java
class NewThread implements Runnable {
Thread t;
NewThread() {
t = new Thread(this, "Hilo hijo");// Crea un nuevo hilo
System.out.println("Hilo hijo: " + t);
t.start(); // Comienza el hilo
}
public void run() {//Punto de entrada del segundo hilo
try {
for(int i = 5; i > 0; i--) {
System.out.println("Hilo hijo: " + i);
Thread.sleep(500); }
} catch (InterruptedException e) {
System.out.println("Interrupci
on del hilo hijo."); }
System.out.println("Sale del hilo hijo.");
}
}
class ThreadDemo {
public static void main(String args[]) {
new NewThread(); // crea un nuevo hilo
try {
for(int i = 5; i > 0; i--) {
System.out.println("Hilo principal: " + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("Interrupci
on del hilo principal.");
}
System.out.println("Sale del hilo principal.");
}
}

10.3 Creaci
on de un hilo

86

Salida del anterior programa


Hilo
Hilo
Hilo
Hilo
Hilo
Hilo
Hilo
Hilo
Hilo
Sale
Hilo
Hilo
Sale

hijo: Thread{Hilo hijo,5]


principal:5
hijo:5
hijo:4
principal:4
hijo:3
hijo:2
principal:3
hijo:1
del hilo hijo.
principal:2
principal:1
del hilo principal.

10.3.2.

Extensi
on de la clase Thread

Consiste en declarar una clase que herede de la clase Thread y


sobreescribir tambien el metodo run():
Dentro de run() incluimos el c
odigo a ejecutar por el nuevo hilo.
Luego se crea un objeto de la nueva clase.
Finalmente llamamos al metodo start() con el objeto anterior.

10.3 Creaci
on de un hilo

87

Ejemplo: P46/ExtendThread.java
class NewThread extends Thread {
NewThread() {
super("Hilo Demo"); // Crea un nuevo hilo
System.out.println("Hilo hijo: " + this);
start(); // Comienza el hilo
}
public void run() {// Este es el punto de entrada del segundo hilo
try {
for(int i = 5; i > 0; i--) {
System.out.println("Hilo hijo: " + i);
Thread.sleep(500); }
} catch (InterruptedException e) {
System.out.println("Interrupci
on del hilo hijo.");
}
System.out.println("Sale del hilo hijo.");
}
}
class ExtendThread {
public static void main(String args[]) {
new NewThread(); // crea un nuevo hilo
try {
for(int i = 5; i > 0; i--) {
System.out.println("Hilo principal: " + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("Interrupci
on del hilo principal.");
}
System.out.println("Sale del hilo principal.");
}
}

10.4 Creaci
on de m
ultiples hilos
10.3.3.

88

Elecci
on de una de las dos opciones

Depende del tipo de clase que se vaya a crear.


Si la clase hereda de otra, no queda m
as remedio que implementar
Runnable.
Normalmente es m
as sencillo heredar de Thread.
Pero algunos programadores piensan que una clase no debe extenderse
si no va a ser ampliada o modificada. Por eso, si no vamos a
sobreescribir ning
un otro metodo de Thread, quiz
as sera mejor
implementar Runnable.

10.4.

Creaci
on de m
ultiples hilos

Un programa en Java puede crear tantos hilos como quiera.


Ejemplo de creaci
on de tres hilos: P47/MultiThreadDemo.java
class NewThread implements Runnable {
String name; // nombre del hilo
Thread t;
NewThread(String threadname) {
name = threadname;
t = new Thread(this, name);
System.out.println("Nuevo hilo: " + t);
t.start(); // Comienza el hilo
}
// Este es el punto de entrada del hilo.
public void run() {
try {
for(int i = 5; i > 0; i--) {
System.out.println(name + ": " + i);
Thread.sleep(1000);
}
}

10.4 Creaci
on de m
ultiples hilos

89

catch (InterruptedException e) {
System.out.println(name + "Interrupci
on del hilo hijo" +name);
}
System.out.println("Sale del hilo hijo" + name);
}
}
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]
Nuevo hilo: Thread[Dos,5]
Nuevo hilo: Thread[Tres,5]
Uno: 5
Dos: 5
Tres: 5
Uno: 4
Dos: 4
Tres: 4
Uno: 3
Dos: 3
Tres: 3
Uno: 2

10.5 Utilizaci
on de isAlive() y join()
Dos: 2
Tres: 2
Uno: 1
Dos: 1
Tres: 1
Sale del
Sale del
Sale del
Sale del

10.5.

90

hilo.Uno
hilo.Dos
hilo.Tres
hilo principal.

Utilizaci
on de isAlive() y join()

Hay dos formas de determinar si un metodo ha terminado.


Con el metodo isAlive(). Devuelve true si el hilo al que se hace
referencia est
a todava ejecut
andose.
final boolean isAlive() throws InterruptedException
Con el metodo join(). Este metodo detiene el hilo actual hasta que
termine el hilo sobre el que se llama join(). Es usado por tanto para
que unos hilos esperen a la finalizaci
on de otros.
final void join throws InterruptedException
Ejemplo de uso de isAlive() y join(): P48/DemoJoin.java
class NewThread implements Runnable {
String name; // nombre del hilo
Thread t;
NewThread(String threadname) {
name = threadname;
t = new Thread(this, name);
System.out.println("Nuevo hilo: " + t);
t.start(); // Comienza el hilo
}

10.5 Utilizaci
on de isAlive() y join()

91

public void run() {// Este es el punto de entrada del hilo


try {
for(int i = 5; i > 0; i--) {
System.out.println(name + ": " + i);
Thread.sleep(1000); }
} catch (InterruptedException e) {
System.out.println("Interrupci
on del hilo"+name); }
System.out.println("Sale del hilo " + name);
}
}
class DemoJoin {
public static void main(String args[]) {
NewThread ob1 = new NewThread("Uno");
NewThread ob2 = new NewThread("Dos");
NewThread ob3 = new NewThread("Tres");
System.out.println("El hilo Uno est
a vivo: " + ob1.t.isAlive());
System.out.println("El hilo Dos est
a vivo: " + ob2.t.isAlive());
System.out.println("El hilo Tres est
a vivo: " + ob3.t.isAlive());
try {// espera hasta que terminen los otros hilos
System.out.println("Espera finalizaci
on de los otros hilos.");
ob1.t.join(); ob2.t.join(); ob3.t.join();
} catch (InterruptedException e) {
System.out.println("Interrupci
on del hilo principal"); }
System.out.println("El hilo Uno est
a vivo: " + ob1.t.isAlive());
System.out.println("El hilo Dos est
a vivo " + ob2.t.isAlive());
System.out.println("El hilo Tres est
a vivo: " + ob3.t.isAlive());
System.out.println("Sale del hilo principal.");
}
}

10.5 Utilizaci
on de isAlive() y join()
Salida del programa
Nuevo hilo: Thread[Uno,5]
Nuevo hilo: Thread[Dos,5]
Nuevo hilo: Thread[Tres,5]
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.

92

10.6 Prioridades de los hilos

10.6.

93

Prioridades de los hilos

La prioridad de un hilo es un valor entero que indica la prioridad


relativa de un hilo respecto a otro.
Se utiliza para decidir cuando pasar a ejecutar otro hilo (cambio de
contexto).
Cuando un hilo cede el control (por abandono explcito o por
bloqueo en E/S), se ejecuta a continuaci
on el que tenga mayor
prioridad.
Un hilo puede ser desalojado por otro con prioridad m
as alta, tan
pronto como este desee hacerlo.
Pero en la pr
actica la cantidad de CPU que recibe cada hilo depende
adem
as de otros factores como la forma en que el sistema operativo
implementa la multitarea.
Para establecer la prioridad de un hilo usamos setPriority() de la
clase Thread .
final void setPriority(int level)
level puede variar entre MIN_PRIORITY y MAX_PRIORITY (1 y 10 en la
actualidad). La prioridad por defecto es NORM_PRIORITY (5
actualmente).
Para obtener la prioridad de un hilo:
final int getPriority()
Ejemplo: P49/HiLoPri.java
class clicker implements Runnable {
int click = 0;
Thread t;
private volatile boolean running = true;
public clicker(int p) {
t = new Thread(this);
t.setPriority(p);
}

10.6 Prioridades de los hilos

94

public void run() {


while (running) {
click++;
}
}
public void stop() {
running = false;
}
public void start() {
t.start();
}
}
class HiLoPri {
public static void main(String args[]) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
clicker hi = new clicker(Thread.NORM_PRIORITY + 2);
clicker lo = new clicker(Thread.NORM_PRIORITY - 2);
lo.start();
hi.start();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("Hilo principal interrumpido.");}
lo.stop();
hi.stop();
try {
hi.t.join();
lo.t.join();
} catch (InterruptedException e) {
System.out.println("InterruptedException capturada");
}
System.out.println("Hilo de prioridad baja: " + lo.click);
System.out.println("Hilo de prioridad alta: " + hi.click);
}
}

10.7 Sincronizaci
on

95

Salida del programa en linux Redhat 8.0


Hilo de prioridad baja: 9636208
Hilo de prioridad alta: 22480211

10.7.

Sincronizaci
on

Cuando dos o m
as hilos necesitan acceder a un recurso compartido,
entonces necesitan alguna forma de asegurar que el recurso se usa s
olo
por un hilo al mismo tiempo: Sincronizaci
on.
Un monitor (sem
aforo) es un objeto usado como un cerrojo de
exclusi
on mutua. S
olo un hilo puede poseer el monitor en un momento
determinado.
Cuando un hilo entra en el monitor, los dem
as hilos que intentan entrar
en el, quedan suspendidos hasta que el primer hilo lo deja.
En Java el c
odigo puede sincronizarse de dos formas:
Con metodos sincronizados.
Con sentencia synchronized.
10.7.1.

Uso de m
etodos sincronizados

Todos los objetos de Java tienen asociado su propio monitor implcito.


Para entrar en el monitor de un objeto s
olo hay que llamar a un
metodo synchronized.
Cuando un hilo este ejecutando un metodo sincronizado, todos los
dem
as hilos que intenten ejecutar cualquier metodo sincronizado del
mismo objeto tendr
an que esperar.

10.7 Sincronizaci
on

96

Ejemplo de programa que no usa sincronizaci


on: P50/Synch.java
class Callme {
void call(String msg) {
System.out.print("[" + msg);
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
System.out.println("Interrumpido");
}
System.out.println("]");
}
}
class Caller implements Runnable {
String msg;
Callme target;
Thread t;
public Caller(Callme targ, String s) {
target = targ;
msg = s;
t = new Thread(this);
t.start();
}
public void run() {
target.call(msg);
}
}

10.7 Sincronizaci
on

97

class Synch {
public static void main(String args[]) {
Callme target = new Callme();
Caller ob1 = new Caller(target, "Hola");
Caller ob2 = new Caller(target, "Mundo");
Caller ob3 = new Caller(target, "Sincronizado");
try {
ob1.t.join();
ob2.t.join();
ob3.t.join();
} catch(InterruptedException e) {
System.out.println("Interrumpido");
}
}
}
Salida del anterior programa
[Hola[Mundo[Sincronizado]
]
]
El resultado de este programa muestra que la salida de los tres
mensajes aparece mezclada, ya que los tres hilos est
an ejecutando el
metodo call() del mismo objeto a la vez.
Soluci
on: Restringimos el acceso a call() a un s
olo hilo en un
momento determinado.
Ejemplo: P51/Synch.java
class Callme {
synchronized void call(String msg) {
...
Nueva salida:
[Hola]
[Mundo]
[Sincronizado]

10.7 Sincronizaci
on
10.7.2.

98

Sentencia synchronized

A veces la soluci
on de sincronizar un metodo no es posible porque no
tenemos el c
odigo fuente de la clase, y no podemos hacer que el metodo
sea sincronizado.
En ese caso podemos usar la sentencia synchronized
synchronized(objeto){
// sentencias que se sincronizan
}
objeto es el objeto que sincronizamos.
Esta sentencia hace que cualquier llamada a alg
un metodo de objeto se
ejecutar
a despues de que el hilo actual entre en el monitor de objeto.
Ejemplo que hace lo mismo de antes: P52/Synch1.java
class Callme {
void call(String msg) {
System.out.print("[" + msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Interrumpido");
}
System.out.println("]");
}
}
class Caller implements Runnable {
String msg;
Callme target;
Thread t;
public Caller(Callme targ, String s) {
target = targ;
msg = s;
t = new Thread(this); t.start();
}

10.8 Comunicaci
on entre hilos

99

public void run() {


synchronized(target) { target.call(msg);}
}
}
class Synch1 {
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");
}
}
}

10.8.

Comunicaci
on entre hilos

Los hilos pueden comunicarse entre s mediante el uso de los metodos


wait(), notify() y notifyAll() de la clase Object (son metodos
finales).
wait() dice al hilo llamante que deje el monitor y que pase a estado
suspendido (dormido) hasta que otro hilo entre en el mismo monitor
y llame a notify().
notify() despierta el primer hilo que llam
o a wait() sobre el mismo
objeto.
notifyAll() despierta todos los hilos que llamaron a wait() sobre el
mismo objeto.
Estos metodos s
olo pueden ser llamados desde metodos sincronizados.

10.8 Comunicaci
on entre hilos

100

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.8 Comunicaci
on entre hilos
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

101

10.8 Comunicaci
on entre hilos

102

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();
}
}
class Producer implements Runnable {
Q q;
Producer(Q q) {
this.q = q;
new Thread(this, "Productor").start();
}

10.8 Comunicaci
on entre hilos
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.");
}
}
Salida del programa
Pongo: 1
Obtengo: 1
Pongo: 2
Obtengo: 2
Pongo: 3
Obtengo: 3

103

10.8 Comunicaci
on entre hilos
Pongo: 4
Obtengo:
Pongo: 5
Obtengo:
Pongo: 6
Obtengo:
Pongo: 7
Obtengo:
10.8.1.

104

4
5
6
7
Interbloqueos

Un interbloqueo ocurre cuando dos hilos tienen una dependencia


circular sobre un par de objetos sincronizados.
Por ejemplo, un hilo entra en el monitor del objeto X y otro entra en el
monitor de Y. Si X intenta llamar cualquier metodo sincronizado de Y,
se bloquear
a. Sin embargo, si el hilo de Y, intenta ahora llamar
cualquier metodo sincronizado de X, los dos hilos quedar
an detenidos
para siempre.

10.8 Comunicaci
on entre hilos

105

Ejemplo de interbloqueo: P55/Deadlock.java


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.8 Comunicaci
on entre hilos
class Deadlock implements Runnable {
A a = new A();
B b = new B();
Deadlock() {
Thread t = new Thread(this, "RacingThread");
t.start();
a.foo(b);
System.out.println("Regreso al hilo principal");
}
public void run() {
b.bar(a);
System.out.println("Regreso al otro hilo");
}
public static void main(String args[]) {
new Deadlock();
}
}
Salida del programa hasta que queda bloqueado
Thread-0 entr
o en A.foo
RacingThread entr
o en B.bar
Thread-0 intentando llamar a B.last()
RacingThread intentando llamar a A.last()

106

10.9 Suspender, reanudar y terminar hilos

10.9.

107

Suspender, reanudar y terminar hilos

La suspensi
on de la ejecuci
on 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 volver a reanudar su ejecuci
on.
Para poder suspender, reanudar y terminar la ejecuci
on de un hilo
usaremos una variable bandera que indica el estado de ejecuci
on del
hilo. Haremos uso tambien de los metodos wait() y notify() o
notifyAll() de la clase Object.
Ejemplo de uso: P57/SuspendResume.java
class NewThread implements Runnable {
String name; // nombre del hilo
Thread t;
boolean suspendFlag;
NewThread(String threadname) {
name = threadname;
t = new Thread(this, name);
System.out.println("Nuevo hilo: " + t);
suspendFlag = false;
t.start(); // Comienza el hilo
}

10.9 Suspender, reanudar y terminar hilos

108

// Este es el punto de entrada del hilo.


public void run() {
try {
for(int i = 15; i > 0; i--) {
System.out.println(name + ": " + i);
Thread.sleep(200);
synchronized(this) {
while(suspendFlag) {
wait();
}
}
}
} catch (InterruptedException e) {
System.out.println("Interrupci
on del hilo" + name);
}
System.out.println("Sale del hilo" + name);
}
void mysuspend() {
suspendFlag = true;
}
synchronized void myresume() {
suspendFlag = false;
notify();
}
}
class SuspendResume {
public static void main(String args[]) {
NewThread ob1 = new NewThread("Uno");
NewThread ob2 = new NewThread("Dos");
try {
Thread.sleep(1000);
ob1.mysuspend();
System.out.println("Suspende el hilo Uno");
Thread.sleep(1000);
ob1.myresume();

10.9 Suspender, reanudar y terminar hilos

109

System.out.println("Reanuda el hilo Uno");


ob2.mysuspend();
System.out.println("Suspende el hilo Dos");
Thread.sleep(1000);
ob2.myresume();
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.");
}
}

110

11.

11.1.

Connected Limited Device


Configuration: CLDC
Qu
e son las configuraciones en J2ME?

Como ya se ha visto, una configuraci


on define el entorno b
asico de
ejecuci
on a traves de un conjunto mnimo de clases y una JVM (Java
Virtual Machine) especfica que se ejecuta en unos tipos especifcos de
dispositivos.
Los dos tipos de configuraciones existentes para J2ME son CLDC (para
peque
nos dispositivos) y CDC (para grandes dispositivos).

11.2.

La configuraci
on CLDC

CLDC es el bloque b
asico en que se basan los perfiles de J2ME para
peque
nos dispositivos, tales como telefonos m
oviles, PDAs (Personal
Digital Assistants), Pocket PC, etc
Estos dispositivos se caracterizan por tener poca memoria y
potencia de c
alculo, lo que les hace imposible ejecutar una
plataforma Java completa.
CLDC especifica un conjunto mnimo de paquetes y clases y una
m
aquina virtual Java de funcionalidad reducida que puede ser instalada
con las restricciones impuestas por tales dispositivos peque
nos.
11.2.1.

La m
aquina virtual Java de CLDC

Las limitaciones hardware y software impuestas por los dispositivos a


los que se dirige CLDC hacen impracticable soportar una m
aquina
virtual Java completa o un conjunto completo de clases b
asicas.
Por ejemplo, la ejecuci
on de una simple aplicaci
on Hello, worlden
una plataforma Windows requiere de alrededor de 16 MB de memoria.

11.3 La librera de clases de CLDC

111

Sin embargo las limitaciones mnimas de memoria para la JVM de


CLDC son:
128 KB de ROM en versi
on CLDC 1.0 y 160 KB en 1.1, para
almacenamiento persistente de la VM de Java y las libreras de clases de
CLDC.
32 KB o m
as de memoria vol
atil para alojarla en tiempo de ejecuci
on
(carga de clases y reserva en el heap y en la pila para objetos).
CLDC define requerimientos mnimos en el propio lenguaje, en las
libreras b
asicas y en la cantidad de memoria usada por la JVM.
Adem
as CLDC supone que el dispositivo huesped dispone de un
sistema operativo que puede ejecutar y manejar la m
aquina virtual.
Sin embargo CLDC no hace suposiciones sobre muchos otros temas.
Por ejemplo:
No define el tipo de display.
No define el mecanismo de entrada tal como teclado o rat
on.
No requiere de alg
un medio especfico de almacenamiento para los datos
de aplicaci
on.
Sin embargo los perfiles de J2ME, s que dan requerimientos adicionales
para el rango m
as limitado de dispositivos a los que se dirigen.

11.3.

La librera de clases de CLDC

El API de CLDC contiene un paquete especfico de J2ME llamado


javax.microedition.io y un peque
no subgrupo de paquetes del API
de J2SE (Java 2 Standard Edition):
java.io
java.lang
java.util
El API de CLDC no contiene todos los campos, metodos y clases
definidos en los anteriores paquetes de J2SE (pueden estar excluidos los
que sean deprecated (obsoletos) o por razones de limitaci
on de
recursos).

11.3 La librera de clases de CLDC


11.3.1.

112

Paquete java.lang

Proporciona clases fundamentales para el lenguaje Java. Contiene la


mitad de las clases que hay en el mismo paquete de J2SE.
Clases String y StringBuffer: Ya comentadas anteriormente.
Clase Thread e interfaz Runnable: Ya comentadas anteriormente.
Clase Math: Contiene metodos y constantes est
aticos usados para
operaciones matem
aticas.
Clase Object
Clases de envoltura para los tipos simples: Boolean, Byte,
Character, Double, Float, Integer, Long, Short.
Las clases System y Runtime.
Clase Class.
Clase Throwable.
Las omisiones m
as importantes son:
La mayora de las clases Error (errores serios que los programas no
suelen capturar) que no son necesarias debido a que la VM de
CLDC no las soporta. Algunas de las clases de Exception tambien
son omitidas.
En la versi
on CLDC 1.0 (pero s en la 1.1) no est
an las clases Float
y Double, ya que la VM no soporta operaciones en coma flotante.
Otras clases tales como ClassLoader SecurityManager y
StrictMath que no son necesarias debido a que su utilidad no
est
a en la especificaci
on de CLDC.
Se eliminan los interfaces Cloneable, Comparable y Serializable.
Algunas de las clases que hay incluidas no contienen implementaciones
completas.

11.3 La librera de clases de CLDC

113

La clase Object
Esta clase es la clase base para todos los objetos de Java.
Contiene metodos que ser
an comunes a todas las dem
as clases.
boolean equals(Object obj)
final Class getClass()
int hashCode()
final void notify()
final void notifyAll()
public final void wait(long timeout) throws InterruptedException
public String toString()
Esta clase no tiene metodo finalize() debido a que la VM de CLDC
no implementa la finalizaci
on. Tampoco contiene el metodo clone() (el
interfaz java.lang.Cloneable tampoco est
a en CLDC).

11.3 La librera de clases de CLDC

114

Clases de envoltura para tipos simples


Existe una clase de envoltura por cada uno de los tipos simples.
Eso es debido a que en Java los tipos simples no son objetos, lo que
hace que no puedan ser utilizados en aquellos sitios d
onde se espera que
haya un objeto.
Por ejemplo un Vector permite guardar una colecci
on de objetos de
cualquier tipo, pero deben ser objetos de alguna clase, y no tipos
simples.
Clases de envoltura para tipos num
ericos
Las operaciones en coma flotante no son soportadas por CLDC 1.0 pero
s por la 1.1.
En CLDC no se incluye la clase java.lang.Number, con lo que las
clases numericas derivan directamente de Object.
Tampoco existe el interfaz java.lang.Comparable, con lo que los
n
umeros no pueden compararse directamente como en J2SE.
En esta categora se incluyen las clases Byte Integer, Long, Short. En
CLDC 1.1 adem
as tenemos Float y Double.
Entre los metodos m
as usados tenemos:
Constructores: Double(double valor), Integer(integer valor),
etc
En todas esta clases tenemos los metodos double doubleValue(),
float floatValue(), int intValue(), etc.: Convierten el valor
del n
umero al tipo deseado.

11.3 La librera de clases de CLDC

115

Clase Character: envoltura para char


Constructor: Character(char valor)
Metodo char charValue(): Devuelve el car
acter que representa este
objeto.
Contiene metodos para ver si el valor del tipo simple es dgito, letra
min
uscula o may
uscula, etc.
static boolean isDigit(char ch)
static boolean isLowerCase(char ch)
static boolean isUpperCase(char ch)
Metodos para convertir a min
uscula o may
uscula:
static char toLowerCase(char ch)
static char toUpperCase(char ch)
Clase Boolean: envoltura para boolean
Constructor: Boolean(boolean valor)
Esta clase contiene las constantes est
aticas TRUE y FALSE.
Metodo boolean booleanValue(): Devuelve el valor que represente
este objeto.

11.3 La librera de clases de CLDC

116

Caractersticas de reflexi
on
La reflexi
on es una caracterstica presente en J2SE que permite a un
objeto consultar que metodos y campos contiene el mismo.
En CLDC no se est
a presente la reflexi
on con lo que todos los metodos
de java.lang.Class relacionados con ella se han eliminado. S
olo se
dispone en esta clase de los metodos forName() y newInstance().
Propiedades del sistema
CLDC define s
olo un conjunto peque
no de propiedades del sistema.
Propiedad

Significado

Ejemplo

microedition.configuration

Configuraci
on J2ME soportada por la plataforma

CLDC-1.0

microedition.encoding

Codificaci
on de caracteres soportada por la plataforma

ISO8859 1

microedition.platform

Plataforma o dispositivo

J2ME

microedition.profile

Perfil soportado por el dispositivo

MIDP-1.0

El valor de una propiedad especfica puede ser obtenido con el metodo


java.lang.System.getProperty();
String configuration = System.getProperty(
"microedition.configuration");
CLDC no incluye la clase java.util.Properties de J2SE, con lo que
no se puede usar el metodo getProperties() para obtener una lista de
todas las propiedades disponibles.
Las clases System y Runtime
Estas clases de J2SE contienen una colecci
on de metodos que permiten
operaciones a bajo nivel, tales como comenzar a ejecutar programas en
c
odigo nativo desde la aplicaci
on Java. Muchas de estas caractersticas
se han eliminado:
Acceso directo a propiedades del sistema con getProperties(),
setProperty() y setProperties().
Metodos que permiten cambiar la fuente y destino de los flujos
est
andar de entrada, salida y error.
Metodos que proporcionan acceso a libreras de c
odigo nativo, ya
que JNI (Java Native Interface) no est
a soportado.

11.3 La librera de clases de CLDC


11.3.2.

117

Paquete java.util

Contiene clases de colecci


on y clases relacionadas con la fecha y la hora, y
la clase Random usada para generar n
umeros aleatorios.
Clases de colecci
on
CLDC incluye las siguientes clases e interfaz para manejar colecciones de
objetos:
Clase Hashtable
Clase Stack
Clase Vector
Interfaz Enumeration
Interfaz Enumeration
Define los metodos que permiten enumerar (obtener uno cada vez) los
elementos de un conjunto de objetos. Esta interfaz define los dos metodos
siguientes:
boolean hasMoreElements() devuelve true mientras haya m
as
elementos para extraer y false cuando se han enumerado todos los
elementos.
Object nextElement() devuelve el siguiente objeto de la enumeraci
on
como una referencia generica a objeto, es decir, cada llamada a
nextElement() obtiene el siguiente objeto de la enumeraci
on.
Algunas clases del API de Java utilizan enumeraciones.

11.3 La librera de clases de CLDC


Ejemplo: P60/EnumerateDemo.java
import java.util.Enumeration;
class Enum implements Enumeration {
private int count = 0;
private boolean more = true;
public boolean hasMoreElements() {
return more;
}
public Object nextElement() {
count++;
if(count > 4)
more = false;
return new Integer(count);
}
}
class EnumerateDemo {
public static void main(String args[]) {
Enumeration enum = new Enum();
while(enum.hasMoreElements()) {
System.out.println(enum.nextElement());
}
}
}
Salida del programa
1
2
3
4
5

118

11.3 La librera de clases de CLDC

119

Clase Vector
Los arrays o matrices de Java son de longitud fija. Una vez creados no se
puede modificar su tama
no, lo que implica que necesitamos conocer a priori
el n
umero de elementos que van a almacenar.
Para resolver este problema, Java define la clase Vector.
Un vector es una matriz de longitud variable de referencias a objetos.
Los vectores se crean con un tama
no inicial y cuando se supera ese
tama
no, autom
aticamente aumentan su tama
no.
Al borrar objetos, el vector puede reducir su tama
no.
Los constructores de esta clase son:
Vector()
Vector(int tamanoInicial)
Vector(int tamanoInicial, int incrCapacidad)
Los metodos m
as usados en esta clase son:
final void addElement(Object elemento): A
nade el objeto
referenciado con elemento al vector.
final Object elementAt(int posicion): Obtiene el elemento
que se encuentra en la posici
on dada.
final boolean contains(Object elemento): Permite determinar
si el vector contiene un determinado elemento.
final Object firstElement(): Obtiene el primer elemento del
vector.
final Object lastElement(): Obtiene el primer elemento del
vector.
final int indexOf(Object elemento): Devuelve la posici
on de la
primera ocurrencia de elemento. Si el objeto no est
a en el vector
devuelve -1.
final int lastIndexOf(Object elemento): Devuelve la posici
on
de la u
ltima ocurrencia de elemento.

11.3 La librera de clases de CLDC

120

final boolean removeElement(Object elemento): Elimina el


elemento del vector. Si existe m
as de una ocurrencia del objeto, se
elimina la primera. Devuelve true si se hace la operaci
on
correctamente y false si no encuentra el objeto.
final void removeElementAt(int posicion): Elimina el
elemento de la posici
on especificada.
final Object elements(): Devuelve una enumeraci
on de los
elementos del vector.
Ejemplo: P61/VectorDemo.java
import java.util.Vector;
import java.util.Enumeration;
class VectorDemo {
public static void main(String args[]) {
Vector v = new Vector(3, 2);
System.out.println("Tama~
no inicial: " + v.size());
System.out.println("Capacidad inicial: " + v.capacity());
v.addElement(new Integer(1));
v.addElement(new Integer(2));
v.addElement(new Integer(3));
v.addElement(new Integer(4));
System.out.println("Capacidad despu
es de a~
nadir 4 elementos: " +
v.capacity());
v.addElement(new Double(5.45));
System.out.println("Capacidad actual: " + v.capacity());
v.addElement(new Double(6.08));
v.addElement(new Integer(7));
System.out.println("Capacidad actual: " +
v.capacity());
v.addElement(new Float(9.4));
v.addElement(new Integer(10));
System.out.println("Capacidad actual: " +
v.capacity());
v.addElement(new Integer(11));
v.addElement(new Integer(12));

11.3 La librera de clases de CLDC


System.out.println("Primer elemento: " +
(Integer)v.firstElement());
System.out.println("
Ultimo elemento: " +
(Integer)v.lastElement());
if(v.contains(new Integer(3)))
System.out.println("El Vector contiene 3.");
Enumeration vEnum = v.elements();
System.out.println("\nElementos en el vector:");
while(vEnum.hasMoreElements())
System.out.print(vEnum.nextElement() + " ");
System.out.println();
}
}
Salida del programa
Tama~
no inicial: 0
Capacidad inicial: 3
Capacidad despu
es de a~
nadir 4 elementos: 5
Capacidad actual: 5
Capacidad actual: 7
Capacidad actual: 9
Primer elemento: 1

Ultimo elemento: 12
El Vector contiene 3.
Elementos en el vector:
1 2 3 4 5.45 6.08 7 9.4 10 11 12

121

11.3 La librera de clases de CLDC

122

Clase Stack
Es una subclase de la clase Vector que implementa una pila del tipo u
ltimo
en entrar, primero en salir
Stack(): Constructor por defecto, que crea una pila vaca:
Incluye todos los metodos definidos por Vector y a
nade adem
as:
Object push(Object elemento): Introduce el elemento en la pila,
y adem
as lo devuelve.
Object pop(): Devuelve y elimina el elemento superior de la pila.
Este metodo lanza la excepci
on EmptyStackException si la pila
est
a vaca.
Object peek(): Devuelve el elemento superior de la pila pero no lo
borra.
boolean empty(): Devuelve true si la pila est
a vaca, y false en otro
caso.
int search(Object elemento): Determina si un objeto est
a en la
pila y devuelve el n
umero de operaciones pop que habra que realizar
para que dicho elemento quede en la parte superior de la pila.
Ejemplo: P62/StackDemo.java
import java.util.Stack;
import java.util.EmptyStackException;
class StackDemo {
static void showpush(Stack st, int a) {
st.push(new Integer(a));
System.out.println("push(" + a + ")");
System.out.println("stack: " + st);
}
static void showpop(Stack st) {
System.out.print("pop -> ");
Integer a = (Integer) st.pop();
System.out.println(a);
System.out.println("stack: " + st);
}

11.3 La librera de clases de CLDC


public static void main(String args[]) {
Stack st = new Stack();
System.out.println("stack: " + st);
showpush(st, 42);
showpush(st, 66);
showpush(st, 99);
showpop(st);
showpop(st);
showpop(st);
try {
showpop(st);
} catch (EmptyStackException e) {
System.out.println("pila vac
a");
}
}
}
Salida del programa
stack: []
push(42)
stack: [42]
push(66)
stack: [42,
push(99)
stack: [42,
pop -> 99
stack: [42,
pop -> 66
stack: [42]
pop -> 42
stack: []
pop -> pila

66]
66, 99]
66]

vac
a

123

11.3 La librera de clases de CLDC

124

Clase Hashtable
Se usa para almacenar una colecci
on de objetos que est
an indexados por
cualquier otro objeto arbitrario.
Una tabla hash almacena informaci
on utilizando un mecanismo
llamado hashing: consiste en determinar un valor u
nico (c
odigo hash) a
partir del contenido de la clave.
Tal c
odigo determina la posici
on en la que se almacenan los datos
asociados a la clave.
Cuando se utiliza una tabla hash hay que especificar el objeto que se
utiliza como clave y el valor, es decir, los datos con los que se asocia
esa clave.
La transformaci
on de la clave en un c
odigo hash se realiza
autom
aticamente.
Una tabla hash s
olo puede almacenar objetos que sobreescriban los
metodos hashCode() y equals() de la clase Object.
int hashCode(): Calcula y devuelve el c
odigo hash para el objeto.
boolean equals(Object objeto): Compara si dos objetos son
iguales.
En CLDC tenemos dos constructores para esta clase:
Hashtable()
Hashtable(int tamanoInicial)

11.3 La librera de clases de CLDC

125

Ejemplo: P63/HTDemo.java
import java.util.Hashtable;
import java.util.Enumeration;
class HTDemo {
public static void main(String args[]) {
Hashtable balance = new Hashtable();
Enumeration names, negbal;
String str;
double bal;
balance.put("John Doe", new Double(3434.34));
balance.put("Tom Smith", new Double(123.22));
balance.put("Jane Baker", new Double(1378.00));
balance.put("Tod Hall", new Double(99.22));
balance.put("Ralph Smith", new Double(-19.08));
names = balance.keys();
while(names.hasMoreElements()) {
str = (String) names.nextElement();
System.out.println(str + ": " + balance.get(str));
}
System.out.println();
bal = ((Double)balance.get("John Doe")).doubleValue();
balance.put("John Doe", new Double(bal+1000));
System.out.println("El nuevo saldo de John Doe es: " +
balance.get("John Doe"));
}
}
Salida del programa
Tod Hall: 99.22
Ralph Smith: -19.08
John Doe: 3434.34
Jane Baker: 1378.0
Tom Smith: 123.22
El nuevo saldo de John Doe es: 4434.34

11.3 La librera de clases de CLDC

126

La clase Date
Un objeto Date es una envoltura para un n
umero entero que representa
una fecha y una hora como un desplazamiento (en milisegundos) desde
00:00 GMT (Greenwich Mean Time), 1 de Enero de 1970.
Es una clase mucho m
as limitada que la correspondiente de J2SE.
S
olo contiene constructores que crean un Date con el tiempo actual o
un tiempo dado a partir de un desplazamiento desde la epoca (00:00
horas del 1 enero de 1970):
Date()
Date(long desplazamiento)
Adem
as contiene un par de metodos para definir el desplazamiento o
recuperarlo, y un metodo equals() que compara un Date con otro.
void setTime(long desplazamiento)
long getTime()
boolean equals(Object obj)
La versi
on CLDC 1.1 contiene tambien el metodo toString() que
convierte el Date en un String en la forma
dow mon dd hh:mm:ss zzz yyyy
public String toString()
Esta clase se suele usar junto con Calendar para convertir entre
diferentes Dates y para transformar la representaci
on del Date en algo
m
as significativo que un desplazamiento.

11.3 La librera de clases de CLDC

127

La clase TimeZone
Un objeto TimeZone representa el desplazamiento de una zona respecto
a la zona horaria GMT.
Esta clase se usa debido a que todas las fechas en Java se representan
con desplazamientos respecto a 00:00 GMT, 1 de Enero de 1970, con lo
que se necesita conocer el desplazamiento local respecto a GMT para
formatear la hora correspondiente a tu zona horaria actual.
De nuevo la clase TimeZone de CLDC es mucho m
as pobre que la
correspondiente de J2SE.
Entre los metodos m
as importantes tenemos los metodos est
aticos
getDefault() y getDefault(String), que obtienen la zona horaria
por defecto o bien la especificada con el String para el dispositivo en
cuesti
on.
static TimeZone getDefault()
static TimeZone getDefault(String ID)

11.3 La librera de clases de CLDC

128

La clase Calendar
Esta clase es de nuevo una versi
on simplificada de la correspondiente de
J2SE.
Su uso principal es convertir entre un instante de tiempo dado con un
objeto Date y los correspondientes da, mes, a
no, hora, minutos y
segundos.
Calendar es una clase abstracta. Para obtener una instancia de ella, se
pueden usar los metodos est
aticos, que devuelven un objeto de una
subclase de Calendar que ya implementan las reglas adecuadas al
entorno concreto en que funciona el dispositivo:
static Calendar getInstance()
static Calendar getInstance(TimeZone zone)
Los metodos m
as usados son los siguientes:
El metodo setTime(Date) permite establecer hora y fecha mediante
un Date:
void setTime(Date date)
El metodo set() establece un nuevo valor pero s
olo para el campo
seleccionado.
void set(int field, int value)
El metodo get() permite obtener el valor de los distintos campos
(hora, minutos, segundos, etc) usando constantes tales como
Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND, etc.
int get(int field)
El metodo String toString() convierte el Calendar en un String
en la forma Tue, 9 Apr 2002 12:00:00 UTC

11.3 La librera de clases de CLDC

129

Ejemplo
Calendar cal = Calendar.getInstance();
Date date = new Date();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
Otro ejemplo
// Obtenemos un Calendar y obtenemos los milisegundos
// de la fecha actual
Calendar cal = Calendar.getInstance();
Date date = new Date();
long offset = date.getTime();
// Sumamos 20 d
as a la fecha actual
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000L;
offset += 20 * MILLIS_PER_DAY;
date.setTime(offset);
// Instanciamos la nueva fecha en el offset del Calendar
cal.setTime(date);
// Obtenemos la fecha ya ajustada
month = cal.get(Calendar.MONTH);
day = cal.get(Calendar.DAY_OF_MONTH);

11.3 La librera de clases de CLDC


Otro ejemplo
// Obtenemos d
a y mes de fecha actual
Calendar cal = Calendar.getInstance();
Date date = new Date();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
// Sumamos 20 d
as al campo d
a en el Calendar
cal.set(Calendar.DAY_OF_MONTH, day+20);
// Obtenemos la fecha ya ajustada: NO FUNCIONA BIEN
month = cal.get(Calendar.MONTH);
day = cal.get(Calendar.DAY_OF_MONTH);

130

11.3 La librera de clases de CLDC

131

La clase Random
Se usa para generar una secuencia de n
umeros seudoaleatorios.
Constructores:
public Random();
public Random(long semilla);
Metodos:
protected int next(int bits)
public int nextInt(): Genera el siguiente n
umero aleatorio int
uniformemente distribuido entre el conjunto de los n
umeros int.
public int nextInt(int n): Genera el siguiente n
umero aleatorio
int uniformemente distribuido entre 0 y el n
umeros int pasado
como argumento.
public int nextLong(): Genera el siguiente n
umero aleatorio long
uniformemente distribuido entre el conjunto de los n
umeros long.
public float nextFloat(): Genera el siguiente n
umero aleatorio
float uniformemente distribuido entre 0,0 y 1,0.
public double nextDouble(): Genera el siguiente n
umero
aleatorio double uniformemente distribuido entre 0,0 y 1,0.
public void setSeed(long seed): Establece la semilla.

11.4 Entrada/salida en Java

11.4.

Entrada/salida en Java

11.4.1.

Introducci
on

132

Java realiza entradas y salidas a traves de streams (flujos de datos).


Un stream es una abstracci
on que produce o consume informaci
on.
Un flujo est
a relacionado con un dispositivo fsico a traves del sistema
de E/S de Java.
Todos los flujos se comportan de la misma manera, incluso aunque
esten relacionados con distintos dispositivos fsicos.
Un flujo puede abstraer distintos tipos de entrada: archivo de disco,
teclado, conexi
on a red.
Un flujo puede abstraer distintos tipos de salida: consola, archivo de
disco o conexi
on a red.
Con un stream la informaci
on se traslada en serie (caracter a caracter
o byte a byte) a traves de esta conexi
on.
11.4.2.

Clases de CLDC para E/S de datos: Paquete java.io

El paquete java.io contiene las clases necesarias para E/S en Java a


traves de flujos de datos (data streams).
Este paquete de CLDC es un subconjunto del correspondiente de JDK.
Dentro de este paquete existen dos familias de jerarquas distintas para
la E/S de datos.
Clases que operan con bytes: Derivan de las clases InputStream o
OutputStream.
Clases que operan con caracteres (un car
acter en Java ocupa dos
bytes porque sigue el c
odigo Unicode): Derivan de las clases
abstractas Reader o Writer.

11.4 Entrada/salida en Java


java.lang

133

java.io
ByteArrayInputStream
InputStream
DataInputStream
DataInput

Object
DataOutput
DataOutputStream
OutputStream

ByteArrayOuputStream
PrintStream

Reader

InputStreamReader

Writer

OutputStreamReader
EOFException

Exception

IOException

InterruptedIOException
UnsupportedEncodingException
UTFDataFormatException

Clase

Interfaz

Clase abstracta

Extiende
Implementa

11.4 Entrada/salida en Java


11.4.3.

134

Clases para flujos de bytes

Las clases InputStream y OutputStream son superclases abstractas de


todos los flujos orientados a bytes, tal como en J2SE.
Clase java.io.InputStream
Superclase abstracta de todos los flujos orientados a entrada de bytes.
Los metodos de esta clase lanzan una IOException si se producen
condiciones de error.
Constructor
InputStream()
Metodos
int available(): Devuelve los bytes disponibles en el flujo.
void close(): Cierra el flujo y libera los recursos que usa.
void mark(int readlimit): Establece una marca en la posici
on
actual del flujo, que permite regresar posteriormente a esa posici
on.
boolean markSupported(): Indica si el flujo permite poner marcas.
int read()
int read(byte[] buffer)
int read(byte[] buffer, int offset, int length): Lee bytes
del flujo de entrada. Devuelve -1 si no hay bytes disponibles.
void reset(): Reposiciona el flujo en la marca establecida
previamente.
long skip(long bytecount): Salta bytecount bytes devolviendo
el n
umero de bytes saltados.

11.4 Entrada/salida en Java

135

Ejemplo
try{
InputStream is = Conector.openInputStream(
"socket://127.0.0.1:8888");
int ch;
while((ch = in.read()) >0) {
// hacer algo con el dato leido
}
} catch (IOException x) {
// Manejar la excepci
on
}
Clase java.io.OutputStream
Superclase 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.

11.4 Entrada/salida en Java

136

Clase ByteArrayInputStream
Flujo de entrada que usa un array de bytes como origen de los datos.
Es u
til cuando tenemos los datos almacenados en un array de bytes y
queremos leerlos como si proviniesen de un fichero, tubera o socket.
Un ejemplo de su uso es con los RecorStores de MIDP que se
estudiar
an m
as adelante. Estos son una especie de ficheros que guardan
los datos en arrays de bytes. En los MIDLets se suelen leer los datos
usando un ByteArrayInputStream
Constructores de ByteArrayInputStream:
ByteArrayInputStream(byte array[])
ByteArrayInputStream(byte array[],int offset, int numBytes)
Los metodos que contiene son los heredados de InputStream.
Ejemplo de uso de ByteArrayInputStream:
P70/ByteArrayInputStreamDemo.java
import java.io.*;
class ByteArrayInputStreamDemo {
public static void main(String args[]) throws IOException {
String tmp = "abcdefghijklmnopqrstuvwxyz";
byte b[];
b=tmp.getBytes();
ByteArrayInputStream input1 = new ByteArrayInputStream(b);
ByteArrayInputStream input2 = new ByteArrayInputStream(b, 0, 3);
}
}

11.4 Entrada/salida en Java

137

Otro ejemplo de ByteArrayInputStream:


P71/ByteArrayInputStreamReset.java
import java.io.*;
class ByteArrayInputStreamReset {
public static void main(String args[]) throws IOException {
byte b[] = { a, b, c };
ByteArrayInputStream in = new ByteArrayInputStream(b);
for (int i=0; i<2; i++) {
int c;
while ((c = in.read()) != -1) {
if (i == 0) {
System.out.print((char) c);
} else {
System.out.print(Character.toUpperCase((char) c));
}
}
System.out.println();
in.reset();
}
}
}
Salida
abc
ABC

11.4 Entrada/salida en Java

138

Clase ByteArrayOutputStream Flujo de salida que usa un array de


bytes como destino de los datos.
Constructores de ByteArrayOutputStream:
ByteArrayOutputStream(): Crea un b
ufer con 32 bytes.
ByteArrayOutputStream(int numBytes): Crea un b
ufer con el
tama
no especificado.
A parte de los metodos heredados de OutputStream contiene los
siguientes:
public void reset(): Descarta todos los datos almacenados en el
flujo, hasta el momento, al hacer igual a cero el campo count (el
cual representa el n
umero de bytes v
alidos en el vector d
onde se
almacenan los datos (bufer)).
public int size(): Devuelve el tama
no actual del b
ufer.
public byte[] toByteArray(): Devuelve una copia del b
ufer del
flujo.
public String toString(): Convierte el contenido del b
ufer en un
String.

11.4 Entrada/salida en Java

139

Ejemplo: P72/ByteArrayOutputStream.java
import java.io.*;
class ByteArrayOutputStreamDemo {
public static void main(String args[]) throws IOException {
ByteArrayOutputStream f = new ByteArrayOutputStream();
String s = "Esto se meter
a en el array";
byte buf[] ;
buf=s.getBytes();
f.write(buf);
System.out.print("Se escribe el bufer como un string: ");
System.out.println(f.toString());
System.out.print("Se lee del buffer y guardamos en array: ");
byte b[] = f.toByteArray();
for (int i=0; i<b.length; i++) {
System.out.print((char) b[i]);
}
System.out.println("\nHacemos un reset");
f.reset();
for (int i=0; i<3; i++) f.write(X);
System.out.println("Volvemos a escribir el bufer"+
" como un string: " + f.toString());
}
}
Salida del programa
Se escribe
Se lee del
Hacemos un
Volvemos a

el bufer como un string: Esto se meter


a en el array
buffer y guardamos en array: Esto se meter? en el array
reset
escribir el bufer como un string: XXX

11.4 Entrada/salida en Java

140

Clase DataOutputStream
Esta subclase de OutputStream proporciona metodos para escribir tipos de
datos b
asicos de Java de un forma independiente de la m
aquina, en el
subyacente flujo de salida.
Esta clase implementa los metodos del interfaz DataOutput.
Las instancias de esta clase pueden crearse directamente con el
constructor, o bien pueden ser obtenidas de otras formas, como por
ejemplo con el metodo openDataOutputStream() de la clase
javax.microedition.io.Connector.
Constructor:
public DataOutputStream(OutputStream in)
A parte de los metodos heredados de OutputStream tenemos:
void writeBoolean(boolean v): Escribe en el flujo el valor
boolean usando un byte.
void writeChar(int v): Escribe en el flujo el car
acter usando dos
bytes.
void writeChars(String v): Escribe el String en el flujo como
una secuencia de caracteres (dos bytes cada uno).
void writeUTF(String s): Escribe el String en el flujo usando
codificaci
on UTF-8.
Escritura de enteros:
void writeByte(int v): Escribe el entero usando un byte.
void writeShort(int v): Escribe el entero (short) usando dos
bytes.
void writeInt(int v): Escribe el entero usando cuatro bytes.
void writeLong(long v): Escribe el entero con ocho bytes.
Escritura de n
umeros en coma flotante (s
olo en CLDC 1.1):
void writeFloat(float v): Escribe el float usando cuatro
bytes.
void writeDouble(double v): Escribe el double usando ocho
bytes.

11.4 Entrada/salida en Java

141

Ejemplo de DataOutputStream usando un RecorStore


public class Record{
public String nombreJugador;
public int puntos;
}
Record record = new Record();
record.nombreJugador = "Tomas";
record.puntos = 12345678;
// Crear los flujos de salida
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream os = new DataOutputStream(baos);
// Escribir los valores en los flujos
os.writeUTF(record.nombreJugador);
os.writeInt(record.puntos);
os.close();
//Obtener el array de bytes con los valores guardados
byte[] data = baos.toByteArray();
//Escribir el record en el record store
int id = recordStore.addRecord(data,0,data.length);

11.4 Entrada/salida en Java

142

Clase DataInputStream
Esta subclase de InputStream proporciona metodos para leer tipos de
datos b
asicos de Java de un forma independiente de la m
aquina, a partir
del subyacente flujo de entrada.
Esta clase implementa los metodos del interfaz DataInput.
Las instancias de esta clase pueden crearse directamente con el
constructor, o bien pueden ser obtenidas de otras formas, como por
ejemplo con el metodo openDataInputStream() de la clase
javax.microedition.io.Connector.
Constructor:
public DataInputStream(InputStream in)
A parte de los metodos heredados de InputStream tenemos:
boolean readBoolean(): Lee un byte del flujo, devolviendo true si
no es cero y false en otro caso.
char readChar(): Lee dos bytes del flujo, y los devuelve como char
(en c
odigo Unicode).
String readUTF(): Lee bytes del flujo, y los devuelve como un
String con representaci
on Unicode. En el flujo se supone que el
string est
a almacenado en formato UTF-8.
Lectura de enteros:
byte readByte(): Lee un byte del flujo, que es tratado como un
entero con signo en el rango -128 a 127.
int readUnsignedByte(): Lee un byte, y lo interpreta como un
entero con signo en el rango 0 a 255, devolviendolo como un int.
short readShort(): Lee dos bytes, y los devuelve en un short.
int readUnsignedShort(): Lee dos bytes, y los interpreta como
un short sin signo, devolviendolo en un int.
int readInt(): Lee cuatro bytes, y los devuelve en un int.
long readLong(): Lee ocho bytes, y los devuelve en un long.

11.4 Entrada/salida en Java

143

Lectura de n
umeros en coma flotante (s
olo en CLDC 1.1):
float readFloat(): Lee cuatro bytes, y los devuelve en un float.
float readDouble(): Lee ocho bytes, y los devuelve en un double.
Otros metodos:
void readFully(byte[] b): Lee parte de los bytes del flujo,
guard
andolos en el array pasado como par
ametro. Se leen tantos bytes,
como la longitud de tal array.
void readFully(byte[] b, int off,int len): Similar al anterior.
Ejemplo de DataInputStream con el anterior RecordStore
byte[] data = recordStore.getRecord(recordId);
DataInputStream is = new DataInputStream(
new ByteArrayInputStream(data));
Record record = new Record();
record.nombreJugador = is.readUTF();
record.score = is.readInt();
is.close();

11.4 Entrada/salida en Java

144

Clase PrintStream
Extiende OutputStream y es usada para a
nadir funcionalidad a otro flujo
de salida de bytes.
Esta funcionalidad es la capacidad de convertir los distintos tipos b
asicos
de Java y objetos, en un formato que puede imprimirse en el subyacente
OutputStream pasado al constructor de PrintStream.
System.out y System.err son ejemplos de PrintStream.
Constructor:
public PrintStream(OutputStream out);
Los metodos introducidos por esta clase son del tipo
print(tipo valor) o println(tipo valor), que convierten el valor
en un String (codificado con la codificaci
on usada por el dispositivo),
y luego lo escriben en el flujo.

11.4 Entrada/salida en Java


11.4.4.

145

Clases para flujos de caracteres

Clase Reader
Es una clase abstracta que proporciona soporte para leer flujos de
caracteres.
Un Reader se diferencia de un InputStream en que trabaja con
caracteres Unicode de 16 bits en lugar de los 8 bits usados por los
InputStream.
Un flujo de entrada InputStream de 8 bits puede convertirse en una
secuencia de caracteres Unicode usando el constructor de la subclase
InputStreamReader.
La ventaja fundamental del uso de un Reader es que la codificaci
on de
los caracteres se traduce autom
aticamente en la operaci
on de lectura,
desde la representaci
on en bytes de los datos a la representaci
on en
caracteres de tales datos.
Metodos:
void close()
void mark(int readAheadLimit)
boolean markSupported()
void reset()
long skip(long n): Salta n caracteres.
boolean ready(): Indica si el flujo est
a preparado para poder leer
de el.
int read(): Lee un caracter.
int read(char[] cbuf): Lee un array de caracteres.
int read(char[] cbuf,int off,int len): Similar al anterior.

11.4 Entrada/salida en Java

146

Writer
Es de nuevo una clase abstracta que define metodos implementados por las
subclases para proporcionar salida de caracteres.
Un Writer se diferencia de un OutputStream en que trabaja con
caracteres Unicode de 16 bits en vez de con los 8 bits de los
OutputStream.
Una secuencia de caracteres Unicode puede convertirse en un flujo de
datos de 8 bits usando un constructor de la subclase
OutputStreamWriter.
La ventaja fundamental del uso de un Writer es de nuevo que la
codificaci
on de los caracteres se translada autom
aticamente entre la
representaci
on en bytes de los datos y la representaci
on en caracteres.
Metodos:
void close()
void flush()
void write(int c): Escribe un caracter.
void write(char[] cbuf): Escribe un array de caracteres.
void write(char[] cbuf,int off,int len): Similar al anterior.
void write(String str): Escribe un String.
void write(String str,int off,int len): Escribe un trozo del
String.

11.4 Entrada/salida en Java

147

InputStreamReader
Esta clase extiende la clase Reader y proporciona una implementaci
on para
leer caracteres (8 bits) de un flujo de bytes InputStream convirtiendolos en
caracteres Unicode.
O sea, los bytes leidos del flujo son traducidos autom
aticamente en
caracteres.
El mapping de los bytes leidos del InputStream a los caracteres que
devuelve el InputStreamReader se lleva a cabo con la codificaci
on que
especifiquemos en el constructor, o bien con la codificaci
on por defecto
del dispositivo.
Constructores:
public InputStreamReader(InputStream is)
InputStreamReader(InputStream is, String enc)
Los metodos que tiene son los heredados y sobreescritos de Reader
OutputStreamWriter
Extiende la clase Writer y proporciona la implementaci
on necesaria para
poder escribir caracteres Unicode en un flujo de bytes OutputStream
(escribe 8 bits por cada car
acter).
O sea, los caracteres escritos en este flujo son traducidos
autom
aticamente de Unicode a bytes.
De nuevo, el mapping entre el codigo Unicode (de 16 bits) y los bytes
requeridos por el subyacente OutputStreamWriter se lleva a cabo con
la codificaci
on que especifiquemos en el constructor, o bien con la
codificaci
on por defecto del dispositivo.
Constructores:
public OutputStreamWriter(OutputStream os);
public OutputStreamWriter(OutputStream os, String encoding)
throws UnsupportedEncodingException;
Los metodos que tiene son los heredados y sobreescritos de Writer

11.5 Paquete javax.microedition.io

11.5.

148

Paquete javax.microedition.io

Contiene una colecci


on de interfaces y una clase que definen el Generic
Connection Framework.
Este marco es usado por los perfiles basados en CLDC, para
proporcionar un mecanismo com
un para acceso a recursos de red y
otros recursos que puedan ser direccionados con un nombre y que
puedan enviar y recibir datos a traves de InputStream y
OutputStream.
Un ejemplo tpico de tales recursos es una p
agina HTML o un
servlet de Java, que pueden identificarse mediante un URL
(Uniform Resource Locator).
Aunque la especificaci
on CLDC define los interfaces y metodos de este
marco y sugiere c
omo deben usarse para abrir conexiones a varios tipos
de recursos, la especificaci
on no requiere que sea proporcionada
ninguna implementaci
on concreta. Sin embargo, especificando los
metodos comunes para abrir, cerrar y obtener datos de cualquier
recurso, el marco hace un poco m
as f
acil a los desarrolladores escribir
aplicaciones que puedan conectarse a fuentes de datos usando distintos
mecanismos de comunicaci
on, tales como sockets, datagramas o HTTP,
ya que s
olo hay un patr
on de codificaci
on a seguir.

11.5 Paquete javax.microedition.io


java.lang
Object

Exception

149

javax.microedition.io
Connector

ConnectionNotFoundException

Connection

DatagramConnection

Datagram

StreamConnectionNotifier
InputConnection
OutputConnection
StreamConnection
ContentConnection
HttpConnection

Clase

Interfaz

Clase abstracta

Extiende
Implementa

También podría gustarte