Introduccion Al Java
Introduccion Al Java
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
.
.
.
.
.
.
.
.
.
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
0-2
. . . . . . . . . . . . . . . . . . . . . . . 107
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
110
110
110
110
111
111
117
132
132
132
134
145
148
1.
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.
1.2.
Compilaci
on y ejecuci
on del programa con CLDC
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.
2.1.
Tipos simples
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
2.5.
Vectores y matrices
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
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
3.
Operadores
35
8
10
-8
-4
3.1.
.
++
*
+
<<
<
==
&
^
|
&&
||
?:
=
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;
}
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
break
13
continue
return
14
5.
Clases
5.1.
Fundamentos
class Box {
double width;
double height;
double depth;
}
5.2 Declaraci
on de objetos
5.2.
15
Declaraci
on de objetos
Sentencia
Box mybox;
Efecto
null
mybox
mybox=new Box();
mybox
5.2.1.
witdth
height
depth
Operador new
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
b1
witdth
height
depth
b2
5.4.
M
etodos
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
5.5 Constructores
5.5.1.
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
5.7.
Recogida de basura
5.8.
23
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
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
27
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;
}
}
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.
30
31
6.3.
32
Paso de argumentos
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;
}
}
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
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!
//
6.5.
Especificador static
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.
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.
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.
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
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
//
}
}
7.2.
41
Uso de super
42
7.3.
43
Orden de ejecuci
on de constructores
7.4.
44
Sobreescritura de m
etodos (Overriding)
7.5 Selecci
on de metodo din
amica
7.5.
45
Selecci
on de m
etodo din
amica
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
7.6.
48
Clases abstractas
49
7.7 Utilizaci
on de final con la herencia
7.7.
50
Utilizaci
on de final con la herencia
51
8.
Paquetes e Interfaces
8.1.
Paquetes
Definici
on de un paquete
8.1 Paquetes
8.1.2.
52
8.1 Paquetes
8.1.3.
53
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;
}
}
8.2 Protecci
on de acceso
8.2.
54
Protecci
on de acceso
Desde m
etodo en ...
private
sin modif.
protected
public
misma clase
no
no
no
no
no
no
no
8.2.2.
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.
57
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
8.4 Interfaces
60
Ejemplo definici
on de interfaz
interface Callback {
void callback(int param);
}
8.4.2.
Implementaci
on de una interfaz
8.4 Interfaces
8.4.3.
61
8.4 Interfaces
8.4.4.
62
Implementaci
on parcial
Variables en interfaces
8.4 Interfaces
63
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
66
9.2.
Tipos de excepci
on
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.
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
69
9.4.
70
try y catch
71
Descripci
on de una excepci
on
9.5 Cl
ausula catch m
ultiple
9.5.
72
Cl
ausula catch m
ultiple
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.
74
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);
}
}
}
75
76
9.7.
77
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.
79
Sentencia finally
80
9.10.
procA
finally de procA
capturada
procB
finally de procB
procC
finally de procC
81
82
10.
Programaci
on Multihilo (Multihebra)
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.
83
El hilo principal
10.3 Creaci
on de un hilo
84
10.3.
Creaci
on de un hilo
Implementaci
on del interfaz Runnable
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
10.3.2.
Extensi
on de la clase Thread
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
10.4.
Creaci
on de m
ultiples hilos
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()
10.5 Utilizaci
on de isAlive() y join()
91
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.
93
94
10.7 Sincronizaci
on
95
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
10.7 Sincronizaci
on
96
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
10.8.
Comunicaci
on entre hilos
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
10.8 Comunicaci
on entre hilos
105
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.
107
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
}
108
109
110
11.
11.1.
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
111
11.3.
112
Paquete java.lang
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).
114
115
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
MIDP-1.0
117
Paquete java.util
118
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.
120
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
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);
}
66]
66, 99]
66]
vac
a
123
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)
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
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.
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)
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
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);
130
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.1.
Introducci
on
132
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
134
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.
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);
}
}
137
138
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
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.
141
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.
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();
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.
145
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.
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.
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.
148
Paquete javax.microedition.io
Exception
149
javax.microedition.io
Connector
ConnectionNotFoundException
Connection
DatagramConnection
Datagram
StreamConnectionNotifier
InputConnection
OutputConnection
StreamConnection
ContentConnection
HttpConnection
Clase
Interfaz
Clase abstracta
Extiende
Implementa