Documente Academic
Documente Profesional
Documente Cultură
CONTENIDO
INTRODUCCION........................................................................................................................................... 1
CAPITULO UNO ............................................................................................................................................ 3
FUNDAMENTOS DEL JAVA ....................................................................................................................... 3
1.1.
QUE ES JAVA?............................................................................................................................ 3
1.2.
HISTORIA DE JAVA .................................................................................................................... 4
1.3.
POR QU APRENDER JAVA?................................................................................................... 5
1.4.
JAVA(TM) 2 SDK, STANDARD EDITION VERSION 1.4.0. ..................................................... 6
1.4.1. INSTALACION DEL JAVA(TM) 2 SDK, STANDARD EDITION VERSION 1.4.0.................... 6
1.4.2. ESTRUCTURA DE ARCHIVOS DEL JAVA 2 SDK .................................................................. 6
1.5.
EL EDITOR JCREATOR............................................................................................................. 10
1.5.1. REQUERIMIENTOS DEL SISTEMA ...................................................................................... 10
1.5.2. INSTALACION DE JCREATOR.............................................................................................. 10
1.6.
ESTRUCTURA DE UN PROGRAMA EN JAVA....................................................................... 11
1.7.
COMO CREAR UN PROGRAMA .............................................................................................. 12
1.7.1. CREACION DE UNA APLICACIN EN EL JCREATOR....................................................... 12
1.8.
USO DE COMENTARIOS .......................................................................................................... 14
1.9.
PALABRAS CLAVES................................................................................................................. 15
1.10.
IDENTIFICADORES .................................................................................................................. 16
1.11.
VARIABLES ............................................................................................................................... 16
1.12.
TIPOS DE DATOS....................................................................................................................... 17
1.12.1.
TIPOS DE DATOS PRIMITIVOS ....................................................................................... 17
1.12.2.
TIPOS DE DATOS REFERENCIA ..................................................................................... 18
1.13.
LITERALES................................................................................................................................. 19
1.14.
OPERADORES............................................................................................................................ 20
1.14.1.
OPERADORES ARITMTICOS......................................................................................... 21
1.14.2.
Operadores Relacionales.................................................................................................... 21
1.14.3.
Operadores Condicionales ................................................................................................. 22
1.14.4.
Operadores Lgicos y de Corrimiento (shift) ..................................................................... 22
1.14.5.
Operadores de Asignacin.................................................................................................. 23
1.14.6.
Otros Operadores ............................................................................................................... 23
1.15.
ENTRADA Y SALIDA BASICA ................................................................................................ 24
1.15.1.
FLUJOS DE ENTRADA DE BYTE Y CHAR (ENTRADA POR EL TECLADO) ................ 27
1.15.2.
FLUJOS DE SALIDA DE BYTE Y CHAR (SALIDA POR EL MONITOR)......................... 28
1.15.3.
USO DE EXCEPCIONES EN LA ENTRADA Y SALIDA DE DATOS................................ 30
1.16.
ENTRADA Y SALIDA UTILIZANDO TIPOS DE DATOS PRIMITIVOS ............................... 32
1.16.1.
FLUJOS DE ENTRADA A TRAVES DE BUFFEREDREADER (ENTRADA POR EL
TECLADO)33
1.16.2.
FLUJOS DE SALIDA A TRAVS DE LA SUBCLASE PRINTSTREAM (SALIDA POR EL
MONITOR)34
1.16.3.
MANEJO DE LOS TIPOS DE DATOS PRIMITIVOS ........................................................ 35
1.17.
LA CLASE MATH....................................................................................................................... 44
1.18.
EXPRESIONES, SENTENCIAS Y BLOQUES ....................................................................................... 48
1.19.
SENTENCIAS DE CONTROL DE FLUJO ................................................................................. 49
1.19.1.
Sentencia if.......................................................................................................................... 49
1.19.2.
Anidamiento de sentencias if .............................................................................................. 52
1.19.3.
Sentencia switch.................................................................................................................. 61
1.19.4.
Sentencia while ................................................................................................................... 68
1.19.5.
Sentencia do-while.............................................................................................................. 85
1.19.6.
SENTENCIA for.................................................................................................................. 93
1.19.7.
SENTENCIA break ........................................................................................................... 101
1.19.8.
SENTENCIA continue....................................................................................................... 102
1.19.9.
break etiquetado ............................................................................................................... 104
4.19.2.
Objetos de la clase base.................................................................................................... 222
4.19.3.
La clase derivada.............................................................................................................. 223
4.19.4.
Objetos de la clase derivada............................................................................................. 225
4.20.
MODIFICADORES DE ACCESO Y HERENCIA .................................................................... 227
4.21.
LA JERARQUA DE CLASES QUE DESCRIBEN LAS FIGURAS PLANAS ............................................... 229
4.21.1.
La clase Figura................................................................................................................. 230
4.21.2.
La clase Rectangulo.......................................................................................................... 230
4.21.3.
La clase Circulo................................................................................................................ 231
4.22.
USO DE LA JERARQUA DE CLASES ............................................................................................... 232
4.23.
ENLACE DINMICO ...................................................................................................................... 232
CAPITULO CINCO.................................................................................................................................... 235
GESTION DE EXCEPCIONES ................................................................................................................ 235
5.1.
LAS EXCEPCIONES ESTNDAR........................................................................................... 235
5.1.1. Las excepciones ..................................................................................................................... 236
5.1.2. Captura de las excepciones ................................................................................................... 238
5.1.3. Manejando varias excepciones.............................................................................................. 239
5.2.
LAS EXCEPCIONES PROPIAS ......................................................................................................... 241
5.2.1. La clase que describe la excepcin........................................................................................ 241
5.2.2. El mtodo que puede lanzar una excepcin........................................................................... 242
5.2.3. Captura de las excepciones ................................................................................................... 242
5.2.4. Una funcin que que puede lanzar varias excepciones ......................................................... 244
CAPITULO SEIS ........................................................................................................................................ 247
PAQUETES ................................................................................................................................................. 247
6.1.
PAQUETES ............................................................................................................................... 247
6.1.1. La sentencia package (paquete) ............................................................................................ 248
6.1.2. Compilacin de clases en paquetes ....................................................................................... 248
6.1.3. La sentencia import ............................................................................................................... 250
6.1.4. Proteccin de accesos ........................................................................................................... 251
6.1.5. Los paquetes estndar ........................................................................................................... 253
6.2.
EJEMPLOS DE USO DE PAQUETES ...................................................................................... 253
CAPITULO SIETE ..................................................................................................................................... 257
INTERFACES ............................................................................................................................................. 257
7.1.
QU ES UN INTERFACE? ..................................................................................................... 257
7.2.
DIFERENCIAS ENTRE UN INTERFACE Y UNA CLASE ABSTRACTA................................................... 258
7.3.
LOS INTERFACES Y EL POLIMORFISMO ......................................................................................... 259
7.3.1. Herencia simple..................................................................................................................... 260
7.3.2. Interfaces ............................................................................................................................... 261
CAPITULO OCHO..................................................................................................................................... 267
ENTRADA/SALIDA PARA EL MANEJO DE ARCHIVOS.................................................................. 267
8.1.
ARCHIVOS Y DIRECTORIOS................................................................................................. 267
8.1.1. La clase File .......................................................................................................................... 267
8.1.2. Creacin de un filtro.............................................................................................................. 270
8.2.
FLUJOS DE DATOS........................................................................................................................ 273
8.2.1. Las jerarquas de clases ........................................................................................................ 274
8.2.2. Lectura................................................................................................................................... 276
8.2.3. Escritura ................................................................................................................................ 277
8.3.
ENTRADA/SALIDA ESTNDAR...................................................................................................... 277
8.3.1. Los objetos System.in y System.out........................................................................................ 277
8.3.2. La clase Reader ..................................................................................................................... 278
iii
8.4.
ENTRADA/SALIDA A UN ARCHIVO EN DISCO .................................................................................281
8.4.1. Lectura de un archivo ............................................................................................................281
8.4.2. Lectura/escritura....................................................................................................................283
8.5.
LEER Y ESCRIBIR DATOS PRIMITIVOS ...........................................................................................285
8.5.1. Los flujos de datos DataInputStream y DataOutputStream ...................................................285
8.5.2. Ejemplo: un pedido ................................................................................................................287
8.5.3. El final del archivo.................................................................................................................290
8.6.
LEER Y ESCRIBIR OBJETOS ..................................................................................................292
8.6.1. El interface Serializable .........................................................................................................293
8.6.2. Lectura/escritura....................................................................................................................294
8.6.3. El modificador transient.........................................................................................................298
8.6.4. Objetos compuestos................................................................................................................302
8.6.5. La herencia ............................................................................................................................306
8.6.6. Serializacin personalizada ...................................................................................................311
CAPITULO NUEVE....................................................................................................................................313
APPLETS......................................................................................................................................................313
9.1.
DEFINICIN DE APPLET ........................................................................................................313
9.2.
EL APPLET MNIMO................................................................................................................314
9.3.
EL PRIMER APPLET .......................................................................................................................314
9.4.
INSERTANDO UN APPLET EN UNA PGINA WEB .............................................................................316
9.5.
FUNCIONES GRFICAS..........................................................................................................319
9.5.1. El contexto grfico .................................................................................................................324
9.5.2. Establecer un color ................................................................................................................326
9.5.3. Dibujar una lnea ...................................................................................................................326
9.5.4. Dibujar un rectngulo............................................................................................................326
9.5.5. Dibujar un arco......................................................................................................................327
9.5.6. Dibujar un polgono...............................................................................................................327
9.5.7. Dibujar una imagen ...............................................................................................................328
9.6.
LAS CLASES COLOR, FONT Y FONTMETRICS ................................................................................331
9.6.1. La clase Color ........................................................................................................................331
9.6.2. La clase Font..........................................................................................................................335
9.6.3. La clase FontMetrics..............................................................................................................336
9.7.
INTERFAZ GRAFICA CON EL USUARIO (GUI) Y COMPONENTES BASICOS................344
9.7.1. COMPONENTES ...................................................................................................................345
9.7.2. ROTULOS (Label) .................................................................................................................346
9.7.3. ADMINISTRADOR DE DISEOS GRIDLAYOUT................................................................365
9.7.4. BOTONES PARA PULSAR (BUTTON) .................................................................................369
9.8.
LOS GESTORES FLOWLAYOUT, BORDERLAYOUT Y GRIDLAYOUT ..............................................375
9.8.1. El gestor FlowLayout.............................................................................................................375
9.8.2. El gestor BorderLayout..........................................................................................................377
9.8.3. El gestor GridLayout..............................................................................................................379
9.9.
EL GESTOR DE DISEO GRIDBAGLAYOUT ...................................................................................381
9.9.1. Ejemplo: diseo de una ficha .................................................................................................381
9.9.2. El panel ..................................................................................................................................382
9.9.3. El applet .................................................................................................................................383
9.9.4. El gestor de diseo GridBagLayout .......................................................................................384
9.9.5. Aadir los componentes al applet ..........................................................................................384
CAPITULO DIEZ........................................................................................................................................389
HILO Y SINCRONIZACIN ....................................................................................................................389
10.1.
EL MODELO DE HILO DE JAVA ......................................................................................................389
10.1.1.
Prioridades de hilo ............................................................................................................390
10.1.2.
Sincronizacin ...................................................................................................................390
10.1.3.
Intercambio de mensajes ...................................................................................................391
iv
10.2.
THREAD ...................................................................................................................................... 391
10.3.
RUNNABLE .................................................................................................................................. 391
10.4.
PRIORIDADES DE LOS HILOS ........................................................................................................ 393
10.5.
SINCRONIZACIN ........................................................................................................................ 393
10.5.1.
La sentencia synchronized ................................................................................................ 394
10.6.
COMUNICACIN ENTRE HILOS ..................................................................................................... 395
10.6.1.
Bloqueos ........................................................................................................................... 397
10.7.
RESUMEN DE LA INTERFAZ DE PROGRAMACIN (API) DE HILOS ................................................. 397
10.7.1.
Mtodos de clase............................................................................................................... 397
10.7.2.
Mtodos de instancia ........................................................................................................ 398
INTRODUCCION
CAPITULO UNO
FUNDAMENTOS DEL JAVA
1.1.
QUE ES JAVA?
Java es un lenguaje de programacin de alto nivel con
el que se pueden escribir tanto programas convencionales como para Internet.
Una de las ventajas significativas de Java sobre otros
lenguajes de programacin es que es independiente de
la plataforma tanto en cdigo fuente como en binario.
Esto quiere decir que el cdigo producido por el compilador Java puede transportarse a cualquier plataforma (Intel, Sparc. Motorola, etc.) que tenga instalada
una mquina virtual Java y ejecutarse. Pensando en internet esta caracterstica es crucial ya que esta red
conecta ordenadores muy distintos. En cambio, C++, por
ejemplo, es independiente de la plataforma slo en cdigo fuente, lo cual significa que cada plataforma diferente debe proporcionar el compilador adecuado para
obtener el cdigo mquina que tiene que ejecutarse.
Segn lo expuesto. Java incluye dos elementos: un compilador y un intrprete. El compilador produce un cdigo de bytes que se almacena en un fichero para ser
ejecutado por el intrprete Java denominado mquina
virtual de Java.
Programa
escrito
en Java
Compilador
Cdigo de
bytes
Mquina
virtual
de Java
Los cdigos de bytes de Java son un conjunto de instrucciones correspondientes a un lenguaje mquina que
no es especfico de ningn procesador, sino de la mquina virtual de Java. Dnde se consigue esta mquina
virtual? Hoy en da casi todas las compaas de sistemas operativos y de navegadores han implementado mquinas virtuales segn las especificaciones publicadas
por Sun Microsystems, propietario de Java, para que
sean compatibles con el lenguaje Java. Para las aplicaciones de Internet (denominadas applets) la mquina
virtual est incluida en el navegador y para las aplicaciones Java convencionales, puede venir con el sistema operativo, con el paquete Java, o bien puede obtenerla a travs de Internet.
1.2.
HISTORIA DE JAVA
El lenguaje de programacin Java fue desarrollado por
Sun Microsystems en 1991. Nace como parte de un proyecto de investigacin para desarrollar software para
comunicacin entre aparatos electrnicos de consumo
como vdeos, televisores, equipos de msica. etc. Durante la fase de investigacin surgi un problema que
dificultaba enormemente el proyecto iniciado: cada
aparato tena un microprocesador diferente y muy poco
espacio de memoria: esto provoc un cambio en el rumbo
de la investigacin que desemboc en la idea de escribir un nuevo lenguaje de programacin independiente
del dispositivo que fue bautizado inicialmente como
Oak.
La explosin de internet en 1994, gracias al navegador
grfico Mosaic para la Word Wide Web (WWW), no pas
desapercibida para el grupo investigador de Sun. Se
dieron cuenta de que los logros alcanzados en su proyecto de investigacin eran perfectamente aplicables a
Internet. Comparativamente, Internet era como un gran
conjunto de aparatos electrnicos de consumo, cada uno
con un procesador diferente. Y es cierto bsicamente,
Internet es una gran red mundial que conecta mltiples
ordenadores con diferentes sistemas operativos y diferentes arquitecturas de microprocesadores, pero todos
tienen en comn un navegador que utilizan para comuni-
carse entre s. Esta idea hizo que el grupo investigador abandonara el proyecto de desarrollar un lenguaje
que permitiera la comunicacin entre aparatos electrnicos de consumo y dirigiera sus investigaciones hacia
el desarrollo de un lenguaje que permitiera crear
aplicaciones que se ejecutaran en cualquier ordenador
de Internet con el nico soporte de un navegador.
A partir de aqu va todo es conocido. Se empez a
hablar de Java y de sus aplicaciones, conocidas como
applets. Un applet es un programa escrito en Java que
se ejecuta en el contexto de una pgina Web en cualquier ordenador, independientemente de su sistema operativo y de la arquitectura de su procesador. Para
ejecutar un applet slo se necesita un navegador que
soporte la mquina virtual de Java como, por ejemplo.
Microsoft Internet Explorer o Netscape. Utilizando un
navegador de stos, se puede descargar la pgina Web
que contiene el applet y ejecutarlo. Precisamente en
este campo, es donde Java como lenguaje de programacin no tiene competidores. No obstante, con Java se
puede programar cualquier cosa, razn por la que tambin puede ser considerado como un lenguaje de propsito general: pero desde este punto de vista, hoy por
hoy, Java tiene muchos competidores que le sobrepasan
con claridad; por ejemplo C++.
1.3.
advierte a los potenciales usuarios de Java que en este lenguaje no existen punteros ni aritmtica de punteros, las cadenas de caracteres son objetos y la administracin de memoria es automtica, lo que elimina
la problemtica que presenta C++ con las lagunas de
memoria al olvidar liberar bloques de la misma que
fueron asignados dinmicamente.
1.4.
JAVA(TM)
VERSION 1.4.0.
SDK,
STANDARD
EDITION
c:\j2sdk1.4.0
El directorio raz del software SDK. Contiene
copyright, licencia y archivos README. Tambin contiene el archivo src.jar del cdigo
fuente para la plataforma Java 2.
6
c:\j2sdk1.4.0\bin
Los archivos ejecutables para el desarrollo
de programas contenidos en el Kit de desarrollo de Java (Java Development Kit).
La variable de entorno PATH debe contener una
entrada para este directorio:
path=%path%;c:\jdk1.3\bin
c:\j2sdk1.4.0\lib
Los archivos utilizados por las herramientas
de desarrollo. Estos incluyen tools.jar, que
contiene clases no esenciales como apoyo de
las herramientas y utilidades dentro del SDK.
Tambin incluye dt.jar que llaman al entorno
de desarrollo interactivo (IDE).
c:\j2sdk1.4.0\jre
El directorio raz del entorno en tiempo de
ejecucin del Java (Java Runtime Environment)
utilizado por las herramientas de desarrollo
SDK. El entorno en tiempo de ejecucin es una
implementacin de la plataforma Java 2. Este
es el directorio representado por la posesin
del java.home.
c:\j2sdk1.4.0\jre\bin
Archivos ejecutables y DLLs para herramientas
y libreras utilizadas por la plataforma Java. Los archivos ejecutables son idnticos a
los archivos en /j2sdk1.4.0/bin. La herramienta java launcher sirve coo una aplicacin
de lanzamiento, en lugar de el Viejo jre que
se enviaba con la versin 1.1 del software
SDK. Este directorio no necesita estar dentro
de la variable de entorno PATH.
c:\j2sdk1.4.0\jre\bin\classic
Contiene los archivos DLL utilizados por la
Mquina Virtual Clsica Java 2 (Java 2 Classic Virtual Machine). Estos archivos estn
presentes slo en el Java 2 SDK. Ellos no esPROGRAMACION CON JAVA 2
sistema de archivos local teh, con el cargador de clases applet, proporcionando las mismas protecciones tal como si ellos han sido
descargados desde la red.
A continuacin se describen los archivos y
directorios adicionales: demos, codigo fuente
Java y archivos de cabecera C.
c:\j2sdk1.4.0\src.jar
Archivos conteniendo cdigo fuente para la
plataforma Java 2.
c:\j2sdk1.4.0\demo
Ejemplos con cdigo fuente que muestran como
programar en la plataforma Java.
c:\j2sdk1.4.0\demo\applets
Applets que pueden utilizarse en una pgina
Web.
c:\j2sdk1.4.0\demo\jfc
Ejemplos que utilizan Java 2DTM y fiuncionalidad JFC\Swing.
c:\j2sdk1.4.0\demo\jpda
Ejemplos de uso del Java Platform Debugging
Architecture. Incluye cdigo fuente para las
utilidades javadt y jdb.
c:\j2sdk1.4.0\demo\sound
PROGRAMACION CON JAVA 2
1.5.
EL EDITOR JCREATOR
JCreator Pro Release V2.00 build 004 (32 bit) for Win
95/98/NT/2000.
Jcreator es un poderoso Entorno de Desarrollo Integrado (Integrated Development Environment: IDE), para Java, que proporciona al usuario un amplio rango de funcionalidades tales como: Administracin de proyectos,
plantillas, navegador para clases, elaboracin de cdigo, interfaz de depuracin, resaltado de sintaxis,
asistente y una interfaz de usuario configurable.
JCreator esta escrito enteramente en C++, el cual lo
hace a este rpido y eficiente comparado con los IDEs
basados en Java.
1.6.
11
1.7.
1.7.1. CREACION
JCREATOR
DE
UNA
APLICACIN
EN
EL
Para crear el programa elija File (Men principal), New, elija la ficha Files , Java File, ingrese el nombre del archivo en Filename, elija la carpeta donde se alojar el ar12
el icono
, luego
ejecutar el programa.
presione
para
13
1.8.
USO DE COMENTARIOS
En Java hay tres tipos de comentarios:
// comentarios de una sola lnea
/*
comentarios de una o ms lneas
*/
/**
comentario de documentacin, que pueden ser de una
o ms lneas y pueden contener palabras claves que comienzan con @ para destacar cierta informacin, por
ejemplo:
@version 1.0 (06/11/2000)
@author Gustavo A. Scrigna
@author Lisandro A. Palermo
*/
Los dos primeros tipos de comentarios son los ms
conocidos, ya que son los heredados del lenguaje C y
C++, y se utilizan del mismo modo. Los comentarios de
documentacin indican que ese comentario ha de ser
colocado
en
la
documentacin
que
se
genera
automticamente cuando se utiliza la herramienta del
JDK,
javadoc.
Dichos
comentarios
sirven
como
descripcin del elemento declarado permitiendo generar
una
documentacin
de
las
clases
que
se
van
construyendo al mismo tiempo que se genera el cdigo
de la aplicacin. En este tipo de comentario para
documentacin, se permite la introduccin de algunas
palabras claves, que harn que la informacin aparezca
14
1.9.
PALABRAS CLAVES
Las siguientes son las palabras claves que estn definidas en el lenguaje Java y que no pueden utilizarse
como identificadores:
abstract
double
int
strictfp **
boolean
else
interface
super
break
Extend
long
switch
byte
final
native
synchronized
case
finally
new
this
15
catch
float
package
throw
char
for
private
throws
class
goto *
protected
transient
const *
if
public
try
continue
implements
return
void
default
import
short
volatile
do
instanceof
static
while
1.10.
IDENTIFICADORES
Los identificadores se utilizan como nombres de clase,
mtodo y variable. Un identificador puede ser cualquier sentencia descriptiva de letras en mayscula o
minscula, nmeros y los caracteres subrayado (_) y
signo de dlar ($). No se deban comenzar por nmero.
Java diferencia entre maysculas/minsculas, lo que
significa que VALOR es un identificador diferente de
Valor.
1.11.
VARIABLES
Una variable es un tem de datos nombrado por un identificador. Debemos explcitamente suministrar un nom-
16
1.12.
TIPOS DE DATOS
Cada variable debe tener un tipo de datos. El lenguaje
de programacin Java tiene dos categoras de tipos de
datos: primitivo y referencia.
1.12.1.
17
En la tabla siguiente listamos todos los tipos de datos primitivos soportados por Java,
junto con sus tamaos y formatos, y una breve
descripcin de cada uno de ellos.
Tipo
Descripcin
1.12.2.
Nombre del
objeto
1.13.
Un objeto o
un array
LITERALES
Un valor constante en Java se crea utilizando una representacin literal de l. Java utiliza cinco tipos
de elementos: enteros, reales en coma flotante, booleanos, caracteres y cadenas, que se pueden poner en
cualquier lugar del cdigo fuente de Java. Cada uno de
estos literales tiene un tipo correspondiente asociado
con l.
A continuacin se tiene el ejemplo de valores literales y sus tipos de datos:
Literal
Tipo de Datos
178
Int
8864L
Long
37.266
Double
37.266D
double
87.363F
float
26.77e3
double
'c'
char
true
boolean
false
boolean
"Hola"
String
19
1.14.
OPERADORES
Un operador realiza una funcin en uno, dos o tres
operandos. Un operador que requiere un solo operando
se denomina operador unario. Por ejemplo, ++ es un
operador unario que incrementa el valor de su operando
en 1. Un operador que requiere de dos operandos es un
operador binario. Por ejemplo, = es un operador binario que asigna el valor del operando de la derecha al
operando de la izquierda. Y, finalmente, el operador
ternario el que requiere tres operandos. El lenguaje
de programacin Java tiene un operador ternario, ?:,
que es un atajo de la sentencia if-else, el cual se
analizar ms adelante .
Los operadores unarios soportan tanto la notacin prefija como postfija. La notacin prefija significa que
el operador aparece antes que el operando:
operador op
//notacin prefija
//notacin postfija
Todos los operadores binarios utilizan notacin infija, que significa que el operador aparece entre sus
operandos:
op1 operador op2
//notacin infija
El operador ternario es tambin infijo; cada componente del operador aparece entre operandos:
op1 ? op2 : op3
//notacin infija
1.14.1.
Operador
OPERADORES ARITMTICOS
Uso
Descripcin
op1 + op2
op1 - op2
op1 * op2
op1 / op2
op1 % op2
Operador
Uso
Descripcin
++
op++
++
++op
--
op--
--
--op
1.14.2.
Operador
OPERADORES RELACIONALES
Uso
Devuelve true si
>
>=
<
<=
==
op1 == op2
!=
Op1 != op2
21
1.14.3.
Operador
OPERADORES CONDICIONALES
Devuelve true si
Uso
&&
op1
op2
&&
||
op1
op2
||
! op
&
op1
op2
&
op1
op2
op1
op2
op es false
1.14.4.
(SHIFT)
Operador
Uso
Operacin
"AND" de Bits
&
op1 | op2
"OR" de Bits
op1 ^ op2
"XOR" de Bits
~op2
Complemento Binario
Operador
Uso
Operacin
>>
op1
op2
>>
<<
op1
op2
<<
>>>
op1 >>>
op2
22
1.14.5.
OPERADORES DE ASIGNACIN
Operador
Uso
Equivalente a
+=
op1 += op2
-=
op1 -= op2
*=
op1 *= op2
/=
op1 /= op2
%=
op1 %= op2
&=
|=
op1 |= op2
^=
op1 ^= op2
<<=
>>=
>>>=
1.14.6.
Operador
OTROS OPERADORES
Uso
Descripcin
?:
[]
tipo []
tipo[ op1 ]
op1[ op2 ]
Accede al elemento de la posicin op2 dentro del array op1. El ndice comienza en 0
y se extiende hasta la longitud del array
menos uno.
op1.op2
op1(parmetros)
(tipo)
(tipo) op1
new
new op1
Instanceof
op1
op2
1.15.
instanceof
De la misma forma, un programa puede enviar informacin a un destino externo abriendo un flujo hacia el
destino y escribiendo la informacin en serie, de esta
manera:
24
Reading (Lectura)
Abrir el flujo
Mientras haya ms informacin
escribir informacin
cerrar el flujo
Writing (Escritura)
Abrir el flujo
Mientras haya ms informacin
leer la informacin
cerrar el flujo
Flujo de byte
25
Flujo de byte
Flujo sumidero de
datos
Flujo de procesamiento
misin es proporcionar miembros comunes que sern compartidos por todas sus subclases.
1.15.1.
FLUJOS DE ENTRADA DE BYTE Y CHAR
(ENTRADA POR EL TECLADO)
La clase InputStream es una clase abstracta
que es superclase de todas las clases que representan un flujo en el que un destino lee
bytes de un origen. Cuando una aplicacin define un flujo de entrada, la aplicacin es
destino de ese flujo de bytes, y es todo lo
que se necesita saber.
El mtodo ms importante de esta clase es
read. Este mtodo se presenta de tres formas:
public abstract int read() throws IOException
27
Variable = System.in.read()
1.15.2.
FLUJOS DE SALIDA
(SALIDA POR EL MONITOR)
DE
BYTE
CHAR
La primera versin de write simplemente escribe el byte especificado en un flujo de salida. Puesto que su parmetro es de tipo int,
lo que se escribe es el valor correspondiente
a los 8 bits menos significativos, el resto
son ignorados.
La segunda versin del mtodo write escribe
los bytes almacenados en la matriz b en un
flujo de salida (ms adelante analizaremos
las matrices de datos).
La tercera versin del mtodo write escribe
un mximo de len bytes de una matriz b a partir de su posicin off, en un flujo de salida.
Cada uno de estos mtodos ha sido escrito para que bloquee la ejecucin del programa que
los invoque hasta que toda la salida solicitada haya sido escrita.
De manera anloga a read utilizaremos la clase System para llamar al mtodo write, de la
siguiente forma:
System.out.write(parametro)
29
1.15.3.
USO DE EXCEPCIONES EN LA ENTRADA Y
SALIDA DE DATOS
Cuando durante la ejecucin de un programa
ocurre un error que impide su continuacin,
por ejemplo, una entrada incorrecta de datos
o una divisin por cero. Java lanza una excepcin, que cuando no se captura da lugar a
un mensaje acerca de lo ocurrido y detiene su
ejecucin (las excepciones se lanzan, no ocurren). Ahora, si lo que deseamos es que la
ejecucin del programa no se detenga, habr
que capturarla y manejarla adecuadamente en
un intento de reanudar la ejecucin.
Las excepciones en Java son objetos de subclases de Throwable. Por ejemplo, el paquete
java.io define una clase de excepcin general
denominada IOException para excepciones de
entrad y salida.
Puesto que en Java hay muchas clases de excepciones, un mtodo puede indicar los tipos
de excepciones que posiblemente puede lanzar.
Por ejemplo, puede observar que los mtodos
read y write que acabamos de exponer lanzan
excepciones del tipo IOException. Entonces,
cuando utilicemos alguno de esos mtodos hay
que escribir el cdigo necesario para capturar las posibles excepciones que pueden lanzar. Esto es algo a lo que nos obliga el compilador Java, del mismo modo que l verifica
si una variable ha sido iniciada antes de ser
utilizada, o si el nmero y tipo de argumentos utilizados con un mtodo son correctos,
con la nica intencin de minimizar los posibles errores que puedan ocurrir.
La forma bsica de evitar escribir el cdigo,
cuando se produce una excepcin, es utilizar
la siguiente lnea en el main:
31
InputStream
OutputStream
Reader
Writer
una
y
new
La clase InputStreamReader establece un puente para pasar flujos de bytes a flujos de caracteres tal como se muestra en la figura
1.3. Para ello debemos definir el flujo que
hemos denominado isr como se muestra en el
cdigo anterior.
Adems el cdigo anterior indica que el
flujoE dirigir todas las invocaciones de sus
mtodos al flujo subyacente isr; este flujo,
en el caso de que el origen sea el teclado
(dispositivo vinculado con System.in), deber
convertir los bytes ledos del teclado en
caracteres. De esta forma flujoE podr
suministrar
un
flujo
de
caracteres
al
programa destino de los datos.
33
Programa
flujoE
isr
caracteres
in
Teclado
bytes
Figura 1.3
Para realizar la lectura de las cadenas utilizaremos el mtodo readLine, el cual nos
permite leer una lnea de texto. El mtodo
readLine tiene la siguiente sintaxis:
public String readLine() throws IOException
1.16.3.
MANEJO
PRIMITIVOS
DE
LOS
TIPOS
DE
DATOS
35
Constructores
Integer(int value)
Construye un objeto Integer que representa el valor int indicado por el parmetro String.
Ahora mostramos en el idioma original los Mtodos de la clase Integer1
Mtodos
1
byte byteValue()
cally.
int compareTo(Object o)
object.
object.
float floatValue()
float.
Returns the integer value of the system property with the specified name.
int hashCode()
long longValue()
long.
37
short shortValue()
38
Constructores
Float(double value)
Constructs a newly allocated Float object that represents the argument converted to type float.
Float(float value)
Constructs a newly allocated Float object that represents the primitive float argument.
Float(String s)
Mtodos
byte byteValue()
39
ues.
int compareTo(Float anotherFloat)
Compares two Float objects numerically.
int compareTo(Object o)
object.
double doubleValue()
object.
Returns true if this Float value is infinitely large in magnitude, false otherwise.
static boolean isInfinite(float v)
float argument.
InputStreamReader
isr
=
new
InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
String sdato; // variable para almacenar una
// lnea de texto
int nume; //variable que almacena un nmero
//entero
float numf; //variable que almacena un nmero
//float
");
PROGRAMACION CON JAVA 2
42
de
a
de
a
43
1.17.
LA CLASE MATH
java.lang.Object
|
+--java.lang.Math
La clase Math contiene mtodos para desarrollar operaciones numricas bsicas tal como la potenciacin, logaritmo, raz cuadrada y las funciones trigonomtricas.
A continuacin se muestran los atributos y mtodos de
la clase Math (versin original).
Atributos
static double E
Mtodos
static double abs(double a)
value.
value.
value.
lue.
Returns the smallest (closest to negative infinity) double value that is not less than
the argument and is equal to a mathematical integer.
static double cos(double a)
angle.
Returns the largest (closest to positive infinity) double value that is not greater
than the argument and is equal to a mathematical
integer.
static double IEEEremainder(double f1, double f2)
45
angle.
angle.
46
Ejemplo ( 6): Escriba un programa que convierta coordenadas polares a coordenadas cartesianas.
(X,Y)
x = r * cos ( )
y = r * sen ( )
//archivo: cartepola.java
import java.io.*;
import java.lang.Math;
class cartepola
{
public static void main (String[] args)
throws IOException
{
47
La salida es:
1.18.
48
de ejecucin y
de sentencias:
declaracin, y
agrupar cero o
1.19.
1.19.1.
SENTENCIA if
Nos permite ejecutar una parte u otra del cdigo dependiendo de la evaluacin.
La sintaxis es la siguiente:
if (expresin booleana) {
// bloque por true
sentencia v1;
sentencia v2;
...
sentencia vn;
}
else {
// bloque por false
sentencia f1;
sentencia f2;
...
sentencia fn;
}
expresin es una evaluacin lgica, es decir,
debe evaluar true o false. Por true se ejecuta el primer bloque de sentencias y por false
el segundo.
Una forma abreviada es cuando tenemos una sola sentencia, caso en el cual no hace falta
poner las llaves.
if (expresin booleana)
sentencia por true;
else
sentencia por false;
PROGRAMACION CON JAVA 2
49
//archivo: valabsoluto.java
import java.io.*;
class valabsoluto
{
public static void main (String[] args)
throws IOException
{
50
La salida ser:
51
//archivo: valabsoluto2.java
import java.io.*;
class valabsoluto2
{
public static void main (String[] args)
throws IOException
{
1.19.2.
ANIDAMIENTO DE SENTENCIAS if
52
if (expresin booleana)
if (expresin booleana)
sentencia por true;
else
sentencia por false;
else
if (expresin booleana)
sentencia por true;
else
sentencia por false;
Cuando no se utilizan las llaves para agrupar
expresiones las sentencias else se emparejan
con el if ms cercano.
53
//archivo: mayor.java
import java.io.*;
class mayor
{
public static void main (String[] args)
throws IOException
{
La salida es:
54
//archivo: division.java
import java.io.*;
class division
{
public static void main (String[] args)
throws IOException
{
55
// calcular la division
if (den==0)
if (num==0)
System.out.println("La divison es: Indeterminado");
else
System.out.println("La divison es: Infinito");
else
{
div=num/den;
System.out.println("La
division
:
"+div);
}
}
}
56
b)
c)
//archivo: sueldo.java
import java.io.*;
PROGRAMACION CON JAVA 2
57
class sueldo
{
public static void main (String[] args)
throws IOException
{
// Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
String sdato; // variable para almacenar una lnea de texto
double su;//sueldo
char cat;//categora
int ing;//ao de ingreso
// lectura de los 3 numeros
System.out.print("Ingrese sueldo : ");
sdato = flujoE.readLine(); // leer una lnea de texto
su=Float.parseFloat(sdato);//convierte cadena a float
System.out.print("Ingrese categoria (a , b o c): ");
cat = (char) flujoE.read(); // leer caracter
que
if (cat=='a')
su=su*1.15;
if (cat=='b')
su=su*1.20;
if (cat=='c')
su=su*1.25;
}
else //en otro caso ing>=1980
{
if (cat=='a')
su=su*1.12;
if (cat=='b')
su=su*1.17;
if (cat=='c')
su=su*1.22;
}
}
58
Si las Ventas > 500.00, entonces la comisin es 50.00 u.m. mas 8% de las ventas superiores a 500.00.
59
//archivo: ventas.java
import java.io.*;
public class ventas
{
public static void main(String[] args)
throws IOException
{
// Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
String sdato; // variable para almacenar una lnea de texto
double ventas,comision=0;
System.out.print("Ventas totales : ");
sdato = flujoE.readLine(); // leer una lnea de texto
ventas=Double.parseDouble(sdato);//convierte cadena
60
if(ventas<50)
comision=0;
else if(ventas>=50&&ventas<=500)
comision=ventas*0.10;
else if(ventas>500)
comision=50+(ventas-500)*0.08;
}
}
System.out.println("Comision: "+comision);
1.19.3.
SENTENCIA switch
Switch (expresion)
{
case expresin_constante_1:
[sentencia1;]
case expresin_constante_2:
[sentencia2;]
...
[default:]
sentencia n;
}
61
62
//archivo: vocales.java
import java.io.*;
class vocales
{
public static void main (String[] args)
throws IOException
{
char c;//caracter
// lectura
System.out.print("Ingrese letra : ");
c=(char) System.in.read();//lee caracter
//convertir a mayusculas
c=Character.toUpperCase(c);
// verificar si es letra
if (Character.isLetter(c))
switch (c)
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':System.out.println(c+" es vocal"); break;
default : System.out.println(c+" no es vocal");
}
else
System.out.println(c+" no es letra");
}
63
64
//archivo: mes.java
import java.io.*;
class mes
{
public static void main (String[] args)
throws IOException
{
65
TIPO DE
TARIFA
1
2
3
4
5
66
COSTO
(U.M./Kw-h)
2.30
8.25
6.42
5.80
9.65
//archivo: tarifa.java
import java.io.*;
public class tarifa
{
public static void main(String[] args)
throws IOException
{
// Definir un flujo de caracteres de entrada: flujoE
PROGRAMACION CON JAVA 2
67
InputStreamReader
isr
=
InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
//texto
new
if(tarifa!=0)
{
monto=consumo*tarifa;
System.out.println("\nMonto a pagar: "+monto);
}
else
System.out.println("\nTarifa incorrecta");
1.19.4.
SENTENCIA while
de
la
sentencia
while
sucede
1. Se evala la condicin.
2. Si el resultado de la evaluacin es false
(falso), la sentencia no se ejecuta y se pasa
el control a la siguiente sentencia en el
programa.
3. Si el resultado de la evaluacin es true
(verdadero), se ejecuta la sentencia y el
proceso descrito se repite desde el punto 1.
Uso de acumuladores en las sentencias repetitivas
que
69
d = d + 1
Cada vez que se ejecute el ciclo repetitivo,
esta variable permitir incrementar a d en
una unidad.
70
//archivo: divisores.java
import java.io.*;
class divisores
{
public static void main (String[] args)
throws IOException
{
71
72
//archivo: sumacifras.java
import java.io.*;
PROGRAMACION CON JAVA 2
73
class sumacifras
{
public static void main (String[] args)
throws IOException
{
Ejemplo (18): Escribir un programa que permita calcular el promedio de los nmeros positivos ingresados por el teclado, el ingreso
termina cuando el nmero ingresado es CERO.
(Usar while)
Ejemplo:
74
Ingrese un nmero:
6 <ENTER>
Ingrese un nmero:
-3 <ENTER>
Ingrese un nmero:
10 <ENTER>
Ingrese un nmero:
2 <ENTER>
Ingrese un nmero:
0 <ENTER>
75
//archivo: promposi.java
// respuesta pregunta 1 examen 1 2003-1
import java.io.*;
class promposi
{
public static void main (String[] args)
throws IOException
{
");
System.out.print("Ingrese
un
numero
(cero
para
finalizar): ");
sdato = flujoE.readLine(); // leer una lnea de
//texto
num=Float.parseFloat(sdato);//convierte cadena
}
p=s/n;
System.out.println("El promedio es: "+p);
}//fin de main
}//fin de la clase
76
a <ENTER>
e <ENTER>
n <ENTER>
p <ENTER>
* <ENTER>
a existe 1 vez(ces)
e existe 1 vez(ces)
caracteres que no son vocales existe(n)
2 vez(ces)
77
78
//archivo: exa1p120032.java
// respuesta pregunta 1 examen 1 2003-2
import java.io.*;
class exa1p120032
{
public static void main (String[] args)
throws IOException
{
// Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
int a=0,e=0,i=0,o=0,u=0,nv=0;//contadores
char car;
System.out.print("Ingrese caracter (* para finalizar): ");
car = (char) flujoE.read(); // leer un carcter
flujoE.skip(2);
while(car!='*')
{
switch (car)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
default :
}
a++;break;
e++;break;
i++;break;
o++;break;
u++;break;
nv++;
System.out.print("Ingrese
caracter
(*
finalizar):");
car = (char) flujoE.read(); // leer un carcter
flujoE.skip(2);
}//fin de while
if(a>0)
System.out.println("a existe "+a+" vez(ces)");
if(e>0)
System.out.println("e existe "+e+" vez(ces)");
if(i>0)
System.out.println("i existe "+i+" vez(ces)");
if(o>0)
System.out.println("o existe "+o+" vez(ces)");
if(u>0)
System.out.println("u existe "+u+" vez(ces)");
if(nv>0)
System.out.println("caracteres que no son
existen "+ nv+ " vez(ces)");
}//fin de main
}//fin de la clase
para
vocales
79
80
81
82
//archivo: exa1p220032.java
// respuesta pregunta 1 examen 1 2003-2
import java.io.*;
class exa1p220032
{
public static void main (String[] args)
throws IOException
{
// Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
10
boolean c1=false,c2=false,c3=false,c4=false,c5=false;
int cif=0, e=0, s=0;//cif=cantidad de cifras, e=exponente
//s= acumulador
int num,base;//num=nmero en base 10, base=base mayor que
int r;
String sdato;
System.out.print("Ingrese numero en base 10: ");
sdato=flujoE.readLine();
num=Integer.parseInt(sdato);
System.out.print("base mayor que 10: ");
sdato=flujoE.readLine();
base=Integer.parseInt(sdato);
while(num!=0)
{
r=num%base;
cif=cif+1;
if (r>=10)
{
switch (cif)
{
case 1: c1=true;break;
case 2: c2=true;break;
case 3: c3=true;break;
case 4: c4=true;break;
case 5: c5=true;break;
}//fin de switch
r=r-10;
}//fin de if
s=s+r*(int) Math.pow(10,e);
e=e+1;
num=num/base;
}//fin de whilw
System.out.print("EL numero en base "+base+" es:");
e=e-1;
while(s!=0)
{
r=s/(int) Math.pow(10,e);
s=s%(int) Math.pow(10,e);
e=e-1;
83
System.out.print("\n");
}//fin de main
}//fin de la clase
84
1.19.5.
SENTENCIA do-while
sentencia 1;
while (expresin booleana);
Observe que la estructura do ... while finaliza con un punto y coma.
La ejecucin de una sentencia do .. while sucede de la siguiente forma:
1. Se ejecuta el bloque (sentencia simple o
compuesta) de do.
2. Se evala la expresin correspondiente a
la condicin de finalizacin del bucle.
3. Si el resultado de la evaluacin es false
(falso), se pasa el control a la siguiente
sentencia en el programa.
85
Ejemplo (21): Escribir un programa que permita calcular la suma de la siguiente serie,
para N trminos; siendo N ingresado por teclado: (Usar slo do while)
S =1
2
2 !
3
3 !
4
4 !
5
5 !
6 !
+ ...
7 ! 8 !
N trminos
86
//archivo: serie.java
import java.io.*;
PROGRAMACION CON JAVA 2
87
class serie
{
public static void main (String[] args)
throws IOException
{
}//fin de main
}//fin de la clase
88
//archivo: perfecto.java
import java.io.*;
class perfecto
{
public static void main (String[] args)
throws IOException
{
89
System.out.println("El
System.out.println("El
numero
numero
es
no
es
Ejemplo (23): Escribir un programa que imprima los n primeros nmeros perfectos, si n
es ingresado por el teclado.
90
91
//archivo: nperfectos.java
import java.io.*;
class nperfectos
{
public static void main (String[] args)
throws IOException
{
92
if (s==num)
{ c++;
System.out.println(num);
}
} while(c<n);
1.19.6.
SENTENCIA for
La sentencia for permite ejecutar una sentencia simple o compuesta, repetidamente un nmero de veces conocido. Su sintaxis es la siguiente:
for ([v1=e1 [, v2=e2]
[progresin condicin])
];
[condicin];
{
sentencia 1;
sentencia 1;
sentencia 1;
...
sentencia 1;
}
o bien:
for ([v1=e1 [, v2=e2] ]; [condicin]; [progresin condicin])
sentencia;
Donde:
v1, v2, , representan variables de control que sern iniciadas con los valores
de las expresiones el, e2, ;
progresin condicin, es una o ms expresiones separadas por comas cuyos valores evolucionan en el sentido de que
se cumpla la condicin para finalizar la
ejecucin de la sentencia for;
94
int f, c;
for (f = 3, c = 6; f + c < 40; f++, c+=2)
System.out.print(f= + f + c= + c);
Este otro ejemplo que ve a continuacin, imprime los valores desde 1 hasta 10 con incrementos de 0.5.
for (float i=1; i <= 10; i += 0.5)
System.out.print(i + );
El siguiente ejemplo imprime las letras del
abecedario en orden inverso.
char car;
for (car=z ; car >= a; car--)
System.out.print(car + );
El ejemplo siguiente indica cmo realizar un
bucle infinito. Para salir de un bucle infinito tiene que pulsar las teclas Ctrl+C.
for (;;)
x++;
Ejemplo ( 24): Escribir un programa que permita leer un nmero en base m y lo convierta a otro nmero en base n. El programa debe imprimir el nmero en base n. Los valores de m y n son menores que 10 (Usar slo
for)
95
//archivo: basemton.java
import java.io.*;
96
class basemton
{
public static void main (String[] args)
throws IOException
{
numm;//numero en base m
numn;//numero en base n
num10;//numero en base 10
m, n;//base m y n
i;//contador
r;//resto
System.out.println("El
numero
en
base
10
}//fin de main
}//fin de la clase
98
//archivo: factorial.java
import java.io.*;
class factorial
{
public static void main (String[] args)
throws IOException
{
99
//archivo: nfactorial.java
import java.io.*;
class nfactorial
{
100
1.19.7.
SENTENCIA break
101
1.19.8.
SENTENCIA continue
MCD (60,36)=12
Nmero mayor (n1)
60
36
24
36
24
12
Residuo (r)
24
12
Cociente (q)
MCD (70,12)=2
Nmero mayor (n1)
70
12
10
12
10
Residuo (r)
10
Cociente (q)
//archivo: mcd.java
import java.io.*;
class mcd
{
public static void main (String[] args)
throws IOException
{
103
r=n1%n2;
if (r==0) //sale del for
{
mcd=n2;
break;// n2 es mcd
}
n1=n2;
n2=r;
1.19.9.
break ETIQUETADO
104
La versin etiquetada es similar a la anterior, con la diferencia que se usa para salir
de un bucle que tiene una etiqueta. Veamos un
ejemplo:
Ejemplo: break etiquetado - Cdigo parcial
...
busqueda:
for (; i < maximo; i++) {
for (; j < maximo; j++) {
...
...
break busqueda;
}
}
En el ejemplo, cuando se llegue al punto de
la ejecucin de break busqueda; se saldr del
for externo, donde figura la etiqueta busqueda.
105
CAPITULO DOS
ARREGLOS (ARRAY) Y CADENAS
Un array es un medio de guardar un conjunto de objetos de la
misma clase. Se accede a cada elemento individual del array
mediante un nmero entero denominado ndice. 0 es el ndice
del primer elemento y n-1 es el ndice del ltimo elemento,
siendo n, la dimensin del array. Los arrays son objetos en
Java y como tales vamos a ver los pasos que hemos de seguir
para usarlos convenientemente
Declarar el array
Crear el array
Usar el array
2.1.
107
2.2.
ARRAY
108
numeros[i]=i*i+4;
}
Mg. ABRAHAM GAMARRA MORENO
numeros[i]=i*i+4;
}
Los arrays se pueden declarar, crear e inicializar en
una misma lnea, del siguiente modo
int[] numeros={2, -4, 15, -25};
String[] nombres={"Juan", "Jos", "Miguel", "Antonio"};
Para imprimir a los elementos de array nombres se escribe
for(int i=0; i<nombres.length; i++)
{ System.out.println(nombres[i]);
}
Java verifica que el ndice no sea mayor o igual que
la dimensin del array, lo que facilita mucho el trabajo al programador.
Ejemplo (28): Programa que lee la temperatura de los
n ltimos das y calcula el promedio.
109
//Archivo: temperatura.java
import java.io.*;
public class temperatura
{
public static void main (String[] args)
throws IOException
{
// Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
String sdato; // variable para almacenar una lnea de texto
double s=0;//acumulador que suma las temperaturas
int tam;//tamao del arreglo
System.out.print("Cuantos dias?: ");
110
2.3.
ARRAYS MULTIDIMENSIONALES
Una matriz bidimensional puede tener varias filas, y
en cada fila no tiene por qu haber el mismo nmero de
elementos o columnas. Por ejemplo, podemos declarar e
inicializar la siguiente matriz bidimensional
double[][]
12},{13}};
matriz=
{{1,2,3,4},{5,6},{7,8,9,10,11,
La
tercera
fila
{7,8,9,10,11,12}
tiene
seis
elementos
111
Ejemplo(29): Creacin
112
de la matriz unidad
113
//Archivo: MatrizUnidadApp.java
public class MatrizUnidadApp
{
public static void main (String[] args)
{
double[][] mUnidad= new double[4][4];
for (int i=0; i < mUnidad.length; i++)
{
for (int j=0; j < mUnidad[i].length; j++)
{
if (i == j)
{
mUnidad[i][j]=1.0;
}
else
{
mUnidad[i][j] = 0.0;
}
}
}
for (int i=0; i < mUnidad.length; i++)
{
for (int j=0; j < mUnidad[i].length; j++)
{
System.out.print(mUnidad[i][j]+"\t");
}
System.out.println("");
}
2.4.
GESTIN DE CADENAS
Una cadena es una secuencia de caracteres. Para declarar e inicializar una array de caracteres (arreglos de
caracteres o cadena), utilice el siguiente formato:
char Cad[] = { 'a','b','c'};
la instruccin anterior permitir generar el siguiente
arreglo:
Cad[0] Cad[1] Cad[2]
'a'
114
'b'
'c'
Mg. ABRAHAM GAMARRA MORENO
115
cadena. Esta clase, llamada String es la representacin como objeto de una matriz de caracteres que no se
puede cambiar.
Hay una clase que la acompaa, llamada StringBuffer,
que se utiliza para crear cadenas que pueden ser manipuladas despus de ser creadas.
2.4.1. CONSTRUCTORES
Se pueden crear instancias de String con el
operador new.
String s = new String();
El ejemplo anterior creara una instancia de
String sin caracteres en ella. Para crear un
String inicializado con caracteres hay que
pasarle una matriz de char al constructor.
Veamos un ejemplo:
char chars[] = { 'a','b','c'};
String s = new String(chars);
// s es la cadena "abc"
Si se tiene una matriz de la que solo un rango nos interesa existe un constructor que
permite especificar el ndice de comienzo y
el nmero de caracteres a utilizar.
char chars[] = {'a','b','c','d','e','f'};
String s = new String(chars, 2, 3); // s es
la cadena "cde"
Tambin existen constructores para caracteres
ASCII (caracteres de 8 bits) frente a los caracteres Unicode de Java (caracteres de 16
bits).
Creacin de cadenas
Dado que los Strings son valores constantes,
Java incluye un atajo para un literal de cadena estndar, en el que un valor de cadena
se puede encerrar entre comillas dobles:
String s = "abad";
uno de los mtodos mas habituales que se utilizan en un String es length, que devuelve el
nmero de caracteres de una cadena:
String s = "abc";
System.out.println(s.length());//imprimira 3
Un punto interesante en Java es que se crea
una instancia de objeto para cada literal
String, por lo que se puede llamar a los mtodos directamente con una cadena entre comillas, como si fuera una referencia a objeto,
con este ejemplo se volvera a imprimir un 3:
String s = "abc";
System.out.println("abc".lenght());
Concatenacin de cadenas
El nico operador que utiliza Java es +, y en
los objetos String. El + acta como operador
de concatenacin en este caso en concreto para mejorar la legibilidad, por ser operacin
muy comn.
String s = "El tiene " + edad + " aos";
esta mucho ms claro que
String s = new StringBuffer("El tiene ")
.append (edad)
.append (" aos")
.toString();
que es lo que sucede cuando se ejecuta este
cdigo. append aade cosas al final de
PROGRAMACION CON JAVA 2
117
this.x = x;
this.y = y;
}
public String toString()
{
return "Punto[" + x + "," + y + "]";
}
class toStringDemo
{
public static void main(String args[])
Point p = new Point(10, 20);
System.out.println("p = " + p);
}
}
119
Tambin existe una funcin til llamada toCharArray, que devuelve una matriz de char
que contiene la cadena completa.
2.4.4. COMPARACIN
Si se desean comparar dos cadenas para ver si
son iguales, puede utilizar el mtodo equals
de String. Devolver true si el nico parmetro est compuesto de los mismos caracteres
que el objeto con el que se llama a equals.
Una forma alternativa de equals llamada
equalsIgnoreCase ignora si los caracteres de
las cadenas que se comparan estn en maysculas o minsculas.
La clase String ofrece un par de mtodos tiles que son versiones especializadas de
equals. El mtodo regionMatches se utiliza
para comparar una regin especfica que se
parte de una cadena con otra regin de otra
cadena. Hay dos variantes de regionMatches,
una le permite controlar si es importante la
diferenciacin entre maysculas/minsculas;
la otra asume que si lo es.
boolean regionMatches (int toffset,
otra, int ooffset, int longitud);
String
// si importa la diferencia
boolean
regionMatches
ignorarMaysc,int toffset, String
ooffset, int longitud);
(boolean
otra, int
// no importa la diferencia
En estas dos versiones de regionMatches, el
parmetro toffset indica el desplazamiento en
caracteres en el objeto String sobre el que
estamos llamando el mtodo. La cadena con la
que estamos comparando se llama otra, y el
desplazamiento dentro de esa cadena se llama
ooffset. Se comparan longitud caracteres de
las dos cadenas comenzando a partir de los
dos desplazamientos.
120
Igualdad
El mtodo equals y el operador = = hacen dos
pruebas completamente diferentes para la
igualdad. Mientras que el mtodo equals compara los caracteres contenidos en una String,
el operador = = compara dos referencias de
objeto para ver si se refieren a la misma
instancia.
Ordenacin
A menudo no basta con conocer si dos cadenas
son idnticas o no. Para aplicaciones de ordenacin, necesitamos conocer cul es menor
que, igual que o mayor que la siguiente. El
mtodo de String compareTo se puede utilizar
para determinar la ordenacin. Si el resultado entero de compareTo es negativo, la cadena
es menor que el parmetro, y si es positivo,
la cadena es mayor. Si compareTo devuelve 0,
entonces las dos cadenas son iguales. Ahora
ordenaremos una matriz de cadenas utilizando
compareTo para determinar el criterio de ordenacin mediante una Ordenacin en burbuja.
//archivo: SortString
class SortString
{
static String arr[] = { "Ahora", "es", "el ",
"momento", "de", "actuar"};
public static void main(String args[])
{
System.out.println("La cadena inicial es");
for (int j = 0; j < arr.length; j++)
System.out.print(arr[j]+" ");
System.out.println("\n");
System.out.println("La cadena final es");
for (int j = 0; j < arr.length; j++)
{
for (int i = j + 1; i < arr.length; i++)
{
if (arr[i].compareTo(arr[j]) < 0)
{
String t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
System.out.print(arr[j]+" ");
PROGRAMACION CON JAVA 2
121
}
System.out.println("\n");
Constructores
String()
123
String(byte[] bytes)
Mtodos
char charAt(int index)
index.
int compareTo(Object o)
Deprecated. This method does not properly convert characters into bytes. As of
JDK 1.1, the preferred way to do this is via the
the getBytes() method, which uses the platform's
default charset.
125
Tells whether or not this string matches the given regular expression.
boolean regionMatches(boolean ignoreCase, int toffset,
String other, int ooffset, int len)
Returns a new string resulting from replacing all occurrences of oldChar in this string
with newChar.
String replaceAll(String regex, String replacement)
127
String toLowerCase()
Returns a copy of the string, with leading and trailing whitespace omitted.
static String valueOf(boolean b)
129
CAPITULO THREE
MTODOS CREADOS POR EL USUARIO
La mayora de los programas tienen gran cantidad de lneas de
cdigo y son grandes por lo que deberamos de construirlo a
partir de piezas ms pequeas o mdulos; adems estos sern
manejados desde un programa principal.
Los mdulos de un programa en Java se llaman mtodos y clases. Los programas que se escriben en Java tienen mtodos
creados por el usuario y mtodos preempacados del lenguaje
que estn en la biblioteca de clases de Java (algunos de estos mtodos se mostraron en la clase Integer, Float, Math,
String, etc).
Los mtodos permiten al programador modularizar sus programas
y reutilizar su cdigo. Cuando un mtodo esta creado y se
tiene acceso a l, podremos ejecutarlo desde varios puntos de
un programa con slo invocarlo.
Los mtodos en la Programacin Orientada a Objetos suelen conocerse tambin como funciones miembro. Usted debe notar que
las funciones se utilizan tambin en el Lenguaje C++. En captulos posteriores utilizaremos ls mtodos con la denominacin de funciones miembro.
131
parm1,
La primera forma de devolver el control, es cuando se llega a la llave que cierra el final del
cuerpo de la funcin; en este caso no se utiliza
return.
132
return (expresin);
return ;
Por supuesto que la ltima forma no devuelve ningn valor; pero el control regresa de inmediato
al punto en el que se invoc el mtodo.
Para llamar a un mtodo se escribe
retorno=nombreMtodo (arg1, arg2, arg3);
// Archivo Hipotenusa.java
import java.io.*;
class Hipotenusa
{
public static void main (String[] args)
throws IOException
{
PROGRAMACION CON JAVA 2
133
134
}
public static void hipotenusa(float a, float b)
{ //definicin de variables locales
float h;
//sentencias internas del mtodo
h=(float) Math.sqrt(a*a+b*b);
135
Ejemplo (33): Uso de un mtodo para simular el operador AND. Notese el uso de throws IOException en los
mtodos main y leer_vector, para evitar de este modo
utilizar try . . . catch. Observe adems como se utiliza el tipo de dato int[] en el mtodo and, para devolver un arreglo desde este mtodo.
// Archivo vectores.java
import java.io.*;
class vectores
{
public static void main (String[] args)
throws IOException
{
int [] v1= new int [4];//primer vector
int [] v2= new int [4];//segundo vector
int [] vs= new int [4];//vector que almacena el resultado
leer_vector(v1);
escribir_vector(v1);
leer_vector(v2);
escribir_vector(v2);
vs=and(v1,v2);
System.out.println("Contenido del vector AND:");
escribir_vector(vs);
}//fin de leer_vector
136
137
CAPITULO CUATRO
CLASES Y PROGRAMACION ORIENTADO A
OBJETOS
Cuando se escribe un programa en un lenguaje orientado a objetos, definimos una plantilla o clase que describe las caractersticas y el comportamiento de un conjunto de objetos
similares. La clase automvil describe las caractersticas
comunes de todos los automviles: sus atributos y su comportamiento (fig. 4.1). Los atributos o propiedades se refieren
a la marca o fabricante, el color, las dimensiones, si tienen
dos, tres, cuatro o ms puertas, la potencia, si utiliza como
combustible la gasolina o gasoil, etc. El comportamiento se
refiere a la posibilidad de desplazarse por una carretera,
frenar, acelerar, cambiar de marcha, girar, etc.
Luego, tenemos automviles concretos, por ejemplo el automvil propio de una determinada marca, color, potencia, etc, el
automvil del vecino de otra marca, de otro color, etc, el
automvil de un amigo, etc.
Una clase es por tanto una plantilla implementada en software
que describe un conjunto de objetos con atributos y comportamiento similares.
Una instancia u objeto de una clase es una representacin
concreta y especfica de una clase y que reside en la memoria
del ordenador.
PROGRAMACION CON JAVA 2
139
4.1.
ATRIBUTOS
Los atributos son las caractersticas individuales que
diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables.
Las variables de instancia tambin denominados miembros dato, son declaradas en la clase pero sus valores
son fijados y cambiados en el objeto.
Adems de las variables de instancia hay variables de
clase, las cuales se aplican a la clase y a todas sus
instancias. Por ejemplo, el nmero de ruedas de un automvil es el mismo cuatro, para todos los automviles.
4.2.
COMPORTAMIENTO
El comportamiento de los objetos de una clase se implementa mediante funciones miembro o mtodos. Un mtodo es un conjunto de instrucciones que realizan una
140
4.3.
141
class Rectangulo
{
int x;
int y;
int ancho;
int alto;
//faltan las funciones miembro
}
Entre las llaves de apertura y cierre se coloca la definicin de la funcin, tipo indica
el tipo de dato que puede ser predefinido
int, double, etc, o definido por el usuario,
una clase cualquiera.
142
143
void funcion(....)
{
//sentencias...
if(condicion) return;
//sentencias..
}
Una funcin puede devolver un valor (un tipo
de dato primitivo o un objeto).
double funcion(....)
{
double suma=0.0;
//sentencias...
return suma;
}
Cualquier variable declarada dentro de la
funcin tiene una vida temporal, existiendo
en memoria, mientras la funcin est activa.
Se trata de variables locales a la funcin.
Por ejemplo:
void nombreFuncion(int parm){
//...
int i=5;
//...
}
La variable parm, existe desde el comienzo
hasta el final de la funcin. La variable local i, existe desde el punto de su declaracin hasta el final del bloque de la funcin.
Se ha de tener en cuenta que las funciones
miembro tienen acceso a los miembros dato,
por tanto, es importante en el diseo de una
clase decidir qu variables son miembros dato, qu variables son locales a las funciones
miembro, y qu valores les pasamos a dichas
funciones.
Hemos definido los atributos o miembros dato
de la clase Rectangulo, ahora le vamos aadir
un comportamiento: los objetos de la clase
Rectangulo o rectngulos sabrn calcular su
144
145
}
}
146
147
Este constructor crea un rectngulo de dimensiones nulas situado en el punto (0, 0),
class Rectangulo{
int x;
int y;
int ancho;
int alto;
Rectangulo(){
x=0;
y=0;
ancho=0;
alto=0;
}
}
Con estas porciones de cdigo definimos la
clase, y la guardamos en un archivo que tenga
el mismo nombre que la clase Rectangulo y con
extensin .java.
public class Rectangulo
{
int x;
int y;
int ancho;
int alto;
public Rectangulo()
{
x=0;
y=0;
ancho=0;
alto=0;
}
public Rectangulo(int x1, int y1, int w, int h)
{
x=x1;
y=y1;
ancho=w;
alto=h;
}
public Rectangulo(int w, int h)
{
x=0;
y=0;
ancho=w;
alto=h;
}
148
int calcularArea()
{
return (ancho*alto);
}
void desplazar(int dx, int dy)
{
x+=dx;
y+=dy;
}
boolean estaDentro(int x1, int y1)
{
if((x1>x)&&(x1<x+ancho)&&(y1>y)&&(y1<y+ancho))
{
return true;
}
return false;
}
}
4.4.
LOS OBJETOS
Para crear un objeto de una clase se usa la palabra
reservada new.
Por ejemplo,
Rectangulo rect1=new Rectangulo(10, 20, 40, 80);
new reserva espacio en memoria para los miembros dato
y devuelve una referencia que se guarda en la variable
rect1 del tipo Rectangulo que denominamos ahora objeto. Dicha sentencia, crea un objeto denominado rect1
de la clase Rectangulo llamando al segundo constructor
en el listado. El rectngulo estar situado en el punto de coordenadas x=10, y=20; tendr una anchura de
ancho=40 y una altura de alto=80.
Rectangulo rect2=new Rectangulo(40, 80);
Crea un objeto denominado rect2 de la clase Rectangulo
llamando al tercer constructor, dicho rectngulo estar situado en el punto de coordenadas x=0, y=0; y tendr una anchura de ancho=40 y una altura de alto=80.
Rectangulo rect3=new Rectangulo();
Crea un objeto denominado rect3 de la clase Rectangulo
llamando al primer constructor, dicho rectngulo esta-
149
r situado en el punto de coordenadas x=0, y=0; y tendr una anchura de ancho=0 y una altura de alto=0.
150
if(rect1.estaDentro(20,30))
{
System.out.println("El punto est dentro
del rectngulo");
}else
{
System.out.println("El punto est fuera del
rectngulo");
}
rect1.dentro() devuelve true si el punto (20,
30) que se le pasa a dicha funcin miembro
est en el interior del rectngulo rect1,
ejecutndose la primera sentencia, en caso
contrario se ejecuta la segunda.
Como veremos ms adelante no siempre es posible acceder a los miembros, si establecemos
controles de acceso a los mismos.
public class RectanguloApp1
{
public static void main(String[] args)
{
Rectangulo rect1=new Rectangulo(10, 20, 40, 80);
Rectangulo rect2=new Rectangulo(40, 80);
Rectangulo rect3=new Rectangulo();
int medidaArea=rect1.calcularArea();
System.out.println("El
rea
del
rectngulo
"+medidaArea);
es
rect2.desplazar(10, 20);
if(rect1.estaDentro(20,30))
{
System.out.println("El punto est dentro del rectngulo");
}
else
{
System.out.println("El punto est fuera del rectngulo");
}
}//fin main
}
4.5.
LA VIDA DE UN OBJETO
En el lenguaje C++, los objetos que se crean con new
se han de eliminar con delete, new reserva espacio en
memoria para el objeto y delete libera dicha memoria.
151
153
__________________________________
//archivo: RectanguloApp1.java
public class RectanguloApp1
{
public static void main(String[] args)
{
Rectangulo rect1=new Rectangulo(10, 20, 40, 80);
Rectangulo rect2=new Rectangulo(40, 80);
Rectangulo rect3=new Rectangulo();
int medidaArea=rect1.calcularArea();
System.out.println("El
area
del
rectangulo
"+medidaArea);
rect2.desplazar(10, 20);
154
es
System.out.println("Las
nuevas
rectangulo 2 es: ");
System.out.println("x= "+ rect2.x+"
coordenadas
del
y="+rect2.y);
if(rect1.estaDentro(20,30))
{
System.out.println("El punto (20,30) esta dentro
del rectangulo 1");
}
else
{
System.out.println("El punto (20,30) esta fuera
del rectangulo 1");
}
}//fin main
}
4.6.
IDENTIFICADORES
Cmo se escriben los nombres de las variables, de las
clases, de las funciones, etc., es un asunto muy importante de cara a la comprensin y el mantenimiento
de cdigo. En la introduccin a los fundamentos del
lenguaje Java hemos tratado ya de los identificadores.
El cdigo debe de ser tanto ms fcil de leer y de entender como sea posible. Alguien que lea el cdigo,
incluso despus de cierto tiempo, debe ser capaz de
entender lo que hace a primera vista, aunque los detalles internos, es decir, cmo lo hace, precise un estudio detallado.
Vemos primero un ejemplo que muestra un cdigo poco
legible y por tanto, muy difcil de mantener
public class Cuen
{
private int ba;
public void dep(int i)
{
ba+=i;
}
155
4.7.
MODIFICADORES DE ACCESO A LOS MIEMBROS
DE UNA CLASE
Una faceta importante de los lenguajes de Programacin
Orientada a Objetos se denomina encapsulacin. El acceso a los miembros de una clase est controlado. Para
usar una clase, solamente necesitamos saber que funciones miembro se pueden llamar y a qu datos podemos
acceder, no necesitamos saber como est hecha la cla156
157
}
158
// Archivo LineaAppl.java
import java.io.*;
class LineaAppl
{
public static void main (String[] args)
{
//Creacin de un objeto recta: r1
Linea r1=new Linea();
// uso del objeto r1
//como el modificador de acceso es package
//y la clase Linea esta en el mismo directorio
//entonces main() puede utilizar los mtodos
//leer() y escribir()
r1.leer();
r1.escribir();
159
// Archivo Linea1Appl.java
import java.io.*;
class Linea1Appl
{
public static void main (String[] args)
{
//Creacin de un objeto recta: r1
Linea1 r1=new Linea1();
// uso del objeto r1
//como el modificador de acceso de los metodos
//de la clase Linea es privado
//entonces main() no puede utilizar los mtodos
//leer() y escribir()
r1.leer();
r1.escribir();
161
{
// Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
String sdato; // variable para almacenar una lnea de texto
//lectura
System.out.println("Introduzca 1er punto: ");
System.out.print("x1: ");
sdato = flujoE.readLine(); // leer una lnea de texto
x1=Integer.parseInt(sdato);//convierte cadena
System.out.print("y1: ");
sdato = flujoE.readLine(); // leer una lnea de texto
y1=Integer.parseInt(sdato);//convierte cadena
// Archivo Linea2Appl.java
import java.io.*;
class Linea2Appl
{
public static void main (String[] args)
{
//Creacin de un objeto recta: r1
Linea2 r1=new Linea2();
// uso del objeto r1
//como el modificador de acceso de los mtodos
//de la clase Linea es public
//entonces main() puede utilizar los mtodos
//leer() y escribir()
162
r1.leer();
r1.escribir();
163
// Archivo Linea3Appl.java
import java.io.*;
class Linea3Appl
{
public static void main (String[] args)
{
//Creacin de un objeto recta: r1
Linea3 r1=new Linea3();
// uso del objeto r1
//como el modificador de acceso de los datos
//de la clase Linea es public
//entonces main() puede accesar a los datos
//sin necesidad de utilizar sus mtodos
System.out.println("Valores inciales de la recta:");
r1.x1=10;r1.y1=11;
r1.x2=100;r1.y2=101;
}
164
System.out.println("x1="+r1.x1+" y1="+r1.y1);
System.out.println("x2="+r1.x2+" y2="+r1.y2);
//como el modificador de acceso de los mtodos
//de la clase Linea es public
//entonces main() puede accesar a
//leer() y escribir(), para modificar sus datos
//miembro
System.out.println("Valores para modificar la recta:");
r1.leer();
r1.escribir();
4.8.
hora, min ,
//archivo tiempo.java
import java.io.*;
class tiempo
PROGRAMACION CON JAVA 2
165
//archivo: exa2p120032App.java
import java.io.*;
class exa2p120032App
{
public static void main (String[] args)
throws IOException
{ tiempo t1=new tiempo();tiempo t2=new tiempo();
tiempo trans=new tiempo();
System.out.println("Ingrese tiempo :");
t1.leer_tiempo(); t1.escribir_tiempo();
System.out.println("Ingrese nuevo tiempo :");
t2.leer_tiempo(); t2.escribir_tiempo();
167
complejo
es:
"+real+"
_________________________________________
// Archivo ComplejoAppl.java
import java.io.*;
class ComplejoAppl
{
public static void main (String[] args)
throws IOException
{
}
168
}
Mg. ABRAHAM GAMARRA MORENO
//lectura
System.out.print("Introduzca numerador: ");
sdato = flujoE.readLine(); // leer una lnea de texto
n=Integer.parseInt(sdato);//convierte cadena
System.out.print("Introduzca denominador: ");
sdato = flujoE.readLine(); // leer una lnea de texto
d=Integer.parseInt(sdato);//convierte cadena
}
catch (IOException ignorada)
{}
169
//archivo: quebradoAppl.java
public class quebradoAppl
{
public static void main(String[] args)
{
quebrado q1=new quebrado();
quebrado q2=new quebrado();
quebrado q=new quebrado();
q1.leer();
q1.escribir();
q2.leer();
q2.escribir();
System.out.println("La suma es: ");
q=q1.sumar(q2);
q=q.simplificar(q);
q.escribir();
}
170
}//fin main
// Archivo CuentaAppl.java
import java.io.*;
class CuentaAppl
{
public static void main (String[] args)
PROGRAMACION CON JAVA 2
171
throws IOException
{
c.retiro(ret);
c.escribir();
// Archivo: Cuenta1.java
import java.io.*;
class Cuenta1
{
private float saldo;
public void asignar() throws IOException
{
// Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
173
// Archivo Cuenta1Appl.java
import java.io.*;
class Cuenta1Appl
{
public static void main (String[] args)
throws IOException
{
//Creacin de un objeto Cuenta1
Cuenta1 c=new Cuenta1();
c.asignar();
c.escribir();
c.deposito();
c.escribir();
c.retiro();
c.escribir();
}
catch (IOException ignorada)
{}
175
// Archivo Cuenta2Appl.java
import java.io.*;
class Cuenta2Appl
{
public static void main (String[] args)
{
c.retiro();
c.escribir();
return u;
177
//archivo: ConjuntoAppl.java
public class ConjuntoAppl
{
public static void main(String[] args)
{
Conjunto c=new Conjunto();
Conjunto c1=new Conjunto();
Conjunto c2=new Conjunto();
c1.leer();
c1.escribir();
c2.leer();
c2.escribir();
}//fin main
System.out.println("Conjunto union");
c=c1.union(c2);
c.escribir();
System.out.println("}");
return u;
179
//archivo: Conjunto1Appl.java
public class Conjunto1Appl
{
public static void main(String[] args)
{
Conjunto1 c=new Conjunto1();
Conjunto1 c1=new Conjunto1();
Conjunto1 c2=new Conjunto1();
c1.leer();
c1.escribir();
c2.leer();
c2.escribir();
180
System.out.println("Conjunto union");
c=c.union(c1,c2);
c.escribir();
}//fin main
La clase tiene los siguientes datos miembros: valor[ ]: arreglo que almacena los dgitos del nmero.
el
contenido
del
dato
//archivo enterazo.java
import java.io.*;
class enterazo
{ //arreglo que almacena los dgitos de un nmero
//consideremos tres cifras
private int[] valor;
public void asignar() throws IOException
{ // Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
String sdato; // variable para almacenar una lnea de texto
valor= new int[3];
System.out.println("Ingrese cifra por cifra del numero: ");
for (int i=0;i<valor.length;i++)
{
sdato = flujoE.readLine(); // leer una lnea de texto
valor[i]=Integer.parseInt(sdato);//convierte cadena
}
PROGRAMACION CON JAVA 2
181
}
public void mostrar()
{
for (int i=0;i<valor.length;i++)
System.out.print(valor[i]);
System.out.println("");
}
public enterazo multiplicar(enterazo ent2)
{ int tam=valor.length+ent2.valor.length;
int[]n1=new int[tam];
int[]n2=new int[tam];
int[]n3=new int[tam];
enterazo mult=new enterazo();
mult.valor= new int[tam];
int in;//contador para 1er, 2do y 3er termino de la suma
int j;//cifra derecha del 1er enterazo
int i;//cifra derecha del 1er enterazo
int aux,acarreo=0;
// Recorre las cifras del segundo nmero y
// lo almacena en 1er trmino suma n1[]
in=tam-1;//derecha del 1er trmino de la suma
j=ent2.valor.length-1;// cifra derecha 2do enterazo
for(i=valor.length-1;i>=0;i--)
{ aux=valor[i]*ent2.valor[j]+acarreo;
n1[in]=aux%10;
acarreo=aux/10;
in--;
}
n1[in]=acarreo;
acarreo=0;
// Recorre las cifras del segundo nmero y
// lo almacena en 2do trmino suma n2[]
in=tam-2;//derecha del 2do trmino de la suma
j=ent2.valor.length-2;// cifra 2do enterazo
for(i=valor.length-1;i>=0;i--)
{ aux=valor[i]*ent2.valor[j]+acarreo;
n2[in]=aux%10;
acarreo=aux/10;
in--;
}
n2[in]=acarreo;
acarreo=0;
// Recorre las cifras del segundo nmero y
// lo almacena en 3er trmino suma n3[]
in=tam-3;//derecha del 3er trmino de la suma
j=ent2.valor.length-3;// cifra derecha 2do enterazo
182
for(i=valor.length-1;i>=0;i--)
{ aux=valor[i]*ent2.valor[j]+acarreo;
n3[in]=aux%10;
acarreo=aux/10;
in--;
}
n3[in]=acarreo;
acarreo=0;
//suma de los tres trminos
for(i=n1.length-1;i>=0;i--)
{ aux=n1[i]+n2[i]+n3[i]+acarreo;
mult.valor[i]=aux%10;
acarreo=aux/10;
}
return mult;
//archivo: exa2p220032App.java
import java.io.*;
class exa2p220032App
{
public static void main (String[] args)
throws IOException
{ enterazo e1=new enterazo();enterazo e2=new enterazo();
enterazo em=new enterazo();
e1.asignar();
System.out.println("primer numero: ");e1.mostrar();
e2.asignar();
System.out.println("segundo numero: ");e2.mostrar();
em=e1.multiplicar(e2);
System.out.println("multiplicacion: ");em.mostrar();
183
4.9.
SOBRECARGA DE UN
MTODO
//lectura
System.out.print("Introduzca numerador: ");
sdato = flujoE.readLine(); // leer una lnea de texto
n=Integer.parseInt(sdato);//convierte cadena
System.out.print("Introduzca denominador: ");
sdato = flujoE.readLine(); // leer una lnea de texto
d=Integer.parseInt(sdato);//convierte cadena
}
catch (IOException ignorada)
{}
System.out.println(n);
185
//archivo: quebrado1Appl.java
public class quebrado1Appl
{
public static void main(String[] args)
{
quebrado1 q1=new quebrado1();
quebrado1 q2=new quebrado1();
quebrado1 q3=new quebrado1();
quebrado1 q=new quebrado1();
q1.leer();
q1.escribir();
q2.leer();
q2.escribir();
q3.leer();
q3.escribir();
System.out.println("La suma de los dos primeros es: ");
q=q.sumar(q1,q2);
q=q.simplificar(q);
q.escribir();
System.out.println("La suma de los tres primeros es: ");
q=q.sumar(q1,q2,q3);
q=q.simplificar(q);
q.escribir();
186
}//fin main
4.10.
REFERENCIA this
Cada objeto mantiene su propia copia de los atributos
pero no de los mtodos de su clase, de los cuales slo
existe una copia para todos los objetos de esa clase.
Esto es, cada objeto almacena sus propios datos, pero
para acceder y operar con ellos, todos comparten los
mismos mtodos definidos en su clase. Por lo tanto,
para que un mtodo conozca la identidad del objeto
particular para el que ha sido invocado, Java proporciona una referencia al objeto denominada this.
Ejemplo: Clase Circulo (Parcialmente definida)
public class Circulo {
// Atributos
private double x, y;
private double r;
187
double a;
a = c.area();
188
4.10.1.
TOR
4.10.2.
189
Circulo (Circulo c) {
c.x;
c.y;
c.r;
public
x =
y =
r =
}
Circulo () {
0.0;
0.0;
1.0;
//Mtodos
public double circunferencia() {
return 2*3.14159*r;
}
190
Circulo (Circulo c)
public
{
x =
y =
r =
}
Circulo ()
c.x;
c.y;
c.r;
0.0;
0.0;
1.0;
//Mtodos
public double circunferencia()
{
return 2*3.14159*r;
}
191
// Archivo CirculoApp.java
import java.io.*;
class CirculoApp
{
public static void main (String[] args)
{
Circulo c1=new Circulo();
System.out.print("Circunferencia del circulo 1: ");
System.out.println(c1.circunferencia());
System.out.print("Area del circulo 1: ");
System.out.println(c1.area());
Circulo c2=new Circulo(2,5,100);
System.out.print("Circunferencia del circulo 2: ");
System.out.println(c2.circunferencia());
System.out.print("Area del circulo 2: ");
System.out.println(c2.area());
4.10.3.
Hay un uso especializado para la palabra clave this que toma mayor importancia cuando una
clase tiene mltiple constructores, y es que
un constructor puede ser usado desde otro
constructor de la misma clase. Vamos a rescribir el cdigo anterior usando esta tcnica:
// Atributos
private double x, y, r;
// Nuestro constructor anterior (1)
public Circulo1 (double x, double y, double r)
{
this.x = x;
this.y = y;
this.r = r;
}
// Ms constructores !!!
public Circulo1 (double r)
{
this (0.0, 0.0, r); //Estamos llamando a (1)
}
public Circulo1 (Circulo1 c)
{
this (c.x, c.y, c.r); //Estamos llamando a (1)
}
public Circulo1 ()
{
this (0.0, 0.0, 1.0); //Estamos llamando a (1)
}
//Mtodos
public double circunferencia()
{
return 2*3.14159*r;
}
193
194
// Archivo Circulo1App.java
import java.io.*;
class Circulo1App
{
public static void main (String[] args)
{
Circulo c1=new Circulo();
System.out.print("Circunferencia del circulo 1: ");
System.out.println(c1.circunferencia());
System.out.print("Area del circulo 1: ");
System.out.println(c1.area());
Circulo c2=new Circulo(2,5,100);
System.out.print("Circunferencia del circulo 2: ");
System.out.println(c2.circunferencia());
System.out.print("Area del circulo 2: ");
System.out.println(c2.area());
195
y se desea utilizar no solamente un objeto persona sino un conjunto de objetos persona; para lograr este
objetivo, debemos definir un arreglo de objetos de la
siguiente forma:
//declara y crea el arreglo de objetos
Persona[] p=new Persona[5];
Persona[0]
Persona[1]
Persona[2]
Persona[3]
Persona[4]
p[i]=new Persona();
p[i].leer();
p[i].escribir();
}
catch (IOException ignorada)
{}
: "+nombre);
: "+sueldo);
197
//archivo: PersonaaApp.java
import java.io.*;
class PersonaApp
{
public static void main (String[] args)
throws IOException
{
// Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
String sdato; // variable para almacenar una lnea de texto
int n;
//lectura de tamao del arreglo
System.out.print("# de personas: ");
sdato = flujoE.readLine(); // leer una lnea de texto
n=Integer.parseInt(sdato);//convierte cadena
//declara y crea el arreglo de objetos
Persona[] p=new Persona[n];
//otras variables
int i;//contador
float prom;//promedio de los sueldos
float sueldos=0;//acumulador de los sueldos
//inicializacin de objetos
for (i=0;i<p.length;i++)
p[i]=new Persona();
//lectura de datos
System.out.println("Ingrese datos de las personas: ");
for (i=0;i<p.length;i++)
p[i].leer();
//Impresin de datos
System.out.println("Datos de las personas: ");
for (i=0;i<p.length;i++)
{
System.out.println("Persona No. "+i);
p[i].escribir();
sueldos+=p[i].obtener_sueldo();
}
198
199
System.out.println
("Nmero
Circulo2.numCirculos);
de
crculos
creados:
"
201
// Archivo Circulo2App.java
import java.io.*;
class Circulo2App
{
public static void main (String[] args)
throws IOException
{
Circulo2 c1=new Circulo2();
System.out.print("Circunferencia del circulo 1: ");
System.out.println(c1.circunferencia());
System.out.print("Area del circulo 1: ");
System.out.println(c1.area());
Circulo2 c2=new Circulo2(2,5,100);
System.out.print("Circunferencia del circulo 2: ");
System.out.println(c2.circunferencia());
System.out.print("Area del circulo 2: ");
System.out.println(c2.area());
Circulo2 c3=new Circulo2(10);
System.out.print("Circunferencia del circulo 3: ");
System.out.println(c3.circunferencia());
System.out.print("Area del circulo 3: ");
System.out.println(c3.area());
System.out.print("El numero de circulos creados es: ");
System.out.println( Circulo2.numCirculos);
}
4.15.
Utilizar la clase libro que tiene los datos miembro titulo, autor y precio. Adems la clase libro tiene los mtodos: void leer_datos ( ), y
void escribir_total_compra ( ).
El mtodo void
leer_datos ( ) permite leer los datos miembros de
los libros y la vez calcula el total de la compra. El mtodo
void escribir_total_compra ( )
203
Debe utilizar variables de clase (variables estticas), las que usted considere conveniente, para
almacenar la cantidad de libros comprados, as
como para calcular el total de la compra.(5
PTOS).
//archivo: Libro.java
import java.io.*;
class Libro
{
//variables de clase
static int cantidad;
static float total=0;
//datos miembro
private String titulo;
private float precio;
//funciones miembro
public void leer_datos()
{
try
{
// Definir un flujo de caracteres de entrada: flujoE
InputStreamReader
isr
=
new
InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
texto
204
// Archivo LibroAppl.java
class LibroAppl
{
public static void main (String[] args)
{
//Creacin de los objetos libro: li1,li2,li3
Libro li1=new Libro();
Libro li2=new Libro();
Libro li3=new Libro();
System.out.println("Ingrese datos del primer libro");
li1.leer_datos();
System.out.println("Ingrese datos del segundo libro");
li2.leer_datos();
System.out.println("Ingrese datos del tercer libro");
li3.leer_datos();
//escribe el total
//puede utilizar cualquiera de los objetos
li1.escribir_total_compra();
205
Los mtodos de clase son lo ms parecido a mtodos globales. Como a ellos se hacen referencia a
travs de la clase, no hay peligro de conflicto
de nombres.
206
//....
207
Circulo3 (double r)
{
this (0.0, 0.0, r);
}
public void escribir()
{
System.out.println("x= "+x+" y= "+y+" r= "+r);
}
//Mtodos:
//MTODO DE INSTANCIA. DEVUELVE EL MAYOR DE LOS DOS CRCULOS
public Circulo3 elMayor (Circulo3 c)
{
if (c.r > r)
return c;
else
return this;
}
//MTODO DE CLASE. DEVUELVE EL MAYOR DE LOS DOS CRCULOS
public static Circulo3 elMayor (Circulo3 a, Circulo3 b)
{
if (a.r > b.r)
return a;
else
return b;
}
}
// Archivo Circulo3App.java
import java.io.*;
class Circulo3App
{
public static void main (String[] args)
throws IOException
{
Circulo3 a=new Circulo3(50);
System.out.println("primer circulo:");
a.escribir();
Circulo3 b=new Circulo3(100);
System.out.println("segundo circulo:");
b.escribir();
System.out.println("Utilizando el metodo
tiene:");
Circulo3 c = a.elMayor(b);
System.out.println("Circulo mayor:");
c.escribir();
208
de
instancia
se
El producto de las dos matrices da lugar a los siguientes sistemas de cuatro ecuaciones con cuatro incgnitas. Los trminos independientes bij son todos
ceros
excepto
los
de
la
diagonal
principal
b00=b11=b22=b33=1.
Primera columna:
PROGRAMACION CON JAVA 2
209
Segunda columna:
Tercera columna
Cuarta columna
Para el clculo de la matriz inversa, deberemos transformar la matriz a, los trminos independientes b (cada una de las columnas de la matriz unidad), y calcular las n2 incgnitas x.
La matriz de los trminos independientes b es la matriz unidad, cuyos elementos son todos cero, excepto
los de la diagonal principal que son unos.
for(int i=0; i<n; i++){
b[i][i]=1.0;
}
210
El cdigo de la transformacin de los elementos de la matriz es el mismo que nos sirvi para calcular el
determinante de una matriz cuadrada. Le aadimos el cdigo de la transformacin de los trminos
independientes ( a la derecha en las frmulas que siguen) para cada uno de los cuatro sistemas de ecuaciones
s=0, 1, 2, 3
k=0
k=1
k=2
for(int k=0; k<n-1; k++){
for(int i=k+1; i<n; i++){
//trminos independientes
for(int s=0; s<n; s++){
b[i][s]-=a[i][k]*b[k][s]/a[k][k];
}
//elementos de la matriz
for(int j=k+1; j<n; j++){
a[i][j]-=a[i][k]*a[k][j]/a[k][k];
}
}
}
211
//elementos de la matriz
for(int j=k+1; j<n; j++)
{
a[i][j]-=a[i][k]*a[k][j]/a[k][k];
}
}
}
//clculo de las incgnitas, elementos de la matriz inversa
for(int s=0; s<n; s++)
{
c[n-1][s]=b[n-1][s]/a[n-1][n-1];
for(int i=n-2; i>=0; i--)
{
c[i][s]=b[i][s]/a[i][i];
for(int k=n-1; k>i; k--)
{
c[i][s]-=a[i][k]*c[k][s]/a[i][i];
}
}
}
return c;
}
public static void mostrar(double m[][])
{
System.out.println("\n\n");
for (int i=0; i < m.length; i++)
{
for (int j=0; j <m[i].length; j++)
{
System.out.print(m[i][j]+"\t");
}
System.out.println("");
}
System.out.println("\n\n");
}
}
Archivo MatrizAppl.java
class MatrizAppl
{
public static void main (String[] args)
{
double [][] m={{2,1,-3},
{-1,3,2},
{3,1,-3}
};
double [][] m1= new double [3][3];
PROGRAMACION CON JAVA 2
213
System.out.println("Matriz original");
Matriz.mostrar(m);
System.out.println("Matriz inversa");
m1=Matriz.inversa(m);
Matriz.mostrar(m1);
}
}
// b referencia a null
215
if ( b == null )
System.out.println("El Circulo 'b' NO existe !");
216
4.19. HERENCIA
La herencia es una propiedad esencial de la Programacin Orientada a Objetos que consiste en la creacin
de nuevas clases a partir de otras ya existentes. Este
trmino ha sido prestado de la Biologa donde afirmamos que un nio tiene la cara de su padre, que ha
heredado ciertas facetas fsicas o del comportamiento
de sus progenitores.
La herencia es la caracterstica fundamental que distingue un lenguaje orientado a objetos, como el C++ o
Java, de otro convencional como C, BASIC, etc. Java
permite heredar a las clases caractersticas y conductas de una o varias clases denominadas base. Las clases que heredan de clases base se denominan derivadas,
estas a su vez pueden ser clases bases para otras clases derivadas. Se establece as una clasificacin jerrquica, similar a la existente en Biologa con los
animales y las plantas.
PROGRAMACION CON JAVA 2
217
Automviles
Camionetas
218
Autos de
carrera
Autos de calle
Cada subclase hereda el estado (en la forma de declaracin de atributos) de la superclase. Las camionetas,
los autos de carrera y los autos de calle comparten
algunos de esos estados: tipo de ruedas, color del
chasis, velocidad mxima, velocidad actual, cantidad
de marchas, etc.
Cada subclase tambin hereda los mtodos de su superclase. Las camionetas, los autos de carrera y los autos de calle comparten algunos de los comportamientos:
cambiarDeMarcha, acelerar, frenar, etc..
Sin embargo, las subclases (clase derivada) no estn
limitadas a los estados y comportamientos heredados de
la superclase (clase base). Las subclases pueden agregar atributos y mtodos a los heredados de la superclase. Por ejemplo, las Camionetas pueden tener cpulas, los AutosDeCarreras pueden tener una marcha ms y
los AutosDeCalle pueden ser cups.
Las subclases tambin pueden redefinir mtodos heredados y proveer implementaciones especializadas para
esos mtodos. Por ejemplo, si AutosDeCarrera posee una
marcha ms se puede redefinir el mtodo cambiarDeMarcha para que el corredor pueda utilizar ese cambio extra.
No se est limitado a una sola capa de herencia. El
rbol de herencia, o jerarqua de clases, puede ser
tan profundo como sea necesario. Los mtodos y los
atributos se heredan bajando los niveles. En general,
las clases que aparecen ms abajo en la jerarqua de
clases, poseen un comportamiento ms especializado.
La herencia ofrece una ventaja importante, permite la
reutilizacin del cdigo. Una vez que una clase ha sido depurada y probada, el cdigo fuente de dicha clase
no necesita modificarse. Su funcionalidad se puede
cambiar derivando una nueva clase que herede la funcionalidad de la clase base y le aada otros comportamientos. Reutilizando el cdigo existente, el programador ahorra tiempo y dinero, ya que solamente tiene
que verificar la nueva conducta que proporciona la
clase derivada.
La programacin en los entornos grficos, en particular Windows, con el lenguaje C++, es un ejemplo ilustrativo. Los compiladores como los de Borland y Microsoft proporcionan libreras cuyas clases describen el
PROGRAMACION CON JAVA 2
219
aspecto y la conducta de las ventanas, controles, mens, etc. Una de estas clases denominada TWindow describe el aspecto y la conducta de una ventana, tiene
una funcin miembro denominada Paint, que no dibuja
nada en el rea de trabajo de la misma. Definiendo una
clase derivada de TWindow, podemos redefinir en ella
la funcin Paint para que dibuje una figura. Aprovechamos de este modo la ingente cantidad y complejidad
del cdigo necesario para crear una ventana en un entorno grfico. Solamente, tendremos que aadir en la
clase derivada el cdigo necesario para dibujar un
rectngulo, una elipse, etc.
En el lenguaje Java, todas las clases derivan implcitamente de la clase base Object, por lo que heredan
las funciones miembro definidas en dicha clase. Las
clases derivadas pueden redefinir algunas de estas
funciones miembro como toString y definir otras nuevas.
Para crear un applet, solamente tenemos que definir
una clase derivada de la clase base Applet, redefinir
ciertas funciones como init o paint, o definir otras
como las respuestas a las acciones sobre los controles.
220
Las funciones miembros, adems del constructor sern las siguientes: la funcin mostrar
que simula una ventana en un entorno grfico,
aqu solamente nos muestra la posicin y las
dimensiones de la ventana.
{
System.out.println("posicin
: x="+x+", y="+y);
System.out.println("dimensiones
:
w="+ancho+",
h="+alto);
}
221
class Ventana
{
protected int x;
protected int y;
protected int ancho;
protected int alto;
public Ventana(int x, int y, int ancho, int alto) {
this.x=x;
this.y=y;
this.ancho=ancho;
this.alto=alto;
}
public void mostrar(){
System.out.println("posicin
: x="+x+", y="+y);
System.out.println("dimensiones
:
w="+ancho+",
h="+alto);
}
public void cambiarDimensiones(int dw, int dh){
ancho+=dw;
alto+=dh;
}
}
222
223
Redefine la funcin miembro mostrar para mostrar una ventana con un ttulo.
public void mostrar()
{
super.mostrar();
System.out.println("titulo
}
: "+titulo);
: "+titulo);
La
definicin
de
la
clase
VentanaTitulo, ser la siguiente.
derivada
225
int
int
int
int
x;
y;
ancho;
alto;
//Archivo: VentanaTitulo.java
class VentanaTitulo extends Ventana
{
protected String titulo;
public VentanaTitulo(int x, int y, int w, int h, String
nombre)
{
super(x, y, w, h);
titulo=nombre;
}
public void mostrar()
{
System.out.println("titulo
: "+titulo);
super.mostrar();
}
public void desplazar(int dx, int dy)
{
x+=dx;
y+=dy;
226
//Archivo: VentanaApp.java
class VentanaApp
{
public static void main(String[] args)
{
VentanaTitulo ventana=new VentanaTitulo(0, 0, 20, 30,
"Principal");
ventana.mostrar();
ventana.cambiarDimensiones(10, -5);
ventana.desplazar(4, 3);
System.out.println("************************");
ventana.mostrar();
}
}
227
228
229
super(x,y);
this.ancho=ancho;
this.alto=alto;
}
public double area()
{
return ancho*alto;
}
231
232
//Archivo: FiguraApp.java
class FiguraApp
{
public static void main(String[] args)
PROGRAMACION CON JAVA 2
233
//enlace temprano
Circulo c=new Circulo(0, 0, 5.5);
System.out.println("Utilizacion de enlace temprano");
System.out.println("Area del circulo "+c.area());
Rectangulo r=new Rectangulo(0, 0, 5.5, 2.0);
System.out.println("Area del rectangulo "+r.area());
//enlace tardo
System.out.println("Utilizacion de enlace tardio (dinamico)");
Figura f=new Circulo(0, 0, 5.5);
System.out.println("Area del circulo "+f.area());
f=new Rectangulo(0, 0, 5.5, 2.0);
System.out.println("Area del rectangulo "+f.area());
}
}
234
CAPITULO CINCO
GESTION DE EXCEPCIONES
5.1. LAS EXCEPCIONES ESTNDAR
Los programadores de cualquier lenguaje se esfuerzan
por escribir programas libres de errores, sin embargo,
es muy difcil que los programas reales se vean libres
de ellos. En Java las situaciones que pueden provocar
un fallo en el programa se denominan excepciones.
Java lanza una excepcin en respuesta a una situacin
poco usual. El programador tambin puede lanzar sus
propias excepciones. Las excepciones en Java son objetos de clases derivadas de la clase base Exception.
Existen tambin los errores internos que son objetos
de la clase Error. Ambas clases Error y Exception son
clases derivadas de la clase base Throwable, tal comose muestra en la figura 5.1.
Existe toda una jerarqua de clases derivada de la
clase base Exception. Estas clases derivadas se ubican
en dos grupos principales:
Las excepciones en tiempo de ejecucin ocurren cuando
el programador no ha tenido cuidado al escribir su cdigo. Por ejemplo, cuando se sobrepasa la dimensin de
un array se lanza una excepcin ArrayIndexOutOfBounds.
Cuando se hace uso de una referencia a un objeto que
no ha sido creado se lanza la excepcin NullPointerExPROGRAMACION CON JAVA 2
235
Figura 5.1
El segundo grupo de excepciones, es el ms interesante, ya que indican que ha sucedido algo inesperado o
fuera de control.
12 ";
int numero=Integer.parseInt(str);
Si se introducen caracteres no numricos, o
no se quitan los espacios en blanco al principio y al final del string, mediante la funcin trim, se lanza una excepcin NumberFormatException.
236
El mensaje que aparece en la ventana nos indica el tipo de excepcin NumberFormatException, la funcin que la ha lanzado Integer.parseInt, que se llama dentro de main.
Objeto no inicializado
Habitualmente, cuando llamamos desde un objeto no inicializado, a una funcin miembro.
public static void main(String[] args)
{
String str;
str.length();
//...
}
El compilador se queja con el siguiente mensaje "variable str might not have been initilized". En otras ocasiones, se lanza una excepcin del tipo NulPointerException. Fijarse
que en la porcin de cdigo que sigue, grafico es una variable de instancia que es inicializada por defecto a null.
class MiCanvas....
{
Grafico grafico;
public void paint(...)
{
grafico.dibuja();
//...
}
//...
}
237
programa. As, cuando intentamos leer un carcter del teclado, llamamos a la la funcin
System.in.read();
Cuando compilamos el programa, nos aparece un
mensaje de error que no nos deja proseguir.
unreported
exception:
java.io.IOException;
must be caught or declared to be thrown
En el caso de que el string str contenga caracteres no numricos como es ste el caso,
el nmero 12 est acompaado de espacios en
blanco, se produce una excepcin del tipo
NumberFormatException que es capturada y se
imprime el mensaje "No es un nmero".
238
//...
}
catch(NumberFormatException ex)
{
System.out.println(ex);
}
12
239
try
{
//Este cdigo
}catch(Exception
{
//Este cdigo
}finally
{
//Este cdigo
cin
}
241
Cuando el numerador es mayor que 100 y el denominador es menor que 5 se lanza throw una
excepcin, un objeto de la clase ExcepcionIntervalo. Dicho objeto se crea llamando al
constructor de dicha clase y pasndole un
string que contiene el mensaje "Nmeros fuera
del intervalo".
try
{
cos";
numerador=Integer.parseInt(str1);
denominador=Integer.parseInt(str2);
rango(numerador, denominador);
cociente=numerador/denominador;
respuesta=String.valueOf(cociente);
}
catch(NumberFormatException ex)
{
respuesta="Se han introducido
caracteres
no
numri-
}
catch(ArithmeticException ex)
{
respuesta="Divisin entre cero";
}
catch(ExcepcionIntervalo ex)
{
respuesta=ex.getMessage();
}
System.out.println(respuesta);
}
valo
valo");
}
if((num>100)||(den<-5))
{
throw new ExcepcionIntervalo("Numeros fuera del inter}
243
244
245
246
CAPITULO SEIS
PAQUETES
6.1. PAQUETES
Un paquete es un conjunto de clases, lgicamente relacionadas entre s, agrupadas bajo un nombre (por ejemplo, el paquete java.io agrupa las clases que permiten
a un programa realizar la entrada y salida de informacin); incluso, un paquete puede contener a otros paquetes.
Prcticamente son bibliotecas a las que el usuario
puede acceder y que ofrecen varias funciones (mtodos). Los usuarios pueden tambin crear paquetes informticos, por ejemplo, haciendo que contengan todas
las clases que ha definido para poner en marcha algunas funciones que luego usar en varios programas.
Los paquetes son los mdulos de Java. Recipientes que
contienen clases y que se utilizan tanto para mantener
el espacio de nombres dividido en compartimentos ms
manejables como un mecanismo de restriccin de visibilidad. Se pueden poner clases dentro de los paquetes
restringiendo la accesibilidad a stas en funcin de
la localizacin de los otros miembros del paquete. Cada archivo .java tiene las mismas cuatro partes internas y hasta ahora slo hemos utilizado una de ellas en
nuestros ejemplos. Esta es la forma general de un archivo fuente de Java, una nica sentencia de paquete
PROGRAMACION CON JAVA 2
247
(opcional) las sentencias de importacin deseadas (opcional) una nica declaracin de clase pblica las
clases privadas de paquete deseadas (opcional).
Figura 6.1.
Nivel de Clase
acceso
Subclase
paquete
(clase
derivada)
todos
private
No
No
No
protected
No
public
package
No
No
251
Cualquier
Clase o
subclase del
mismo paquete
no
Cualquier
subclase de
otro paquete.
no
no
Cualquier
clase de otro
paquete.
no
no
no
252
Descripcin
Contiene las clases necesarias para crear
java.applet applets que se ejecutan en la ventana del
navegador
Contiene clases para crear una aplicacin
java.awt
GUI independiente de la plataforma
Entrada/Salida. Clases que definen disjava.io
tintos flujos de datos
Contiene clases esenciales, se importa
java.lang impcitamente sin necesidad de una sentencia import.
Se usa en combinacin con las clases del
java.net
paquete java.io para leer y escribir datos en la red.
Contiene otras clases tiles que ayudan
java.util
al programador
253
sdato = flujoE.readLine();
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
return sdato; // devolver el dato tecleado
Aqu se encuentra
LecturaDatos.java
Aqu se encuentra
Leer.java
//Archivo: LecturaDatos.java
// Utiliza la clase Leer que debe de estar almacenada
// en la carpeta LeerDatos (pauete LeerDatos)
import LeerDatos.*;
class LecturaDatos
{
public static void main(String[] args)
{
short dato_short = 0;
int dato_int = 0;
long dato_long = 0;
float dato_float = 0;
double dato_double = 0;
System.out.print("Dato short: ");
dato_short = Leer.datoShort();
System.out.print("Dato int: ");
dato_int = Leer.datoInt();
System.out.print("Dato long: ");
dato_long = Leer.datoLong();
System.out.print("Dato float: ");
dato_float = Leer.datoFloat();
System.out.print("Dato double: ");
dato_double = Leer.datoDouble();
PROGRAMACION CON JAVA 2
255
256
System.out.println(dato_short);
System.out.println(dato_int);
System.out.println(dato_long);
System.out.println(dato_float);
System.out.println(dato_double);
CAPITULO SIETE
INTERFACES
7.1. QU ES UN INTERFACE?
Una interface Java es un dispositivo que permite interactuar a objetos no relacionados entre s. Las interfaces Java en realidad definen un conjunto de mensajes que se puede aplicar a muchas clases de objetos,
a los que cada una de ellas debe responder de forma
adecuada.
Un interface es una coleccin de declaraciones de mtodos (sin definirlos) y tambin puede incluir constantes.
Runnable es un ejemplo de interface en el cual se declara, pero no se implemementa, una funcin miembro
run.
[public] interface Runnable
{
public abstract void run();
}
257
UN
INTERFACE
UNA
258
259
El polimorfismo nos permite pasar la referencia a un objeto de la clase Gato a una funcin hazleHablar que conoce al objeto por su
clase base Animal
//Archivo: PoliApp.java
package polimorfismo;
public class PoliApp
{
260
7.3.2. INTERFACES
Vamos a crear un interface denominado Parlanchin que contenga la declaracin de una funcin denominada habla.
public interface Parlanchin
{
public abstract void habla();
}
261
Ahora veamos otra jerarqua de clases completamente distinta, la que deriva de la clase
base Reloj. Una de las clases de dicha jerarqua Cucu implementa el interface Parlanchin
y por tanto, debe de definir obligatoriamente
la funcin habla declarada en dicho interface.
public abstract class Reloj
{
}
class Cucu extends Reloj implements Parlanchin
{
public void habla()
{
System.out.println("Cucu, cucu, ..!");
}
}
Al ejecutar el programa, veremos que se imprime en la consola Miau!, por que a la funcin hazleHablar se le pasa un objeto de la
clase Gato, y despus Cucu, cucu, ..! por
que a la funcin hazleHablar se le pasa un
objeto de la clase Cucu.
Si solamente hubiese herencia simple, Cucu
tendra que derivar de la clase Animal (lo
que no es lgico) o bien no se podra pasar a
la funcin hazleHablar. Con interfaces, cualquier clase en cualquier familia puede implementar el interface Parlanchin, y se podr
pasar un objeto de dicha clase a la funcin
hazleHablar. Esta es la razn por la cual los
interfaces proporcionan ms polimorfismo que
el que se puede obtener de una simple jerarqua de clases.
//Archivo Animal1.java
public abstract class Animal1 implements Parlanchin
{
public abstract void habla();
}
PROGRAMACION CON JAVA 2
263
//archivo: Reloj.java
public abstract class Reloj
{
}
class Cucu extends Reloj implements Parlanchin
{
public void habla()
{
System.out.println("Cucu, cucu, ..!");
}
}
//Archivo: PoliApp1.java
public class PoliApp1
{
public static void main(String[] args)
{
Gato gato=new Gato();
System.out.println("Uso de hazlehablar() con el el objeto
gato:\n");
hazleHablar(gato);
Cucu cucu=new Cucu();
System.out.println("Uso de hazlehablar() con el el objeto
cucu:\n");
hazleHablar(cucu);
}
}
264
265
CAPITULO OCHO
ENTRADA/SALIDA PARA EL MANEJO DE
ARCHIVOS
8.1. ARCHIVOS Y DIRECTORIOS
8.1.1. LA CLASE FILE
Antes de proceder al estudio de las clases
que describen la entrada/salida vamos a estudiar la clase File, que nos proporciona informacin acerca de los archivos, de sus
atributos, de los directorios, etc. Tambin
explicaremos como se crea un filtro mediante
el interface FilenameFilter para obtener la
lista de los archivos que tengan por ejemplo,
la extensin .java.
La clase File tiene tres constructores
File(String path)
267
String getName()
String getPath()
String getAbsolutePath()
boolean exists()
boolean canWrite()
boolean canRead
boolean isFile()
boolean isDirectory()
boolean isAbsolute()
long lastModified()
long length()
boolean mkdir()
boolean mkdirs()
boolean delete()
String[] list()
268
Si este archivo existe, es decir, si la funcin exists devuelve true, entonces se obtiene informacin acerca del archivo:
if(fichero.exists())
{
System.out.println("Nombre
"+fichero.getName());
System.out.println("Camino
"+fichero.getPath());
System.out.println("Camino
"+fichero.getAbsolutePath());
System.out.println("Se
"+fichero.canRead());
System.out.println("Se
"+fichero.canWrite());
System.out.println("Tamao
}
si
el
archivo
del
se
archivo
absoluto
puede
escribir
puede
leer
"+fichero.length());
ArchivoApp1.java
ArchivoApp1.java
c:\JBuilder2\myNumerico\archivo1\ArchivoApp1.java
true
true
1366
269
Para obtener la lista de los archivos del directorio actual se crea un nuevo objeto de la
clase File
fichero=new File(".");
Para obtener la lista de los archivos que
contiene este directorio se llama a la funcin miembro list, la cual nos devuelve un
array de strings.
String[] listaArchivos=fichero.list();
for(int i=0; i<listaArchivos.length; i++)
{
System.out.println(listaArchivos[i]);
}
La salida es la siguiente
archivo1.jpr
archivo1.html
ArchivoApp1.java
ArchivoApp1.~jav
Filtro.java
Filtro.~jav
Para obtener la lista de archivos con extensin .java en el directorio actual, creamos
un objeto de la clase Filtro y se lo pasamos
a la funcin list miembro de la clase File.
listaArchivos=fichero.list(new Filtro(".java"));
for(int i=0; i<listaArchivos.length; i++)
{
System.out.println(listaArchivos[i]);
}
//Archivo: ArchivoApp1.java
import java.io.*;
public class ArchivoApp1
PROGRAMACION CON JAVA 2
271
272
273
274
byte, 8 bits.
275
8.2.2. LECTURA
Las clases Reader e InputStream son similares
aunque se refieren a distintos tipos de
datos,
lo
mismo
ocurre
con
Writer
y
OutputSream.
Por ejemplo, Reader proporciona tres mtodos
para leer un carcter char o un array de caracteres
int read()
int read(char buf[])
int read(char buf[], int offset, int len)
InputStream proporciona mtodos similares para leer un byte o un array de bytes.
int read()
int read(byte buf[])
int read(byte buf[], int offset, int len)
La primera versin lee un byte como entero
del flujo de entrada, devuelve 1 si no hay
ms datos que leer. La segunda versin, lee
un array de bytes devolviendo el nmero de
bytes ledos. La tercera versin, lee tambin, un array de bytes, pero nos permite especificar, la posicin de comienzo del array
en la que se empiezan a guardar los bytes, y
el mximo nmero de bytes que se van a leer.
Dichas clases definen otras funciones miembro
que no estudiaremos de momento.
276
8.2.3. ESCRITURA
La clase Writer proporciona tres mtodos para
escribir un carcter char o un array de caracteres
int write(int c)
int write(char buf[])
int write(char buf[], int offset, int len)
La clase OutputStream proporciona mtodos similares
int write(int c)
int write(byte buf[])
int write(byte buf[], int offset, int len)
System.in.read();
}catch (IOException ex) {
277
Para leer una sucesin de caracteres se emplea un cdigo similar (Vea el archivo TecladoApp2.java)
StringBuffer str=new StringBuffer();
char c;
try
{
Reader entrada=new InputStreamReader(System.in);
while ((c=(char)entrada.read())!='\n')
{
str.append(c);
}
}catch(IOException ex){}
279
un
la
en
el
281
try
{
entrada=new FileReader("mensaje.txt");
int c;
while((c=entrada.read())!=-1)
{
str.append((char)c);
}
}catch (IOException ex) {}
Para mostrar el archivo de texto en la pantalla del monitor, se imprime el contenido del
objeto str de la clase StringBuffer.
System.out.println(str);
Una vez concludo el proceso de lectura, es
conveniente cerrar el flujo de datos, esto se
realiza en una clasula finally que siempre
se llama independientemente de que se produzcan o no errores en el proceso de lectura/escritura.
finally
{
if(entrada!=null)
{
try
{
entrada.close();
}catch(IOException ex){}
}
}
282
try
{
entrada=new FileReader("mensaje.txt");
int c;
while((c=entrada.read())!=-1)
{
str.append((char)c);
}
System.out.println(str);
System.out.println("-------------------------------
-------");
}catch (IOException ex)
{
System.out.println(ex);
}
finally
{
//cerrar los flujos de datos
if(entrada!=null)
{
try
{
entrada.close();
}catch(IOException ex){}
}
System.out.println("el bloque
ejecuta");
}
}
}
finally
siempre
se
8.4.2. LECTURA/ESCRITURA
Los pasos para leer y escribir en disco son
los siguientes:
Se crean dos objetos de las clases FileReader y FileWriter, llamando a los respectivos constructores a los que se les
pasa los nombres de los archivos o bien,
objetos de la clase File, respectivamente
entrada=new FileReader("mensaje.txt");
salida=new FileWriter("copia.txt");
while((c=entrada.read())!=-1)
{
salida.write(c);
}
entrada.close();
salida.close();
entrada=new FileReader("mensaje.txt");
salida=new FileWriter("copia.txt");
//entrada=new FileInputStream("mensaje.txt");
//salida=new FileOutputStream("copia.txt");
int c;
while((c=entrada.read())!=-1)
{
salida.write(c);
}
}
catch (IOException ex)
{
System.out.println(ex);
}
finally
{
//cerrar los flujos de datos
if(entrada!=null)
{
try
{
entrada.close();
284
ejecuta");
}
}
}
}catch(IOException ex){}
}
if(salida!=null)
{
try
{
salida.close();
}catch(IOException ex){}
}
System.out.println("el bloque
finally
siempre
se
Cuando se trate de leer y escribir datos binarios se sustituye FileReader por FileInputStream y FileWriter por FileOutputStream.
De hecho, si se realiza esta sustitucin en
el cdigo fuente de este ejemplo, los resultados no cambian.
DataInputStream(new
La clase DataInputStream define diversos mtodos readXXX que son variaciones del mtodo
PROGRAMACION CON JAVA 2
285
La clase DataOutputStream es til para escribir datos del tipo primitivo de una forma
portable. Esta clase tiene un slo constructor que toma un objeto de la clase OutputStream o sus derivadas como parmetro.
Se crea un objeto de la clase DataOutputStream vinculndolo a un un objeto FileOutputStream para escribir en un archivo en disco denominado pedido.txt..
FileOutputStream fileOut=new FileOutputStream("pedido.txt");
DataOutputStream salida=new DataOutputStream(fileOut));
DataOutputStream(new
La clase DataOutputStream define diversos mtodos writeXXX que son variaciones del mtodo
286
Observamos en la tabla y en el cdigo el nombre de las funciones que leen y escriben los
distintos tipos de datos.
Escritura
writeChar
writeInt
Lectura
readChar
readInt
Un carcter
Un entero
Un nmero dewriteDouble readDouble
cimal
Un string
writeChars readLine
PROGRAMACION CON JAVA 2
287
FileOutput-
Para leer bien los datos, el string ha de separarse del siguiente dato con un carcter
nueva lnea '\n'. Esto no es necesario si el
string se escribe en el ltimo lugar, despus
de los nmeros. Por otra parte, el carcter
tabulador como separador no es estrictamente
necesario.
Veamos el cdigo que lee los datos a un archivo pedido.txt en disco
288
double precio;
int unidad;
String descripcion;
double total=0.0;
DataInputStream
entrada=new
DataInputStream(new
FileInputStream("pedido.txt"));
try
{
while ((descripcion=entrada.readLine())!=null)
{
unidad=entrada.readInt();
entrada.readChar();
//lee el carcter tabulador
precio=entrada.readDouble();
System.out.println("has
pedido
"+unidad+"
"+descripcion+" a "+precio+" soles.");
total=total+unidad*precio;
}
}catch (EOFException e) {}
System.out.println("por un TOTAL de: "+total+" soles.");
entrada.close();
"+unidad+"
"+descripcion+"
289
try
{
while(true)
{
descripcion=entrada.readLine();
unidad=entrada.readInt();
entrada.readChar();
//lee el carcter tabulador
precio=entrada.readDouble();
System.out.println("has
pedido
"+unidad+"
"+descripcion+" a "+precio+" soles.");
total=total+unidad*precio;
}
}catch (EOFException e)
{
System.out.println("Excepcin cuando se alcanza el final
del archivo");
}
while ((descripcion=entrada.readLine())!=null)
{
unidad=entrada.readInt();
entrada.readChar();//lee el carcter tabulador
precio=entrada.readDouble();
System.out.println("has
pedido
"+unidad+"
"+descripcion+" a "+precio+" soles.");
total=total+unidad*precio;
}
System.out.println("Final del archivo");
}catch (EOFException e)
290
System.out.println("Excepcin
del archivo");
}
cuando
se
alcanza
el
final
291
System.out.println("has
pedido
"+unidad+"
"+descripcion+" a "+precio+" Soles.");
total=total+unidad*precio;
}
System.out.println("Final del archivo");
}
catch (EOFException e)
{
System.out.println("Excepcin cuando se alcanza el final del archivo");
}
System.out.println("por un TOTAL de: "+total+" soles.");
entrada.close();
}
}
292
La persistencia
Mg. ABRAHAM GAMARRA MORENO
293
Los valores de los miembros que no tengan los modificadores static o transient, incluyendo los miembros que se
refieren a otros objetos.
8.6.2. LECTURA/ESCRITURA
Dos flujos de datos ObjectInputStream y ObjectOutputStream estn especializados en la
lectura y escritura de objetos. El comportamiento de estos dos flujos es similar a sus
correspondientes que procesan flujos de datos
primitivos DataInputStream y DataOutputStream.
Escribir
objetos
al
flujo
de
salida
ObjectOutputStream es muy simple y requiere
los siguientes pasos:
ObjectOutputStream(new
Mg. ABRAHAM GAMARRA MORENO
salida.close();
Lista lista1= new Lista(new int[]{12, 15, 11, 4, 32});
ObjectOutputStream
salida=new
ObjectOutputStream(new
FileOutputStream("media.obj"));
salida.writeObject("guardar este string y un objeto\n");
salida.writeObject(lista1);
salida.close();
ObjectInputStream
entrada=new
FileInputStream("media.obj"));
ObjectInputStream(new
295
String str=(String)entrada.readObject();
Lista obj1=(Lista)entrada.readObject();
entrada.close();
ObjectInputStream
entrada=new
ObjectInputStream(new
FileInputStream("media.obj"));
String str=(String)entrada.readObject();
Lista obj1=(Lista)entrada.readObject();
System.out.println("Valor medio "+obj1.valorMedio());
System.out.println("-----------------------------");
System.out.println(str+obj1);
System.out.println("-----------------------------");
entrada.close();
// Archivo: ArchivoApp4.java
import java.io.*;
import java.util.*;
public class ArchivoApp4
{
public static void main(String[] args)
{
PROGRAMACION CON JAVA 2
297
FileOutputStream
para
guardar
la
informacin en el archivo cliente.obj.
ObjectInputStream
entrada=new
ObjectInputStream(new
FileInputStream("cliente.obj"));
String str=(String)entrada.readObject();
Cliente obj1=(Cliente)entrada.readObject();
System.out.println("------------------------------");
System.out.println(str+obj1);
System.out.println("------------------------------");
entrada.close();
300
// Archivo: Cliente.java
public class Cliente implements java.io.Serializable
{
private String nombre;
private transient String passWord;
public Cliente(String nombre, String pw)
{
this.nombre=nombre;
passWord=pw;
}
public String toString()
{
String texto=(passWord==null) ? "(no disponible)" : passWord;
texto+=nombre;
return texto;
}
}
// Archivo: ArchivoApp6.java
import java.io.*;
public class ArchivoApp6
{
public static void main(String[] args)
{
Cliente cliente=new Cliente("Angel", "xyz");
try
{
ObjectOutputStream
salida=new
ObjectOutputStream(new FileOutputStream("cliente.obj"));
salida.writeObject("Datos del cliente\n");
salida.writeObject(cliente);
salida.close();
ObjectInputStream entrada=new ObjectInputStream(new
FileInputStream("cliente.obj"));
String str=(String)entrada.readObject();
Cliente obj1=(Cliente)entrada.readObject();
System.out.println("-----------------------------");
System.out.println(str+obj1);
System.out.println("-----------------------------");
entrada.close();
//se puede fundir en una catch Exception
}
catch (IOException ex)
{
System.out.println(ex);
}
catch (ClassNotFoundException ex)
PROGRAMACION CON JAVA 2
301
System.out.println(ex);
303
//Archivo: Rectangulo.java
public class Rectangulo implements java.io.Serializable
{
private int ancho ;
private int alto ;
private Punto origen;
public Rectangulo()
{
}
304
public Rectangulo(Punto p)
{
this(p, 0, 0);
}
public Rectangulo(int w, int h)
{
this(new Punto(0, 0), w, h);
}
public Rectangulo(Punto p, int w, int h)
{
origen = p;
ancho = w;
alto = h;
}
public void desplazar(int dx, int dy)
{
origen.desplazar(dx, dy);
}
public int calcularArea()
{
return ancho * alto;
}
// Archivo: ArchivoApp5.java
import java.io.*;
public class ArchivoApp5
{
public static void main(String[] args)
{
Rectangulo rect=new Rectangulo(new
60);
Punto(10,10),
30,
try
{
ObjectOutputStream
salida=new
ObjectOutputStream(new FileOutputStream("figura.obj"));
salida.writeObject("guardar
un
objeto
compuesto\n");
salida.writeObject(rect);
salida.close();
ObjectInputStream entrada=new ObjectInputStream(new
FileInputStream("figura.obj"));
String str=(String)entrada.readObject();
PROGRAMACION CON JAVA 2
305
");
");
Rectangulo obj1=(Rectangulo)entrada.readObject();
System.out.println("-----------------------------System.out.println(str+obj1);
System.out.println("-----------------------------entrada.close();
//se puede fundir en una catch Exception
}
catch (IOException ex)
{
System.out.println(ex);
}
catch (ClassNotFoundException ex)
{
System.out.println(ex);
}
8.6.5. LA HERENCIA
En el apartado anterior hemos examinado la
composicin, ahora examinemos la herencia. En
el captulo de la herencia examinamos una jerarqua formada por una clase base denominada
Figura y dos clases derivadas denominadas
Circulo y Rectangulo.
Como podemos observar en el cuadro adjunto se
han hecho dos modificaciones. La clase base
Figura implementa el interface Serializable y
en la clase Circulo en vez de usar el nmero
PI proporcionado por la clase Math, definimos
una constante esttica PI con una aproximacin de 4 decimales. De este modo probamos el
comportamiento de un miembro esttico en el
proceso de serializacin.
Para serializar objetos de una jerarqua solamente la clase base tiene que implementar
el interface Serializable
306
Vamos a serializar dos objetos uno de la clase Rectangulo y otro de la clase Circulo, y a
continuacin reconstruiremos dichos objetos.
Una vez de que dispongamos de los objetos
llamaremos a las funciones area para calcular
el rea de cada una de las figuras.
Para guardar en el archivo figura.obj un objeto fig1 de la clase Rectangulo y otro objeto fig2 de la clase Circulo, se siguen los
mismos pasos que hemos estudiado en apartados
anteriores
PROGRAMACION CON JAVA 2
307
308
309
// Archivo: ArchivoApp8.java
import java.io.*;
public class ArchivoApp8
{
public static void main(String[] args)
{
Figura fig1=new Rectangulo(10,15, 30, 60);
Figura fig2=new Circulo(12,19, 60);
try
{
ObjectOutputStream
salida=new
ObjectOutputStream(new FileOutputStream("figura.obj"));
salida.writeObject("guardar un objeto de una clase
derivada\n");
salida.writeObject(fig1);
salida.writeObject(fig2);
salida.close();
ObjectInputStream entrada=new ObjectInputStream(new
FileInputStream("figura.obj"));
String str=(String)entrada.readObject();
Figura obj1=(Figura)entrada.readObject();
Figura obj2=(Figura)entrada.readObject();
System.out.println("-----------------------------");
System.out.println(obj1.getClass().getName()+"
origen ("+obj1.x+", "+obj1.y+")"+" area="+obj1.area());
System.out.println(obj2.getClass().getName()+"
origen ("+obj2.x+", "+obj2.y+")"+" area="+obj2.area());
System.out.println("-----------------------------");
entrada.close();
//se puede fundir en una catch Exception
}
catch (IOException ex)
{
System.out.println(ex);
}
catch (ClassNotFoundException ex)
{
System.out.println(ex);
}
}
}
310
s)
throws
throws
Para un control explcito del proceso de serializacin la clase ha de implementar el interface Externalizable. La clase es responsaPROGRAMACION CON JAVA 2
311
312
throws
throws
CAPITULO NUEVE
APPLETS
En este captulo vamos a tratar de ver todo lo que necesitamos para saber escribir un applet Java. Dado que los applets
pueden usar una gran cantidad de clases del API de Java, veremos muchas caractersticas que no hemos explicado en forma
completa, las cuales iremos aprendiendo junto a los applets.
313
de un documento web". Claro que as la definicin establece el entorno (Internet, Web, etc.). En realidad,
un applet es una aplicacin pretendidamente corta (nada impide que ocupe ms de un gigabyte, a no ser el
pensamiento de que se va a transportar por la red) basada en un formato grfico sin representacin independiente: es decir, se trata de un elemento a incluir en
otras aplicaciones; es un componente en su sentido estricto.
314
El siguiente paso es dar funcionalidad a la clase, definir nuestras propias funciones miembro o redefinir
funciones de la clase base Applet.
Definimos la funcin init para establecer el color de
fondo del applet mediante setBackground. La funcin
init se llama cuando se carga el applet.
public class Applet1 extends Applet
{
public void init()
{
setBackgroung(Color.cyan);
}
//...
}
desde el objeto g a
primer argumento es
los dos nmeros inbase del primer ca-
import java.applet.*;
public class Applet1 extends Applet
{
public void init()
{
setBackgroung(Color.cyan);
}
public void paint(Graphics g)
{
g.drawString("Primer applet", 10, 10);
}
}
Un applet, no es como una aplicacin que tiene un mtodo main. El applet est insertado en una pgina web
que se muestra en la ventana del navegador. El navegador toma el control del applet llamando a algunos de
sus mtodos, uno de estos es el mtodo paint que se
PROGRAMACION CON JAVA 2
315
mtalas
ap-
El mtodo init se llama una sla vez. Despus, el navegador llama al mtodo paint.
A continuacin, se llama al mtodo start. Este mtodo
se llama cada vez que se accede a la pgina que contiene el applet. Esto quiere decir, que cuando dejamos
la pgina web que contiene el applet y regresamos de
nuevo pulsando en el botn "hacia atrs" el mtodo
start vuelve a llamarse de nuevo, pero no se llama el
mtodo init.
Cuando dejamos la pgina web que contiene el applet,
por ejemplo, pulsando en un enlace, se llama al mtodo
stop.
Finalmente, cuando salimos del navegador se llama al
mtodo destroy.
Mtodos fundamentales
public class Simple extends Applet
{
. . .
public void init() { . . . }
public void start() { . . . }
public void stop() { . . . }
public void destroy() { . . . }
. . .
}
En el Entorno Integrado de Desarrollo (IDE) de JCreator creamos un applet. Con JCreator generamos la clase
que describe el applet con algunos mtodos y lo guardamos en un archivo cuyo nombre es el mismo que el de
la clase y con extensin .java. Generamos tambin, un
archivo HTML de la pgina que contiene el applet tal
como se ve a continuacin:
<!--Archivo: applet1.htm -->
<HTML>
<HEAD>
<TITLE> Applet en Java </TITLE>
</HEAD>
<BODY>
Esta es la salida del primer applet Java:
<APPLET CODE="Applet1.class" WIDTH=300 HEIGHT=150> </APPLET>
</BODY>
</HTML>
317
</HEAD>
<BODY>
Esta es la salida del primer applet Java: <br>
<APPLET CODE="Applet1.class" WIDTH=300 HEIGHT=150>
</APPLET>
</BODY>
</HTML>
specified rectangle.
319
abstract create()
Graphics
abstract dispose()
void
Draws the outline of a circular or elliptical arc covering the specified rectangle.
void drawBytes(byte[] data, int offset, int length, int x, int y)
is currently available.
320
abstract drawImage(Image img, int dx1, int dy1, int dx2, int dy2,
boolean int sx1, int sy1, int sx2, int sy2, Color bgcolor,
ImageObserver observer)
of x and y coordinates.
void drawPolygon(Polygon p)
Draws an outlined round-cornered rectangle using this graphics context's current color.
abstract drawString(AttributedCharacterIterator iterator, int x,
void int y)
321
of x and y coordinates.
void fillPolygon(Polygon p)
Fills the polygon defined by the specified Polygon object with the graphics context's
current color.
abstract fillRect(int x, int y, int width, int height)
void
Fills the specified rectangle.
abstract fillRoundRect(int x, int y, int width, int height,
void int arcWidth, int arcHeight)
Fills the specified rounded corner rectangle with the current color.
void finalize()
abstract getClipBounds()
Rectangle
Returns the bounding rectangle of the
Rectangle getClipBounds(Rectangle r)
abstract getColor()
Color
lor.
abstract getFont()
Font
322
FontMetrics getFontMetrics()
font.
abstract getFontMetrics(Font f)
FontMetrics
Gets the font metrics for the specified
font.
boolean hitClip(int x, int y, int width, int height)
Returns true if the specified rectangular area might intersect the current clipping
area.
abstract setClip(int x, int y, int width, int height)
void
Sets the current clip to the rectangle
abstract setColor(Color c)
void
Sets this graphics context's current co-
specified font.
abstract setPaintMode()
void
Sets the paint mode of this graphics
context to alternate between this graphics context's current color and the new specified color.
String toString()
323
Lneas
Crculos y elipses
Rectngulos y polgones
Imgenes
Texto
El sistema de coordenadas
que se usa en Java es similar a Windows. El rea
de trabajo del applet est
compuesta por una matriz
bidimensional de puntos o
pixels.
Decimos
que
un
punto
tiene coordenadas
(x, y) cuando est en la
columna x medida desde la
izquierda, y est en la
fila y, medida desde arriba.
325
ponente. La funcin getSize nos devuelve un objeto de la clase Dimension cuyos miembros width y height nos suministran la anchura y altura del componente.
int ancho=getSize().width;
int alto=getSize().heigth;
altura. La siguiente sentencia dibuja un rectngulo cuyo origen es el punto 50, 150, que
tiene una anchura de 50, y una altura de 60.
La funcin drawRect dibuja el contorno del
color seleccionado, y fillRect dibuja el rectngulo pintando su interior del color seleccionado, en este caso de color rojo.
g.setColor(Color.red);
g.fillRect(50, 150, 50, 60);
327
Para dibujar el polgono con su interior pintado del color seleccionado se llama a la
funcin fillPolygon y se le pasa el objeto
poligono de la clase Polygon.
g.setColor(Color.yellow);
g.fillPolygon(poligono);
Si deseamos obtener las dimensiones del objeto disco de la clase Image, llamamos a dos
funciones de esta clase getWidth y getHeight
int ancho=disco.getWidth(this);
int alto=disco.getHeight(this);
329
g.setColor(Color.cyan);
g.fillArc(10, 10, 150, 100, 0, 270);
g.setColor(Color.black);
g.drawArc(10, 10, 150, 100, 0, 270);
Polygon poligono=new Polygon();
poligono.addPoint(100, 120);
poligono.addPoint(150, 280);
poligono.addPoint(170, 200);
poligono.addPoint(190, 250);
poligono.addPoint(200, 60);
g.setColor(Color.yellow);
g.fillPolygon(poligono);
int[] x={100, 150, 170, 190, 200};
int[] y={120, 280, 200, 250, 60};
g.setColor(Color.blue);
g.drawPolygon(x, y, x.length);
330
Red (rojo)
white
lightGray
gray
drakGray
black
red
pink
orange
yellow
green
magenta
cyan
blue
255
192
128
64
0
255
255
255
255
0
255
0
0
Green
(verde)
255
192
128
64
0
0
175
200
255
255
0
255
0
Blue
(azul)
255
192
128
64
0
0
175
0
0
0
255
255
255
331
333
}
}
alto = appletAlto*i/8;
ancho = appletAncho*i/8;
x=appletAncho/2-i*appletAncho/16;
y=appletAlto/2-i*appletAlto/16;
g.fillOval(x, y, ancho, alto);
334
Esta sentencia, crea una fuente de texto Times Roman, en letra negrita, de 12 puntos.
Los estilos vienen datos por constantes
(miembros estticos de la clase Font),
Font.BOLD
establece
el
estilo
negrita,
Font.ITALIC, el estilo cursiva, y Font.PLAIN,
el estilo normal. Se pueden combinar las
constantes Font.BOLD+Font.ITALIC para establecer el estilo negrita y cursiva a la vez.
La funcin setFont de la clase Graphics establece la fuente de texto en el contexto grfico g.
g.setFont(fuente);
Para obtener el nombre de las fuentes de texto disponibles se escribe el siguiente cdigo
PROGRAMACION CON JAVA 2
335
String[] nombreFuentes=getToolkit().getFontList();
for(int i=0; i<nombreFuentes.length; i++){
System.out.println(nombreFuentes[i]);
}
336
337
339
340
java.awt.*;
java.awt.event.*;
java.applet.*;
java.lang.Math;
341
y=x*x;
//convertir a coordenadas de pantalla
xp=(int)(x0+x);
yp=(int)(y0-y);
//dibujar punto
g.drawOval(xp,yp,2,2);
<HTML>
<HEAD>
<TITLE> Applet en Java </TITLE>
</HEAD>
<BODY>
<APPLET CODE="GraficaParabola.class" WIDTH=500 HEIGHT=750>
</APPLET>
</BODY>
</HTML>
342
java.awt.*;
java.awt.event.*;
java.applet.*;
java.lang.Math;
//dibuja parabola
for(x=-400;x<=400;x++)
{
angrad=Math.toRadians(x);
y=100*Math.sin(angrad);
//convertir a coordenadas de pantalla
xp=x0+x;
yp=y0-y;
//dibujar punto
g.drawOval((int) xp,(int) yp,2,2);
}
343
9.7.
INTERFAZ GRAFICA CON EL USUARIO (GUI)
Y COMPONENTES BASICOS
Toda interfaz grfica con el usuario (GUI, graphical
user interface) presenta una interfaz de imagenes con
un programa. Esta interfaz permite al usuario reducir
el tiempo de ingreso de los datos, as como el manejo
de un programa.
Las GUI se construyen a partir de componentes de GUI
(llamados widgets). Un componente de GUI es un objeto
visual con el que el usuario puede interactuar a travs del teclado o el mouse.
Las clases para crear los componentes de GUI estan en
el paquete java.awt(Another Windowing Toolkit, otro
juego de herramientas para manejar ventanas). Para
utilizar este paquete debemos importarlo de la siguiente manera:
import java.awt.*;
344
9.7.1. COMPONENTES
Hay dos tipos de componentes:
los controles
los paneles
de la clase Component,
de la clase Container.
es un panel especialiotros componentes (pajerarqua de clases se
La librera AWT no es muy rica en componentes, tal como se ve en la figura. Sin embargo, hemos de tener cuidado en usar solamente
componentes AWT para los applets que vayamos
a publicar en Internet. Los navegadores no
ejecutan applets que utilicen componentes no
estndar.
PROGRAMACION CON JAVA 2
345
Resumn de atributos
static int CENTER
tered.
346
Resumn de Constructores
Label()
Resumn de Mtodos
void addNotify()
label.
String getText()
String paramString()
347
Resumn de atributos
static float BOTTOM_ALIGNMENT
Resumn de Constructores
protected Component()
Resumen de Mtodos
boolean action(Event evt, Object what)
ponent.
void addComponentListener(ComponentListener l)
Adds the specified focus listener to receive focus events from this component when this
component gains input focus.
void addHierarchyBoundsListener(HierarchyBoundsListener l)
Adds the specified hierarchy bounds listener to receive hierarchy bounds events from this
component when the hierarchy to which this container
belongs changes.
void addHierarchyListener(HierarchyListener l)
349
void addKeyListener(KeyListener l)
Adds the specified mouse listener to receive mouse events from this component.
void addMouseMotionListener(MouseMotionListener l)
producer.
void disable()
void enable(boolean b)
351
Component getComponentListeners()
Listener[]
Returns an array of all the component lis-
font.
Color getForeground()
nent.
353
Hierarchy getHierarchyBoundsListeners()
BoundsLisReturns an array of all the hierarchy
tener[] bounds listeners registered on this component.
Hierarchy getHierarchyListeners()
Listener[]
Returns an array of all the hierarchy lis-
nent for handling the communication with input methods when text is entered in this component.
InputMeth getInputMethodListeners()
odListeReturns an array of all the input method
ner[] listeners registered on this component.
InputMeth getInputMethodRequests()
odRequests
Gets the input method request handler
ener[]
MouseMoti getMouseMotionListeners()
onListeReturns an array of all the mouse motion
ner[] listeners registered on this component.
MouseWhee getMouseWheelListeners()
lListeReturns an array of all the mouse wheel
ner[] listeners registered on this component.
String getName()
nent.
int getX()
355
int getY()
boolean hasFocus()
changed.
void invalidate()
Returns whether the cursor has been explicitly set for this Component.
boolean isDisplayable()
playable.
boolean isDoubleBuffered()
able().
boolean isFontSet()
Returns whether the font has been explicitly set for this Component.
boolean isForegroundSet()
lid.
boolean isVisible()
void layout()
void list()
357
Prints out a list, starting at the specified indentation, to the specified print stream.
void list(PrintWriter out)
Prints out a list, starting at the specified indentation, to the specified print writer.
Component locate(int x, int y)
Point location()
Dimension minimumSize()
358
void nextFocus()
void paint(Graphics g)
this component.
boolean postEvent(Event e)
Dimension preferredSize()
nent.
protected processFocusEvent(FocusEvent e)
void
Processes focus events occurring on this
component by dispatching them to any registered FocusListener objects.
PROGRAMACION CON JAVA 2
359
protected processHierarchyBoundsEvent(HierarchyEvent e)
void
Processes hierarchy bounds events occur-
protected processKeyEvent(KeyEvent e)
void
Processes key events occurring on this
360
void removeHierarchyListener(HierarchyListener l)
Removes the specified input method listener so that it no longer receives input method
events from this component.
void removeKeyListener(KeyListener l)
Removes the specified mouse motion listener so that it no longer receives mouse motion
events from this component.
void removeMouseWheelListener(MouseWheelListener l)
361
void requestFocus()
void resize(Dimension d)
void setBackground(Color c)
nent.
Moves and resizes this component to conform to the new bounding rectangle r.
void setComponentOrientation(ComponentOrientation o)
362
void setEnabled(boolean b)
Sets whether focus traversal keys are enabled for this Component.
void setFont(Font f)
Sets whether or not paint messages received from the operating system should be ignored.
void setLocale(Locale l)
363
void show(boolean b)
Dimension size()
String toString()
Transfers the focus to the previous component, as though this Component were the focus owner.
void transferFocusUpCycle()
Por suepeusto que el cdigo anterior no posiciona los textos en dos lneas.
Si usted desea realizar que los textos se posicionen en dos lneas debe utilizar el administrador de diseos GridLayout (Diseo de
Retcula)
365
Resumn de Constructores
GridLayout()
Resumn de Mtodos
void addLayoutComponent(String name, Component comp)
Determines the minimum size of the container argument using this grid layout.
366
Determines the preferred size of the container argument using this grid layout.
void removeLayoutComponent(Component comp)
layout.
367
add(textolabel1);
add(textolabel2);
368
mtodos
de
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Button
Resumn de atributos
Fields inherited from class java.awt.Component
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT,
TOP_ALIGNMENT
Resumn de Constructores
Button()
Resumn de Mtodos
void addActionListener(ActionListener l)
369
Returns the command name of the action event fired by this button.
ActionListener[] getActionListeners()
String paramString()
void processActionEvent(ActionEvent e)
void processEvent(AWTEvent e)
Sets the command name for the action event fired by this button.
void setLabel(String label)
371
yp=y0-y;
//dibujar punto
g.drawOval((int) xp,(int) yp,2,2);
La salida del programa cuando se pulsa funcin seno y funcin parbola se muestra en
las siguientes figuras.
373
374
375
Si se cambia el tamao del applet y los controles no caben en una lnea, pasan a la lnea siguiente, como puede verse en la figura.
El cdigo fuente
Los controles son objetos de la clase Button,
y el gestor de diseo es un objeto de la clase FlowLayout. Una vez inicializados los
miembros dato, en la funcin miembro init se
establecen sus propiedades y se aaden al applet mediante la funcin add, una vez establecido el gestor de diseo mediante setLayout. Los pasos son los siguientes:
376
this.setLayout(flowLayout1);
this.add(btn1, null);
setBackground(Color.white);
btn1.setFont(new Font("Dialog",
btn1.setLabel("1");
btn2.setFont(new Font("Dialog",
btn2.setLabel("2");
btn3.setFont(new Font("Dialog",
btn3.setLabel("3");
btn4.setFont(new Font("Dialog",
btn4.setLabel("4");
flowLayout1.setHgap(20);
this.setLayout(flowLayout1);
this.add(btn1, null);
this.add(btn2, null);
this.add(btn3, null);
this.add(btn4, null);
1, 16));
1, 16));
1, 16));
1, 16));
377
this.add(btnOeste, BorderLayout.WEST);
En este ejemplo, se han creado cinco botones
cuyos ttulos son Oeste, Norte, Sur, Este y
Centro. Cuando se aplica el gestor BorderLayout al applet los cinco botones se disponen
como se muestra en la figura.
379
btn00.setLabel("00");
btn01.setFont(new Font("Dialog",
btn01.setLabel("01");
btn02.setFont(new Font("Dialog",
btn02.setLabel("02");
btn03.setFont(new Font("Dialog",
btn03.setLabel("03");
btn10.setFont(new Font("Dialog",
btn10.setLabel("10");
btn11.setFont(new Font("Dialog",
btn11.setLabel("11");
btn12.setFont(new Font("Dialog",
btn12.setLabel("12");
btn13.setFont(new Font("Dialog",
btn13.setLabel("13");
gridLayout1.setRows(2);
gridLayout1.setHgap(10);
gridLayout1.setColumns(3);
gridLayout1.setVgap(10);
this.setLayout(gridLayout1);
this.add(btn00, null);
this.add(btn01, null);
this.add(btn02, null);
this.add(btn03, null);
this.add(btn10, null);
this.add(btn11, null);
this.add(btn12, null);
this.add(btn13, null);
1, 16));
1, 16));
1, 16));
1, 16));
1, 16));
1, 16));
1, 16));
381
9.9.2. EL PANEL
Poner un panel en la parte inferior y cambiar
su propiedad name
Panel panelBotones = new Panel();
9.9.3. EL APPLET
Situar los siguientes controles sobre el applet cambiando su propiedad name.
Label
Label
Label
Label
Label
Label
Label
titulo=new Label();
nombre=new Label();
direccion=new Label();
pago=new Label();
telefono=new Label();
ciudad=new Label();
provincia=new Label();
TextField
TextField
TextField
TextField
textNombre=new TextField();
textDireccion=new TextField();
textCiudad=new TextField();
textProvincia=new TextField();
Font.BOLD
textNombre.setColumns(25);
textDireccion.setColumns(25);
textCiudad.setColumns(15);
textProvincia.setColumns(2);
btnPago.setLabel("Comprar");
btnCancelar.setLabel("Cancelar");
PROGRAMACION CON JAVA 2
383
La segunda fila, est formada por dos controles, nombre y a continuacin textNombre. El
primero est anclado (anchor) al este (WEST),
antes estaba en NORTH, gridwidth toma el valor 1 (por defecto) antes estaba en REMAINDER. Como textNombre es el ltimo control de
la fila gridwidth vuelve a tomar el valor REMAINDER. Los controles ocupan todo el espacio
horizontal disponible, la propiedad fill toma
el valor HORIZONTAL
gbc.fill=GridBagConstraints.HORIZONTAL;
gbc.anchor=GridBagConstraints.WEST;
gbc.gridwidth=1;
add(nombre, gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textNombre, gbc);
La tercera fila, est formada por dos controles: direccion y textDireccion. Las propiedades anchor y fill ya tienen fijados sus valores a WEST y HORIZONTAL, por lo que no hay
que volver a establecerlo. Como textDireccion
es el ltimo control de la fila su propiedad
gridwidth toma el valor REMAINDER.
gbc.gridwidth = 1;
add(direccion, gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textDireccion, gbc);
La cuarta fila, est formada por cuatro controles: ciudad, textCiudad, provincia y textProvincia. Cuando se coloca el ltimo control
textProvincia, su propiedad gridwidth toma el
valor REMAINDER.
gbc.gridwidth = 1;
add(ciudad, gbc);
add(textCiudad, gbc);
add(provincia, gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textProvincia, gbc);
La quinat fila, est formada por dos controles: pago y chPago. El cdigo es semejante,
salvo la propiedad fill que toma el valor NONE antes estaba en HORIZONTAL. Esto hace que
el control chPago no ocupe toda el rea disponible, extendindose horizontalmente hasta
385
titulo=new Label();
nombre=new Label();
direccion=new Label();
pago=new Label();
telefono=new Label();
ciudad=new Label();
provincia=new Label();
TextField
TextField
TextField
TextField
textNombre=new TextField();
textDireccion=new TextField();
textCiudad=new TextField();
textProvincia=new TextField();
setBackground(Color.lightGray);
//propiedades de los controles
titulo.setText("Compre algo ahora");
386
titulo.setFont(new
Font("Times-Roman",
Font.ITALIC, 16));
nombre.setText("Nombre:");
direccion.setText("Direccin:");
pago.setText("Mtodo de pago:");
telefono.setText("Telfono:");
ciudad.setText("Ciudad:");
provincia.setText("Provincia:");
Font.BOLD
textNombre.setColumns(25);
textDireccion.setColumns(25);
textCiudad.setColumns(15);
textProvincia.setColumns(2);
btnPago.setLabel("Comprar");
btnCancelar.setLabel("Cancelar");
chPago.add("Visa");
chPago.add("MasterCard");
chPago.add("Caja Ahorros");
//gestor gridBaglayout
setLayout(gbl);
//primera fila - ttulo
gbc.anchor=GridBagConstraints.NORTH;
gbc.insets=new Insets(0,0,10,0);
gbc.gridwidth=GridBagConstraints.REMAINDER;
add(titulo, gbc);
//segunda fila - nombre
gbc.fill=GridBagConstraints.HORIZONTAL;
gbc.anchor=GridBagConstraints.WEST;
gbc.gridwidth=1;
gbc.insets=new Insets(0,0,0,0);
add(nombre, gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textNombre, gbc);
//tercera fila - direccin
gbc.gridwidth = 1;
add(direccion, gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textDireccion, gbc);
//cuarta fila - ciudad
- provincia
gbc.gridwidth = 1;
add(ciudad, gbc);
add(textCiudad, gbc);
add(provincia, gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textProvincia, gbc);
//quinta fila - pago
gbc.gridwidth = 1;
add(pago, gbc);
gbc.insets=new Insets(5,0,5,0);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill=GridBagConstraints.NONE;
add(chPago, gbc);
//panel de los botones
panelBotones.setLayout(flowLayout1);
PROGRAMACION CON JAVA 2
387
panelBotones.add(btnPago);
panelBotones.add(btnCancelar);
388
gbc.anchor=GridBagConstraints.SOUTH;
gbc.insets=new Insets(15,0,0,0);
add(panelBotones, gbc);
CAPITULO DIEZ
HILO Y SINCRONIZACIN
La programacin multihilo es un paradigma conceptual de la
programacin por el cual se dividen los programs en dos o ms
procesos que se pueden ejecutar en paralelo. En un momento
dado pueden haber datos de entrada de usuario a los que responder, animaciones y visualizaciones de interfaz de usuario,
tambin clculos grandes que podran tardar varios segundos
en terminar, y nuestros programas tendrn que tratar con estos temas sin provocar retrasos desagradables al usuario.
Lo interesante de todos estos procesos en paralelo es que la
mayor parte de ellos realmente no necesitan los recursos completos de la computadora durante su vida operativa. El problema en los entornos de hilo nico tradicionales es que se
tiene que esperar a que se terminen cada una de estas tareas
antes de proseguir con la siguiente. Aunque la CPU est libre
la mayor parte del tiempo, tiene que colocar las tareas en la
cola ordenadamente.
389
una tarea que est lista para pasar a un modo de espera, y otra que s tenga algo que hacer, conseguiramos
realizar una cantidad mayor de trabajo en le mismo intervalo de tiempo.
Java se diseo partiendo de cero, en un mundo en el
que el entorno multihilo, a nivel de sistema operativo, era una realidad. El intrprete de Java hace uso
intensivo de hilos para multitud de propsitos, y todas las bibliotecas de clases se disearon teniendo en
mente el modelo multihilo. Una vez que un hilo comienza su tarea, puede suspenderse, lo que equivale a detener temporalmente su actividad. El hilo suspendido
puede reanudarse, lo que supone que contina su tarea
all donde la dej. En cualquier momento, un hilo puede deteriores, finalizando su ejecucin de manera inmediata. Una vez detenido, el proceso no puede reiniciarse.
10.1.2. SINCRONIZACIN
390
Ya que los hilos permiten y potencian el comportamiento asncrono de los programas, debe
existir alguna manera de forzar el sincronismo all donde sea necesario. Por ejemplo, si
desease que dos hilos se comunicasen para
compartir una estructura de datos compleja
(como una lista enlazada), necesitar alguna
manera de garantizar que cada uno se aparte
del camino del otro. Java incorpora una versin rebuscada de un modelo clsico para la
sincronizacin, el monitor. La mayor parte de
los sistemas multihilo implementan los monitores a modo de objetos, pero Java proporciona una solucin ms elegante: no existe la
clase monitor, cada objeto lleva asociado su
propio monitor implcito, en el que puede entrar sin ms que hacer una llamada a los mtodos synchronized del objeto. Una vez que el
hilo est dentro del mtodo synchronized,
A. GAMARRA M. D. GAMARRA M. J. GAMARRA M.
10.2. THREAD
En Java los hilos se representa mediante una clase. La
clase Thread encapsula todo el control necesario sobre
los hilos. Hay que tomar la precaucin de distinguir
claramente un objeto Thread de un hilo en ejecucin.
Un objeto Thread se define como el panel de control o
proxy de un hilo en ejecucin. En el objeto Thread hay
mtodos que controlan si el hilo se est ejecutando,
est durmiendo, en suspenso o detenido. La clase
Thread es la nica manera de controlar el comportamiento de los hilos. En la siguiente instruccin se
muestra como acceder al hilo en ejecucin actual:
Thread t = Thread.currentThread();
* el hilo actual se almacena en la variable t *
10.3. RUNNABLE
Si queremos tener ms de un hilo necesitamos crear
otra instancia de Thread. Cuando construimos una nueva
instancia de Thread, necesitamos decirle que cdigo
ejecutar en el nuevo hilo de control. Se puede comenzar un hilo sobre cualquier objeto que implemente la
interfaz Runnable.
Runnable es una interfaz simple que abstrae la nocin
de que se desea que algn cdigo se "ejecute" asncronamente. Para implementar Runnable, a una clase le
basta con implementar un solo mtodo llamado run. Este
es un ejemplo que crea un nuevo hilo.
391
java
ThreadDemo
actual:
Thread[main,
5,
main]
creado:
Thread[demo
Thread,
5,
main]
3
saliendo
del
2
1
saliendo del hilo hijo
hilo
main
10.5. SINCRONIZACIN
Cuando dos o ms hilos necesitan acceder de manera simultnea a un recurso de datos compartido necesitan
asegurarse de que slo uno de ellos accede al mismo
cada vez. Java proporciona un soporte nico, el monitor, es un objeto que se utiliza como cerrojo exclusivo. Solo uno de los hilos puede ser el propietario de
un monitor en un instante dado. Los restantes hilos
que estuviesen intentando acceder al monitor bloqueado
quedan en suspenso hasta que el hilo propietario salga
del monitor.
Todos los objetos de Java disponen de un monitor propio implcitamente asociado a ellos. La manera de acceder a un objeto monitor es llamando a un mtodo marcado con la palabra clave synchronized. Durante todo
el tiempo en que un hilo permanezca en un mtodo sincronizado, los dems hilos que intenten llamar a un
mtodo sincronizado sobre la misma instancia tendrn
PROGRAMACION CON JAVA 2
393
que esperar. Para salir del monitor y permitir el control del objeto al siguiente hilo en espera, el propietario del monitor slo tiene que volver del mtodo
notifyAll_: despierta todos los hilos que realizaron una llamada a wait sobre el mismo objeto. El
hilo con mayor prioridad de los despertados es el
primero en ejecutarse.
395
int n;
boolean valueSet = false;
synchronized int get() {
if (!valueSet)
try
wait();
catch(InterruptedException e);
System.out.println("Obtenido: " + n);
valueSet = false;
notify();
return n;
}
synchronized void put(int n) {
if (valueSet)
try
wait();
catch(InterruptedException e);
this.n = n;
valueSet = true;
System.out.println("Colocado: " + n);
notify();
}
}
class Producer implements Runnable {
Q q;
Producer (Q q) {
this.q = q;
new Thread(this, "Producer").start();
}
public void run() {
int y = 0;
while(true) {
q.put(i++);
}
}
}
class Consumer implements Runnable {
Q q;
Consumer(Q q) {
this.q = q;
new Thread(this, "Consumer").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);
}
}
396
10.6.1. BLOQUEOS
Los bloqueos son condiciones anmalas inusuales, pero muy difciles de depurar, donde dos
hilos presentan una dependencia circular sobre un par de objetos sincronizados. Por
ejemplo, si un hilo entra en el monitor sobre
el objeto X y otro hilo entra en le monitor
sobre el objeto Y, y si X intenta llamar a
cualquier mtodo sincronizado sobre Y, tal y
como cabe esperar quedar detenido. Sin embargo, si Y, por su parte, intenta llamar a
cualquier mtodo sincronizado con X, entonces
quedar esperando indefinidamente, ya que para conseguir el cerrojo de X tendra antes
que liberar su propio cerrojo en Y, con el
fin de que el primer hilo pudiera completarse.
que
la
deben
clase
yield: este mtodo hace que el intrprete cambie de contexto entre el hilo actual y el siguiente hilo ejecutable disponible. Es una manera de asegurar que
los hilos de menor prioridad no sufran
inanicin.
398
399
BIBLIOGRAFIA
401