You are on page 1of 140

Curso de J ava Standard Edition J 2SE 1

Dr. Federico Rivero Palacio


INSTITUTO UNIVERSITARIO DE TECNOLOGA
DR. FEDERICO RIVERO PALACIO
DEPARTAMENTO DE I NFORMTI CA








CURSO

J
J
a
a
v
v
a
a S
ST TA AN ND DA AR RD D E
ED DI IT TI IO ON N J
J
2
2
S
S
E
E



















Caracas, 2006

Curso de J ava Standard Edition J 2SE 2
Java Standad Edition J2SE






Elaborado por:
- Prof. Castaeda, Marbella
- Prof. Hidalgo, Erika
- Prof. Ramos, Darwin
- Prof. Rivas, Ronel




Docentes del Departamento de Informtica del Instituto Universitario de Tecnologa
Dr. Federico Rivero Palacio.
Caracas, 2005


Curso de J ava Standard Edition J 2SE 3

C CO ON NT TE EN NI ID DO O D DE EL L C CU UR RS SO O

Tema I. Fundamentos de Java
Tema II. Clases, objetos y paquetes
Tema III. Herencia, clases abstractas e interfaces
Tema IV. Excepciones
Tema V. Entrada/Salida
Tema VI. Tecnologas de acceso a datos
Tema VII. Interfaces Grficas
Apndice 1. Herramientas y Utilidades de Desarrollo

























Curso de J ava Standard Edition J 2SE 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
TEMA I : Fundament os de Java


OBJ ETI VOS:
Describir la Plataforma J ava y las caractersticas del lenguaje de programacin J ava.
Realizar la declaracin e inicializacin de variables simples u objetos en J ava.
Describir el funcionamiento de los operadores y estructuras de control en J ava.

CONTENIDO:
Orgenes del Lenguaje
El lenguaje de programacin J ava
Caractersticas del Lenguaje
J ava vs C/C++
La plataforma J ava
Los tipos de datos de J ava
Identificadores
Operadores de J ava
Estructuras de Control

4
Curso de J ava Standard Edition J 2SE 5
1 1. . O OR R G GE EN NE ES S D DE EL L L LE EN NG GU UA AJ J E E

La creacin y desarrollo de los lenguajes de programacin se rige por dos factores bsicos: el
perfeccionamiento del arte de programar y agregar cambios al mbito de la computacin.

El lenguaje de programacin J ava no es una excepcin, ya que se genera partiendo del extenso
legado de C y C++, y agrega refinamiento y caractersticas que reflejan el estado actual de la
programacin. Este lenguaje fue concebido por J ames Gosling, Patrick Naughton, Chris Warth, Ed
Frank y Mike Sheridan para Sun Microsystems, en 1991. Se le llam inicialmente Oak pero despus
en 1995, se renombr como J ava.

La razn ms importante para la creacin de este lenguaje era la necesidad de crear un lenguaje
independiente de la plataforma y que se pudiera usar para crear software incorporable en
dispositivos electrnicos, como televisores, hornos microondas, neveras, etc. En la bsqueda de
una solucin, se trabaj en un lenguaje porttil de plataforma cruzada que generase cdigos que se
pudiesen ejecutar en distintos CPU para diversos ambientes.

Como se puede observar la motivacin inicial de J ava no era la Internet, pero a pesar de esto, el
mismo est fuertemente ligado a la red, ya que mientras se elaboraban los detalles de J ava,
apareci un factor que jugara un papel crucial en el futuro de este lenguaje: La World Wide Web. El
equipo de desarrolladores de J ava observ que este nuevo entorno presentaba los mismos
requerimientos que ellos perseguan cubrir con J ava: programas de cdigo pequeo, confiable,
seguro e independiente de la plataforma. Si el mundo Web no hubiese tomado forma a la vez
que se estaba implementado J ava, J ava podra haber sido un lenguaje til pero dedicado a la
programacin de dispositivos electrnicos para el consumo.


2 2. . E EL L L LE EN NG GU UA AJ J E E D DE E P PR RO OG GR RA AM MA AC CI I N N J J A AV VA A

J ava es en esencia un lenguaje de programacin orientado a objetos. Sin embargo, J ava no es solo
un lenguaje de programacin, sino que tambin define una plataforma en la que las aplicaciones
pueden ser desarrolladas y ejecutadas.

La mayora de las caractersticas bsicas de J ava provienen de C y C++. Esto se hizo
intencionalmente, a fin de hacer atractivo al lenguaje para el gran nmero de programadores de C y
C++. J ava provee un ambiente de programacin poderoso y lgicamente consistente, que contiene
los mejores elementos del pasado y le agrega nuevas caractersticas necesarias para ambientes en
lnea. Uno de los aspectos centrales de la filosofa del diseo en C, C++ y J ava, es que el
programador ejerce el control; excepto por las restricciones que impone el ambiente Internet.

El diseo de J ava es tal que, es multiplataforma en cdigo fuente y la forma binaria compilada. Esto
es posible, ya que J ava compila su cdigo fuente en un bytecode intermedio e independiente de la
plataforma. Este bytecode es interpretado usando un intrprete especfico de la plataforma, es decir
la Mquina Virtual de J ava (J ava Virtual Machine J VM) en tiempo de ejecucin del programa.


El lenguaje de programacin J ava permite desarrollar bsicamente dos tipos de programas:
aplicaciones y applets. Una aplicacin es un programa autnomo que puede ejecutarse en una
computadora, bajo el sistema operativo de esa computadora. Un applet es un pequeo programa
J ava que puede se embebido en una pgina HTML. Aunque, se pueden desarrollar programas de
consola, esta no es su orientacin.




Curso de J ava Standard Edition J 2SE 6
3 3. . C CA AR RA AC CT TE ER R S ST TI I C CA AS S D DE EL L L LE EN NG GU UA AJ J E E

A continuacin se presentan las principales caractersticas que han convertido a J ava en un lenguaje
sumamente popular.

- Simple: J ava es bastante fcil de aprender, dado que tiene la sintaxis de C/C++. Es muy fcil
que un programador experimentado la domine, ya que solo se necesita una comprensin
apropiada de los conceptos de programacin orientada a objetos. Adems de su similitud con
C/C++, J ava tiene otra caracterstica que lo hace simple, y es que J ava hace un esfuerzo por no
tener caractersticas sorprendentes. En J ava hay un nmero reducido de formas claras para
abordar una tarea dada.

- Orientado a Objetos: J ava no se cre para ser compatible en cdigo fuente con otros
lenguajes. Esto otorg a los desarrolladores de J ava la libertad de disear un lenguaje partiendo
de cero. El resultado de esto fue una aproximacin limpia, til y pragmtica a los objetos, en un
lenguaje puramente orientado a objetos. El modelo de objetos J ava es simple y fcil de ampliar,
mientras los tipos simples permanecen como no objetos de alto rendimiento.

- Portable: J ava, usa un conjunto optimizado de instrucciones, diseado para ser ejecutado por
una Mquina Virtual, que es emulada por el sistema en tiempo de ejecucin de J ava. Este
conjunto de instrucciones se conoce como BYTECODE, que representa la salida de un compilador
de J ava. Esto significa que el sistema de tiempo de ejecucin de J ava es un Intrprete de
BYTECODE. Debido a esto, slo el sistema de tiempo de ejecucin de J ava tiene que ser
implementado para cada plataforma, y una vez que este paquete existe para un sistema,
cualquier programa J ava puede correr en l.

- Interpretado y de Alto Rendimiento: J ava fue diseado para ser un lenguaje interpretado, a
fin de solucionar los aspectos relacionados con la descarga a travs de la Internet. Ejecutar
programas de J ava en diferentes entornos es una tarea simple debido a que estos programas
(BYTECODE) son Interpretados por una Mquina Virtual J ava. A pesar de que el BYTECODE de J ava
es interpretado, est diseado de tal forma que fcil de traducir a cdigo mquina nativo para
alto rendimiento.

- Seguro: Una de las principales caractersticas de J ava, es que la ejecucin de un programa J ava
est limitada al entorno de ejecucin J ava, por lo que no se proporciona acceso a partes
restringidas del computador. Esto lo garantiza la caracterstica de ser un lenguaje interpretado,
ya que el sistema de tiempo de ejecucin puede contener un programa y evitar que produzca
efectos colaterales fuera del sistema, obedeciendo al hecho que la Mquina Virtual controla la
ejecucin de cada programa J ava.

- Robusto: Siendo un lenguaje estrictamente tipificado, J ava verifica el cdigo del programador
en tiempo de compilacin, y adems en tiempo de ejecucin. J ava da una alta prioridad a la
capacidad de generar programas confiables, a fin de enfrentar las extraordinarias demandas
provenientes del entorno multiplataforma de Internet.

- Multihilo: J ava fue diseado para cumplir el requisito del mundo real de crear programas env
red interactivos. Para conseguir esto, J ava proporciona la programacin multihilo, que permite
escribir programas que realicen varias cosas a la vez. El intrprete J ava permite la sincronizacin
de multiprocesos, que permite la construccin de programas interactivos, que se ejecuten
eficientemente.
Curso de J ava Standard Edition J 2SE 7
- Distribuido: J ava fue diseado para el entorno distribuido de Internet, por lo que trabaja con
el protocolo TCP/IP. J ava incorpora capacidades para el envo de mensajes que haca posible
que los objetos en computadoras separadas ejecutaran procedimientos en forma remota. Esta
caracterstica le proporciona una abstraccin nica para la programacin Cliente-Servidor.

- Dinmico: En J ava el cdigo puede ser enlazado dinmicamente en forma segura. Esto es
posible por las grandes cantidades de data en tiempo de ejecucin que procesan los programas
de J ava, que es usada para la verificacin y resolucin de accesos a objetos en tiempo de
ejecucin. Esta caracterstica es importante para la robustez del entorno de applets, y hace
posible actualizar dinmicamente pequeos bits del BYTECODE en un sistema en plena ejecucin.


4 4. . J J A AV VA A v vs s C C/ / C C+ ++ +

Comparado con C++, J ava es considerado un lenguaje puramente orientado a objetos, debido a que
los programas J ava requieren necesariamente el uso de objetos y no como en C++, en donde se
pueden escribir programas hbridos. En J ava no existen funciones ni variables globales; todas las
interfaces con data de objetos deben ser definidas en las bibliotecas de clases.

J ava es robusto considerando sus tcnicas de administracin de memoria, ya que administra la
asignacin y liberacin de memoria de forma automtica. A diferencia de C/C++ en donde el
programador debe asignar y liberar manualmente la memoria dinmica.

Los desarrolladores de J ava aadieron la caracterstica de la recoleccin automtica de basura. En
C/C++ una fuente complejidad en muchas aplicaciones es la administracin de almacenamiento,
que significa asignacin y liberacin de memoria. La recoleccin de basura que efectivamente
significa liberacin peridica de memoria que no est siendo referenciada, asegura que J ava no solo
facilita la programacin, sino ayuda a reducir drsticamente los errores en tiempo de ejecucin.

J ava omite muchas caractersticas de difcil comprensin de C++. Estas caractersticas omitidas
consisten principalmente en la sobrecarga de operadores, la herencia mltiple y las conversiones
automticas extensivas.

La mayor diferencia entre J ava y C/C++, es la caracterstica de J ava de ser Multiplataforma. En
C/C++ es imposible ejecutar el mismo archivo objeto en diversas plataformas. El diseo de J ava es
tal que es multiplataforma tanto el cdigo fuente como el cdigo binario.


5 5. . L LA A P PL LA AT TA AF FO OR RM MA A J J A AV VA A

Una plataforma se define como el entorno de hardware y/o software sobre el cual se ejecutan los
programas. La plataforma J ava es una plataforma de slo software, que se ejecuta sobre cualquier
otra plataforma basada en hardware. J ava posee tres grandes plataformas: la J 2SE (J ava 2 Platform
Standard Edition), la J 2EE (J ava 2 Platform Enterprise Edition) y la J 2ME (J ava 2 Platform Micro
Edition).

La J ava 2 Platform Standard Edition J 2SE (Plataforma J ava 2 Edicin Estndar) es un
conjunto de especificaciones que describen el ambiente de desarrollo de aplicaciones J ava. Est ser
la plataforma a estudiar en este curso.






Curso de J ava Standard Edition J 2SE 8
En la siguiente grfica se describe la plataforma J 2SE:



Grfico 1. Plataforma J ava 2 Edicin Estndar

El J 2SDK (Equipo Estndar de Desarrollo - SDK), es un ambiente de desarrollo para construir
aplicaciones, applets, y componentes usando el lenguaje de programacin J ava. El J ava 2 SDK,
incluye un conjunto de herramientas y utilidades de desarrollo as como tambin el ambiente de
ejecucin J ava.


5 5. .1 1. . H HE ER RR RA AM MI I E EN NT TA AS S Y Y U UT TI I L LI I D DA AD DE ES S D DE E D DE ES SA AR RR RO OL LL LO O

Es un conjunto de herramientas para desarrollar y probar programas escritos en el lenguaje J ava y
ejecutarlos en la plataforma J ava. Estn diseadas para ser usadas desde la lnea de comandos.
Generalmente se agrupan en las siguientes categoras:

- Bsicas: herramientas fundamentales del SDK que se usan para crear y construir
aplicaciones. Algunas de las herramientas bsicas que usaremos en este curso se describen
a continuacin:



SOLARIS LINUX WINDOWS OTRO

J AVA RUNTI ME ENVI RONMENT - J RE
A AP PI I
Ncleo Integracin
Interfaces de
Usuario
T TE EC CN NO OL LO OG G A AS S D DE E D DE ES SP PL LI I E EG GU UE E
J ava Web Start
J ava Plug-in
MQUI NA VI RTUAL DE J AVA
J ava HotSpot
Client VM
J ava HotSpot
Server VM
HERRAMI ENTAS/ UTI LI DADES DE DESARROLLO
Bsicas
Plug-in
RMI
Seguridad IDL y RMI-IIOP
Internacionalizacin
J J 2 2S SD DK K
Componentes

Componentes a utilizar

Plataformas
Curso de J ava Standard Edition J 2SE 9
H HE ER RR RA AM MI I E EN NT TA A C CO OM MA AN ND DO O F FU UN NC CI I N N
Compilador
(javac)
javac myProg.java
Genera el cdigo binario de uno o
varios programas J ava.
Depurador
(jdb)
jdb myProg
Permite verificar la semntica de la
aplicacin.
Lanzador de
aplicacin (java)
java myProg
Invoca a la Mquina Virtual de J ava
para que ejecute la aplicacin.
Documentador
(javadoc)
javadoc myProg.java
Evala la declaracin y los comentarios
de un conjunto de programas y
produce un conjunto de pginas HTML
que describen las clases, interfaces,
constructores, atributos y mtodos.

- RMI : herramientas que te permiten crear aplicaciones que interactan entre redes, tales
como la Web.

- Internacionalizacin: herramientas que te permiten crear aplicaciones que puedan ser
adaptadas a cualquier idioma y regin. El estudio de estas herramientas esta fuera del
alcance de este curso.

- Seguridad: herramientas que te permiten establecer polticas de seguridad en tu sistema
operativo y crear aplicaciones que puedan trabajar dentro del alcance de estas polticas y
permitir, de forma segura, el acceso a tu aplicacin desde sitios remotos. El estudio de estas
herramientas esta fuera del alcance de este curso.

- I DL y RMI -I IOP: herramientas utilizadas para crear aplicaciones que usen el estndar
OMG IDL y CORBA/IIOP.

- J ava Plug-in: utilidades para usar en conjunto con el J ava Plug-in.


5 5. .2 2. . E EL L A AM MB BI I E EN NT TE E E EN N T TI I E EM MP PO O D DE E E EJ J E EC CU UC CI I N N D DE E J J A AV VA A J J R RE E

El J ava 2 Runtime Environment (Ambiente de Ejecucin de J ava - J RE), permite ejecutar
aplicaciones escritas en J ava. Contiene la Mquina Virtual de J ava, las clases comprendidas en la API
de J ava y las tecnologas de despliegue.

- La Mquina Virtual de J ava - J VM: La J ava Virtual Machine es una computadora
abstracta implementada sobre una plataforma particular que interpreta el cdigo binario o
BYTECODE y lo ejecuta en esa plataforma, limitando el acceso a otras partes del sistema. La
J VM (J VM) se compone de las siguientes partes:
o J ava HotSpot Client VM: diseado para ejecutar las aplicaciones en un ambiente de
Cliente, reduciendo el tiempo de carga de una aplicacin y la paginacin de
memoria.
o J ava HotSpot Server VM: diseado para obtener las mximas velocidades de
ejecucin en un ambiente de Servidor.

- La Interfaz de Programacin de Aplicaciones API: La Interfaz de Programacin de
Aplicaciones J ava (API), es una conjunto de partes de software (clases e interfaces)
organizada, coherente y consistente en paquetes. Estas clases, suelen agruparse de acuerdo
al servicio que prestan:
Curso de J ava Standard Edition J 2SE 10
o Ncleo (proveen el conjunto de paquetes esenciales para crear aplicaciones J ava,
tales como: fundamentos del lenguaje, utilidades del lenguaje, procesos de E/S,
comunicacin de redes, preferencias, colecciones, J NI, seguridad, XML, cifrado y
componentes).
o Integracin (proveen el conjunto de paquetes que te permiten crear aplicaciones
que puedan invocar mtodos/procedimientos remotos, comunicarse con bases de
datos y crear servicios de nombres y directorios).
o Interfaces de Usuario: proveen el conjunto de paquetes para la creacin de
aplicaciones con amigables interfaces graficas de usuario (AWT y Swing).

- Tecnologas de despliegue: estn representadas por la J ava Web Start y el J ava
Plugin, que son tecnologas que permiten ejecutar aplicaciones J ava desde Internet.


6 6. . L LO OS S T TI I P PO OS S D DE E D DA AT TO OS S D DE E J J A AV VA A

En la base de cualquier lenguaje de programacin estn sus tipos de datos y operadores, y java no
es la excepcin. Los tipos de datos son importantes en J ava, porque este es un lenguaje
fuertemente tipeado. Esto significa que todas las expresiones tienen algn tipo cuya
compatibilidad es verificada por el compilador.

J ava contiene dos categoras generales de tipos de datos incorporados: el orientado a objetos y el
no orientado a objetos. Los tipos de J ava orientado a objetos son definidos por clases y los no
orientados a objetos, son los que nosotros llamamos tipos de datos simples.

- Tipos de datos simples: Estos tipos de datos son tambin llamado elementales o
primitivos y a partir de stos, pueden ser construidos otros tipos de datos. J ava especifica
un rango estricto y un comportamiento para cada tipo simple, que deben soportar las
implementaciones de la Mquina Virtual de J ava. Por ejemplo, una variable de tipo int es
igual en todos los entornos de ejecucin. Esto permite que los programas sean
transportables. Los tipos simples permitidos en J ava son:

TI PO SIGNI FICADO # BITS RANGO
VALOR
INICIAL
boolean Representa valores true/false 16 true / false false
char Carcter (Unicode) 16 0 a 65.536 \u0000
float Real de simple precisin 32 1,7e-308 a 1,7e+308 0.0f
double Real de doble precisin 64 3,4e-38 a 3,4e+38 0.0
byte Enteros de 8 bits 8 -128 a 127 0
short Entero corto 16 -32.768 a 32.767 0
int Entero 32 -2.147.483.648 a 2.147.483.647 0
long
Entero largo 64
-9.223.372.036.854.775.808
9.223.372.036.854.775.807
0L

o Conversiones implcitas de tipos: En la programacin es comn asignar un tipo
de variable a otro. Por ejemplo se pudiese querer asignar un valor int a una variable
float.
int i; float f;
i = 10; f = i;

Cuando se mezclan tipos compatibles en una asignacin, el valor del lado derecho
es automticamente convertido al tipo del lado izquierdo. De modo que en el
ejemplo anterior, el valor de i es convertido en float y luego asignado a f. Sin
Curso de J ava Standard Edition J 2SE 11
embargo, no todos los tipos son compatibles, por lo que no todas las conversiones
son compatibles. Por ejemplo, boolean e int no son compatibles.

En resumen, cuando un tipo de datos se destina a otro tipo de variables, se realiza
una conversin de tipo automtica, si se cumplen dos condiciones:
1. Los dos tipos son compatibles.
2. El tipo destino es ms grande que el tipo de origen.

Cuando se cumplen estas dos condiciones, tiene lugar una conversin implcita. Por
ejemplo, el tipo int siempre es suficientemente grande como para almacenar todos
los valores byte. Un long a double es una conversin implcita que es
automticamente desarrollada. No hay conversin implcita de los tipos numricos a
char o boolean. Tampoco char y boolean son compatibles entre si. Sin embargo, un
literal entero puede ser asignado a char.

BYTE SHORT INT LONG FLOAT DOUBLE
1byte 2bytes 4bytes 8bytes 4bytes 8bytes

- Tipos de datos orientados a objetos: Estos tipos de datos son clases construidas a
partir de los tipos de datos simples. J ava especifica un conjunto de clases que permiten
realizar programas J ava 100% orientados a objetos, y esto es lo que hace a los programas
transportables. Los tipos orientados a objetos proporcionados en J ava, se encuentran
almacenados en paquete java.lang, y stos son:

o Object: Object es la superclase de todas las dems clases, representa la clase ms
arriba en la jerarqua de todos los objetos en J ava. Algunos de los mtodos que
define la clase Object y que estn disponibles para todos los objetos son:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
Object Clone() Throws Throwable
Crea un nuevo objeto idntico al objeto que llama
al mtodo.
boolean equals(Object objeto)
Devuelve true si el objeto que llama mtodo es
equivalente a objeto.
void finalize () throws Throwable
Mtodo finalize() por omisin. El mtodo finalize
es semejante a los destructores.
final Class getClass()
Obtiene un objeto Class que describe el objeto
que declara el mtodo.
String toString() Devuelve una cadena que describe al objeto.

o String: En muchos lenguajes de programacin, una cadena es un arreglo de
caracteres. Este no es el caso de J ava. En J ava, las cadenas son objetos. Cuando se
crea una cadena literal, realmente, se est creando un objeto String. Por ejemplo, el
literal Hola, es elaborado automticamente, por J ava, dentro de un objeto String.
Las cadenas simplemente se construyen como cualquier otro objeto, utilizando el
operador new y llamando al constructor de la clase; en este caso la llamada se
hace al constructor de String, el cual tiene dos formas: Sin parmetro y con un
objeto String, como parmetro, para inicializar la cadena.
Ejemplos de construccin de cadenas:
String cad = new String ();
String cad1 = new String (Hola);
String cad2 = new String (cad1);
String cad3 = Hola Mundo;
Curso de J ava Standard Edition J 2SE 12

Algunos de los mtodos que define la clase String se presentan a continuacin:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
boolean equals (String str)
Devuelve true si la cadena invocada contiene la
misma secuencia de caracteres que str.
int length () Obtiene y retorna la longitud de la cadena
char charAt (int index)
Obtiene el carcter que se encuentra, dentro de la
cadena, en la posicin index. Las cadenas se
comienzan a numerar en 0.
int compareTo (String str)
Retorna un valor menor que cero si la cadena
invocada es menor que str, y un valor mayor que
cero si la cadena es mayor que str y cero si las
cadenas son iguales.
int indexOf (String str)
Busca en la cadena invocada la subcadena
especificada por str. Regresa el ndice de la primera
correspondencia -1 en caso de falla.
int lastIndexOf (String str)
Busca en la cadena invocada la subcadena
especificada por str. Regresa el ndice de la ltima
correspondencia -1 en caso de falla.

o Character: representa la abstraccin orientada a objeto, del tipo de dato simple
char. Algunos de los mtodos que define la clase Carcter se presentan a
continuacin:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
Static Boolean IsDefined(char Ch)
Devuelve true si Ch est definido por Unicode,
en caso contrario, devuelve false.
Static Boolean IsDigit(char Ch)
Devuelve true si Ch es un dgito, devuelve
false.
Static Boolean IsLetter(char Ch)
Devuelve True si Ch es una letra, en caso
contrario devuelve False.
Static Boolean IsLetterOrDigit(char Ch)
Devuelve True si Ch es una letra o un dgito, en
caso contrario devuelve False.
Static Boolean IsLowerCase(char Ch)
Devuelve True si Ch es una letra minscula, en
caso contrario devuelve False.
Static Boolean IsSpace(char Ch)
Devuelve True si Ch es un espacio en blanco,
en caso contrario devuelve False.
Static Boolean IsTitleCase(char Ch)
Devuelve True si Ch es carcter de ttulo
Unicode, en caso contrario devuelve False.
Static Boolean IsUpperCase(char Ch)
Devuelve True si Ch es una letra mayscula, en
caso contrario devuelve False.
Static char toLowerCase (char Ch) Devuelve la letra minscula equivalente a Ch
Static char toTitleCase (char Ch) Devuelve la letra de ttulo equivalente a Ch
Static char toUpperCase (char Ch) Devuelve la letra mayscula equivalente a Ch

Curso de J ava Standard Edition J 2SE 13
o Number: clase abstracta que define una superclase que es implementada por las
clases que envuelven los tipos numricos int, long, float y double. Number tiene
mtodos abstractos que devuelven el valor del objeto en cada uno de los tipos
simple, es decir, doubleValue() devuelve el valor como un double. floatValue ()
devuelve el valor como un float y as sucesivamente. A continuacin se muestran
estos mtodos:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
public abstract int intValue()
Devuelve el valor especificado como un int.
Este mtodo puede involucrar redondeo.
public abstract long longValue()
Devuelve el valor especificado como un long.
Este mtodo puede involucrar redondeo.
public abstract float floatValue()
Devuelve el valor especificado como un float.
Este mtodo puede involucrar redondeo.
public abstract double doubleValue()
Devuelve el valor especificado como un double.
Este mtodo puede involucrar redondeo.
public short shortValue()
Devuelve el valor especificado como un short.
Este mtodo puede involucrar redondeo.

o Integer: esta clase es una envoltura para los tipos de datos simples int, short y
byte. Los constructores para la clase Integer son:

Integer (int)
Integer (String) throws NumberFormatException

Esta clase define las constantes MIN_VALUE y MAX_VALUE, que establecen el rango
de valores que puede representar un objeto de esta clase. A continuacin se
muestran estos mtodos:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
boolean equals (Object objInteger)
Devuelve true si el objeto Integer que lo llama
es equivalente a objInteger
static int parseInt (String)
Devuelve un valor entero equivalente al nmero
contenido en la cadena str.
static int parseInt (String, int)
Devuelve un valor entero equivalente al nmero
contenido en la cadena str usando la base.
static Integer valueOf (String)
Devuelve un Integer que contiene el valor
especificado por la cadena str.
static Integer valueOf (String, int)
Devuelve un Integer que contiene el valor
especificado por la cadena str usando la base
indicada.
Todos estos mtodos arrojan la excepcin NumberFormatException

o Long: esta clase es una envoltura para los tipos de datos simples int, short y byte.
Los constructores para la clase Long son:
Long (int)
Long (String) throws NumberFormatException

Esta clase define las constantes MIN_VALUE y MAX_VALUE, que establecen el rango
de valores que puede representar un objeto de esta clase. A continuacin se
muestran estos mtodos:
Curso de J ava Standard Edition J 2SE 14

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
boolean equals (Object)
Devuelve true si el objeto Long que lo llama es
equivalente a objLong
static long parseLong (String)
Devuelve un valor long equivalente al nmero
contenido en la cadena str.
static long parseLong (String, int)
Devuelve un valor long equivalente al nmero
contenido en la cadena str usando la base
indicada.
static Long valueOf (String)
Devuelve un Long que contiene el valor
especificado por la cadena str.
static Long valueOf (String, int)
Devuelve un Long que contiene el valor
especificado por el String usando la base int.
Todos estos mtodos arrojan la excepcin NumberFormatException

o Double: esta clase es una envoltura para el tipo de dato simple double. Los
constructores para la clase Double son:

Double (int)
Double (double)
Double (String) throws NumberFormatException

Esta clase define las constantes MIN_VALUE y MAX_VALUE, que establecen el rango
de valores que puede representar un objeto de esta clase. Igualmente define las
constantes NaN (No es nmero), POSITIVE_INFINITY (Infinito Positivo) y
NEGATIVE_INFINITY(Infinito Negativo). A continuacin se muestran estos mtodos:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
boolean equals (Object objDouble)
Devuelve true si el objeto Double que lo llama
es equivalente a objDouble
boolean isInfinite ()
Devuelve true si el objeto contiene un valor
infinito. En caso contrario, devuelve false.
static boolean isInfinite(float num)
Devuelve true si num contiene un valor
infinito. En caso contrario, devuelve false.
boolean isNaN ()
Devuelve true si el objeto contiene un valor
que no es nmero. En caso contrario, devuelve
false.
static boolean isNaN (float num)
Devuelve true si num contiene un valor que no
es un nmero. En caso contrario, devuelve
false.
static Double valueOf (String str)
Devuelve un objeto Double que contiene el
valor especificado por la cadena String
static double parseDouble(String str)

Devuelve un valor double equivalente al
nmero contenido en la cadena str.
Todos estos mtodos arrojan la excepcin NumberFormatException


o Float: esta clase es una envoltura para el tipo de dato simple float. Los
constructores para la clase Float son:

Curso de J ava Standard Edition J 2SE 15
Float (int)
Float (double)
Float (String) throws NumberFormatException

Esta clase define las constantes MIN_VALUE y MAX_VALUE, que establecen el rango
de valores que puede representar un objeto de esta clase. Igualmente define las
constantes NaN (No es nmero), POSITIVE_INFINITY (Infinito Positivo) y
NEGATIVE_INFINITY(Infinito Negativo). A continuacin se muestran estos mtodos:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
boolean equals (Object objFloat)
Devuelve true si el objeto Float que lo llama es
equivalente a objFloat
boolean isInfinite ()
Devuelve true si el objeto contiene un valor
infinito. En caso contrario, devuelve false.
static Boolean isInfinite (float num)
Devuelve true si num contiene un valor
infinito. En caso contrario, devuelve false.
boolean isNaN ()
Devuelve true si el objeto contiene un valor
que no es nmero. En caso contrario, devuelve
false.
static Boolean isNaN (float num)
Devuelve true si num contiene un valor que no
es un nmero. En caso contrario, devuelve
false.
static Float valueOf (String str)
Devuelve un objeto Float que contiene el valor
especificado por la cadena String
static float parseFloat (String str)
Devuelve un valor float equivalente al nmero
contenido en la cadena str.
Todos estos mtodos arrojan la excepcin NumberFormatException

o Boolean: esta es una envoltura muy simple alrededor de valores boolean que slo
es til cuando se quiere pasar una variable bolean por referencia. Esta clase
contiene las constantes TRUE y FALSE, que definen un objeto Boolean true y false.
A continuacin se muestran constructores de esta clase:
Boolean (boolean ValorBoolean)
Boolean (String CadenaBoolean)

En el primer constructor, la variable ValorBoolean tiene que ser true o false. En el
segundo constructor, si CadenaBoolean contiene la cadena true (en maysculas o
minsculas), entonces el nuevo objeto Boolean ser TRUE, en caso contrario ser
FALSE.
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
Boolean booleanValue() Devuelve el valor boolean equivalente al objeto
Boolean equals(Boolean)
Devuelve true si el objeto es equivalente al Objeto
Bolean pasado por parmetro
Static Boolean getBoolean(String)
Devuelve true si la propiedad del sistema
especificada por el String es true. En caso
contrario, devuelve false.
Int hashCode() Devuelve el cdigo hash del objeto
String toString() Devuelve la cadena equivalente al objeto.
Static Boolean valueOf(String)
Devuelve true si String contiene la cadena true
(en maysculas o minsculas), sino false.
Curso de J ava Standard Edition J 2SE 16

o Arreglos Unidimensionales: En J ava los arreglos son considerados variables
orientadas a objetos. Los elementos de los arreglos se indexan a partir de 0, para lo
cual se debe utilizar un ndice entero. Debido a que los arreglos estn
implementados como objetos: es posible asignar una variable de referencia de
arreglo a otra y simplemente est intercambiando aquel objeto al cual la variable se
refiere. Cada arreglo tiene asociado, una variable de instancia length, que posee el
nmero de elementos que la variable es capaz de almacenar (tamao del arreglo).
Para crear un arreglo, se deben seguir los siguientes pasos: declaracin,
construccin e inicializacin.
Declaracin de una arreglo:
boolean booleans[]; int ints[];
byte bytes[]; float floats[];
short[] shorts; long longs[];
char chars[]; double[] doubles;
Integer enteros []; Character [] caracteres;
En la declaracin de un arreglo, los corchetes pueden ser colocados tanto
antes como despus del nombre del arreglo. La declaracin de un arreglo
no reserva espacio memoria, esto solo declara la variable.

Construccin de una arreglo:
Los Arreglos son construidos a travs de la palabra reservada new. Cuando
se construye un arreglo el tamao del mismo debe ser provisto.
short arreglo[];
arreglo = new short[5];
double [] arr = new double [10];

Inicializacin de un arreglo:
Cuando un arreglo es construido en J ava, sus elementos son inicializados
automticamente con los valores por omisin, en caso de no haber una
inicializacin explicita.
int ints[] = new int []{10,20,30,40};
double [] reales = new double [3]; Todos los elementos del arreglo con 0.0d

J ava no permite desbordar los lmites de un arreglo en tiempo de ejecucin, cuando
se intenta esto, se genera un mensaje de error representado por la excepcin
ArrayIndexOutOfBoundsExeption, y termina la ejecucin del programa.

o Arreglos Multidimensionales: En J ava los arreglos multidimensionales son
considerados como arreglos de arreglos. Como un arreglo bidimensional es un
arreglo de arreglos, la variable de instancia length contendr el nmero de arreglos
almacenados. La forma de obtener el nmero de elementos de uno de los arreglos
es la siguiente: sample[2].length.

La forma general de Declarar un arreglo multiidimensional:
tipo nombreArreglo[][]= new tipo[N Filas][N Columnas] ;

La forma de acceder una posicin del arreglo, es la siguiente:
Arreglo [3] [5];

Los arreglos multidimensionales son inicializados colocando los valores iniciales de
cada sub-arreglo dentro de su propio conjunto de corchetes:
Curso de J ava Standard Edition J 2SE 17

tipo nombreArreglo [] = {
{Valor1, Valor2, ... , Valor
N
};
{Valor1, Valor2, ... , Valor
N
};
. . .
{Valor1, Valor2, ... , Valor
N
};

};

Cuando se reserva memoria para un arreglo multidimensional, slo se necesita
especificar la memoria para la primera dimensin. Despus debe reservarse la
memoria, separadamente, para las otras dimensiones restantes no es necesario
reservar el mismo nmero de elemento para cada dimensin. Ejemplo:

int sample [][] = new [3][];
sample [0] = new int [2];
sample [1] = new int [4];
sample [2] = new int [3];


7 7. . I I D DE EN NT TI I F FI I C CA AD DO OR RE ES S

Los identificadores usados en J ava siguen reglas estndar: comienzan con una letra y pueden
contener slo letras, nmeros, los caracteres underscore (_) y dlar ($). Adems no deben incluir
espacios. No existe restriccin de longitud para los identificadores de J ava. Los identificadores en
J ava son sensibles a maysculas y minsculas.

- Convencin de Nombres. Generalmente, la primera letra en el nombre de la variable o en
el nombre de un mtodo est en minscula, mientras que la primera letra en un nombre de
clase est en mayscula.

- Declaraciones. Las declaraciones de variables en J ava contienen el nombre del tipo y
luego una lista de los nombres de las variables, donde los nombres de las variables son
separados por comas. Todas las sentencias en J ava terminan con punto y coma. Es
importante destacar que en J ava las variables pueden ser inicializadas en la sentencia de
declaracin.

- Inicializacin. Al igual que ocurre en C++, J ava tambin permite la declaracin de
variables en cualquier parte del cdigo del programa. A diferencia de C++, el compilador de
J ava no permite usar la variable antes de su inicializacin. En el caso de C++, se genera un
mensaje de advertencia, mientras que en J ava, se genera un error de compilacin. Esta es
una ilustracin del intento de J ava por asegurar la portabilidad, dado que algunas
plataformas permiten el uso de variables no inicializadas, mientras que otras plataformas no.
Los datos miembros de una clase pueden no ser inicializados. Las variables de funcin
deben inicializarse.

- Alcance y Bloques. Al igual que en C y C++, J ava tambin usa los caracteres { y } para
marcar el inicio y el final del bloque de sentencia(s). Una variable declarada dentro del
bloque slo puede usarse dentro de ese bloque o en cualquier bloque que est anidado en
l. La variable no estar disponible una vez que el control del programa salga del bloque en
el que fue declarada.





Curso de J ava Standard Edition J 2SE 18
8 8. . O OP PE ER RA AD DO OR RE ES S E EN N J J A AV VA A

J ava tiene seis clases generales de operadores: aritmticos, a nivel de bits, relacionales y lgicos.
J ava tambin define algunos operadores adicionales que permiten controlar ciertas situaciones
especiales.

- Operadores Aritmticos: Los operadores +, -,* y /, pueden ser aplicados a cualquier tipo
de datos numricos, as como tambin, a los tipos char.

OPERADOR SIGNI FICADO EJ EMPLO
+ SUMA 1 + 2 3
- RESTA 1 - 2 -1
* MULTIPLICACIN 1 * 2 1
/ DIVISIN 2 / 1 2
% RESIDUO DE LA DIVISIN 1 % 2 0
++ INCREMENTO 1++ 2 ++1 2
-- DECREMENTO 1-- 0 --1 0

- Operadores de Bits: estos operadores insertan ceros o unos a la izquierda o derecha de
las variables numricas a nivel de bits.

OPERADOR SIGNI FICADO USO
>> SIGNED RIGHT SHIFT 1 >> 31 0
<< UN-SIGNED LEFT SHIFT 1 << 31 2147483648
>>> UN-SIGNED RIGHT SHIFT -1 >>> 31 1

- Operadores Relacionales: El resultado de los operadores lgicos es un valor boolean.

OPERADOR SIGNI FICADO EJ EMPLO
> MAYOR 1 > 2 FALSE
>= MAYOR O IGUAL QUE 2 >= 2 TRUE
< MENOR QUE 1 < 2 TRUE
<= MENOR O IGUAL QUE 2 <= 1 FALSE
== IGUAL A 1 == 2 FALSE
= NO ES IGUAL A 1 != 2 TRUE

- Operadores Lgicos: El resultado de los operadores lgicos es un valor boolean.

OPERADOR SIGNI FICADO EJ EMPLO
! NEGACIN ! (FALSE) TRUE
& CONJ UNCI N AND LGICO 1 & 1 TRUE
^ XOR 0 ^ 0 FALSE
| DISYUNCIN OR LGICO 0 | 2 FALSE
&& AND EN CORTOCIRCUITO 1 && 1 TRUE
| | OR EN CORTOCIRCUITO 0 || 2 FALSE

Curso de J ava Standard Edition J 2SE 19
La diferencia de usar &, l o &&, ll, es que los primeros operandos siempre evaluarn cada
operando, mientras que las versiones de cortocircuito evaluarn el segundo operando slo
cuando sea necesario.

- Operador instanceof: permite conocer si una variable de objeto est instanciada con un
tipo de objeto especfico. La forma Genaro de este operador es como sigue:

variableObjeto instanceof ClaseObjeto

El resultado de la evaluacin de la expresin anterior, ser true si la variableObjeto, hace
referencia a un objeto de la clase ClaseObjeto.

- Asignaciones Taquigrficas: J ava permite simplificar las declaraciones de asignacin.

OPERADOR USO EQUIVALENTE A
+= OP1 += OP2 OP1 = OP1 + OP2
-= OP1 -= OP2 OP1 = OP1 - OP2
*= OP1 *= OP2 OP1 = OP1 * OP2
/ = OP1 /= OP2 OP1 = OP1 / OP2
%= OP1 %= OP2 OP1 = OP1 % OP2
&= OP1 &= OP2 OP1 = OP1 & OP2
^= OP1 ^= OP2 OP1 = OP1 ^ OP2
<<= OP1 <<= OP2 OP1 << OP2
>>= OP1 >>= OP2 OP1 >> OP2
>>>= OP1 >>>= P2 OP1 >>> OP2

- Precedencia de Operadores: La siguiente tabla muestra el orden de precedencia de
mayor a menor para los operadores J ava. Note que la primera fila muestra elementos que,
generalmente, no son considerados como operadores: parntesis, corchetes, y el operador
punto. Recuerde que los parntesis permiten alterar la precedencia de una operacin.

PRI ORIDAD OPERADORES
( ) [ ] .
MAYOR ++ -- !
* / %
+ -
>> >>> <<
>= >= < <=
. = = !=
. &
. ^
|
&&
| |
?:
MENOR = OP=

Curso de J ava Standard Edition J 2SE 20
9 9. . E ES ST TR RU UC CT TU UR RA AS S D DE E D DE E C CO ON NT TR RO OL L

Las estructuras de control permiten realizar asignaciones, documentar el cdigo, as como
tambin permiten tomar decisiones y realizar procesos repetidas veces, por lo que stas
se clasifican en dos amplias categoras Condicionales e I terativas. Estas en J ava, son
bsicamente las mismas sentencias que existen C/C++, solo con algunas consideraciones
especiales.

- Comentarios: Los comentarios son sentencias que ayudan a explicar el cdigo.
No son procesados por J ava, por lo cual no incrementarn el tamao del BYTECODE.
Estos se expresan escribiendo frases precedidas por un doble //SLASH si el
comentario es de una sola lnea o un conjunto de lneas encerradas por un bloque
/* */.

- Asignacin: Las sentencias de asignacin se utilizan para dar un (nuevo) valor a
una variable. Otra forma de verlo es como un mtodo para copiar datos desde un
origen a un destino. J ava utiliza el signo igual (=) para est operacin.

- Condicionales: Son estructuras de decisin que hacen que el programa contine
en una direccin cuando se encuentra una condicin en particular.

o Sentencia if else: Est es utilizada para ejecutar una sentencia en el
caso que una condicin establecida sea verdadera, de lo contrario se podr
ejecutar una sentencia distinta.



if (COND) {
...
} else {
...
}

o Sentencia switch: Esta sentencia permite realizar operaciones diferentes
dependiendo del valor de una variable de tipo ordinal.

switch(var){
case valor1: { }
case valor2: { }; break;

default: { }
}

- I terativas: Tambin se denominan BUCLES y son aquellas sentencias de control
que nos permiten ejecutar un grupo de sentencias hasta que se cumpla cierta
condicin.

o Sentencia while: Ejecuta un grupo de instrucciones cero (0) o ms veces,
MI ENTRAS una condicin dada sea cierta.

while (COND) {
...
}

Curso de J ava Standard Edition J 2SE 21
o Sentencia do while: Ejecuta un grupo de instrucciones, MI ENTRAS una
condicin dada sea cierta. La condicin es verificada despus de ejecutarse
el conjunto de sentencias.

do {
...
} while (COND);

o Sentencia for: Ejecuta un grupo de instrucciones repetidamente un
nmero determinado de veces.

for (sentencia1; CONDI CI ON_DE_PARADA; sentencia2) {
...
}

- Sentencia break: Las sentencia break ocasiona que el flujo de control salte a
sentencia inmediatamente siguiente a la sentencia actual (rompe la ejecucin). La
sentencia break se puede emplear tanto en las sentencias condicionales como en
las iterativas.

- Sentencia continue: generalmente se utiliza la sentencia continue dentro de las
iterativas, para saltar a otra sentencia. La sentencia continue solo puede ser
llamada dentro de un bucle. Si se utiliza de la forma sencilla, la iterativa obvia
hasta el final del cuerpo del bucle y evala nuevamente la condicin. I f se usa con
etiquetas, la sentencia pasa a ejecutar la instruccin inmediatamente siguiente a la
etiqueta utilizado con la sentencia continue.


Curso de J ava Standard Edition J 2SE 22
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
TEMA I I : Cl ases, Obj et os y Paquet es


OBJ ETI VOS:
Escribir un programa simple en J ava que emplee Objetos, definiendo y agrupando
apropiadamente las clases y paquetes.


CONTENIDO:
Clases
Objetos
Paquetes
Un programa J ava completo










22
Curso de J ava Standard Edition J 2SE 23

1 1. . C CL LA AS SE ES S


1 1. .1 1. . N NO OC CI I O ON NE ES S B B S SI I C CA AS S

La clase es ncleo de J ava. Es la construccin lgica sobre la que se construye el lenguaje J ava, ya
que define la forma y la naturaleza de un objeto. La clase constituye la base de la Programacin
Orientada a Objetos en J ava. Cualquier concepto que desee implementar en un programa J ava debe
ser encapsulado en una clase. Dentro de una clase estn definidos los datos y los cdigos que
actan sobre esos datos. Todas las actividades del programa J ava ocurren dentro de una
clase, razn por la cual se dice que J ava es un lenguaje 100% orientado a objetos.

Una clase en J ava se define como: una plantilla que tiene las definiciones de variables o estados y
mtodos o comportamientos que es comn a todos los objetos de un tipo en particular. J ava usa
especificaciones de clase para construir objetos, que son instancias de una clase. De tal manera,
una clase es bsicamente un juego de planos que especifican cmo construir un objeto. Es
importante tener claro que una clase es una abstraccin lgica, por lo que hasta que un objeto de
esa clase sea creado, no existir una representacin fsica de esa clase en memoria.

Los miembros de la clase, es decir los atributos y los mtodos son llamados respectivamente
variables de instancia y mtodos de instancia; ya que estos representan el estado de un
objeto, es decir que cada objeto de una clase contiene una copia propia de esas variables,
separada a la de los otros objetos de la clase. Adems, existen las variables y mtodos de clase,
los cuales pueden ser accedidos directamente de una clase sin instanciar, es decir que son
comunes a todos los objetos de una clase por igual.



1 1. .2 2. . D DE EF FI I N NI I C CI I N N D DE E L LA AS S C CL LA AS SE ES S

Cuando se define una clase, se manifiesta su naturaleza y forma exacta. Esto se hace especificando
los miembros de la clase, es decir las variables y los mtodos que operan en ella.

Una clase se define a travs de la palabra clave class. A continuacin se muestra la forma general
de la definicin de una clase:



[acceso] [modif] class NombreClase [extends SuperClase] [implements Interfaces] {
/ / Variables miembro
[acceso] [modif] tipo nombreVariable [= valorInicial];

/ / Mtodos miembro
[acceso] [modif] tipo nombreMetodo([parametros]) [throws excepciones]{
// Cuerpo del mtodo
};

};

C
U
E
R
P
O

D
E

L
A

C
L
A
S
E

Curso de J ava Standard Edition J 2SE 24
- Componentes de la definicin de una clase

C CO OM MP PO ON NE EN NT TE ES S P PR RO OP P S SI I T TO O
acceso
De forma predeterminada todas las clases son friendly. Se puede
establecer como modificador de acceso public
abstract Opcional. La clase no se puede instanciar
Modif.
final Opcional. La clase no se puede derivar
Class NombreClase Especifica el nombre de la clase
extends SuperClase Opcional. Especifica el nombre de la SuperClase (Clase Padre)
implements Interfaces Opcional. Especifica las Iinterfaces implementadas por la clase
{ cuerpo de la clase };
Implementacin de la clase, declaracin de variables y mtodos
miembro
Tabla 1. Componentes de la definicin de una clase

- Componentes de la definicin de variables miembro

[acceso] [modif] tipo nombreVariable [= valorInicial];

C CO OM MP PO ON NE EN NT TE ES S P PR RO OP P S SI I T TO O
acceso Especifica el nivel de acceso de la variable (ver Tabla 4).
static Indica la declaracin de una variable de clase.
final Indica que la variable es una constante.
transient Indica que la variable no es serializable.
modif
volatile Le indica al compilador que debe realizar ciertas optimizaciones.
tipo Indica el tipo de la variable
NombreVariable Indica el identificador de la variable
valorInicial Especifica el valor inicial para esa variable
Tabla 2. Componentes de la definicin de variables miembro

Cuando el sistema encuentra una clase por primera vez en un programa, crea una nica copia
de todas las variables de clase que sern compartidas por todas las instancias (objetos) de la
clase. Si una variable de clase es cambiada por un objeto de la clase, entonces el cambio de su
valor se refleja en todas las dems instancias de la clase.



Curso de J ava Standard Edition J 2SE 25
- Componentes de la definicin de mtodos miembro

[acceso] [modif] tipo nombreMetodo([parametros]) [throws excepciones]{
// Cuerpo del mtodo
};

C CO OM MP PO ON NE EN NT TE ES S P PR RO OP P S SI I T TO O
acceso Especifica el nivel de acceso del mtodo (ver Tabla 4).
static Indica la declaracin de un mtodo de clase
abstract Indica que no se proporciona la implementacin del mtodo (funcin virtual)
final Indica que la subclase no puede sobrescribir el mtodo
native Indica que la implementacin de mtodo est escrita en otro lenguaje
modif
syncronized Indica que el mtodo necesita de un Monitor para ejecutarse
tipo Indica el tipo de retorno del mtodo
nombremetodo Indica el identificador del Mtodo
parametros Especifica la lista de argumentos formales para el mtodo
throws excepciones Da la lista de excepciones lanzadas por el mtodo
Tabla 3. Componentes de la definicin de mtodos miembro

Ya que J ava es un lenguaje netamente orientado a objetos, cuando sea necesario implementar
funciones para uso general, la forma de hacerlo es a travs de los mtodos de clase (static).

- Especificadores de acceso
Podemos usar los especificadores de acceso a J ava para proteger las variables y mtodos de
una clase mientras se declaran. La siguiente tabla presenta los niveles de accesos permitidos:

E ES SP PE EC CI I F FI I C CA AD DO OR R S SI I G GN NI I F FI I C CA AD DO O
private Accesible slo dentro de la clase donde se define
protected
Accedida por la clase en donde est definida, sus subclases y las clases en
el mismo paquete
public Accesible desde cualquier parte
friendly
Accesible desde todas las clases presentes en el mismo paquete. Este es
el modificador de acceso por omisin.
Tabla 4. Especificadores de acceso




Curso de J ava Standard Edition J 2SE 26
- Ejemplo de la declaracin de una clase

public class Ejemplo {
// Variables Miembro
private int x;
float Y;
static char sc;
static double sd;

// Mtodos Miembro
void setX(int valor) {
x=valor;
};
public float getY() {
return Y;
};
};


1 1. .3 3. . C CL LA AS SE ES S E EJ J E EC CU UT TA AB BL LE ES S

Como ya se ha mencionado en J ava todo es una clase, por lo tanto la aplicacin (programa) tambin
es una clase. Dicha clase tiene la caracterstica particular de poseer un mtodo de clase denominado
main. Este mtodo es semejante a la funcin main() de un programa C++, razn por la cual, va a
ser el primer mtodo en ejecutarse al correr un programa J ava.

public class NombreClase [extends SuperClase] [implements interfaz] {
// Variables miembro
...
// Mtodos miembro
...
/ / Mtodo main
public static void main(String [ ] args) {
// Cuerpo del mtodo
};

};

Otra caracterstica importante de las clases ejecutables, es que la misma debe ser public y llamarse
igual al archivo que la contiene, es decir el nombre del archivo fuente (archivo .java) debe ser el
idntico al nombre de la clase.
C
U
E
R
P
O

D
E

L
A

C
L
A
S
E

Objeto
VARIABLES
DE CLASE
Objeto
sc sv
Variables
Objetos
x
y
VARIABLES
DE I NSTANCIA
VARIABLES
DE I NSTANCIA
x
y
class Ejemplo
{

}
Curso de J ava Standard Edition J 2SE 27
2 2. . O OB BJ J E ET TO OS S

Usualmente, en un programa J ava, se crean muchos objetos a partir de diferentes clases y estos
interactan entre ellos enviando mensajes. Despus de que el objeto completa el trabajo para el
cual se cre, se recolecta como basura y sus recursos se liberaron, para el uso de otros objetos. El
ciclo de vida de un objeto consiste tpicamente de los siguientes pasos: creacin de objetos, uso de
los objetos creados y destruccin de los objetos.

2 2. .1 1. . C CR RE EA AC CI I N N D DE E O OB BJ J E ET TO OS S

Cuando se crea una clase se est creando un nuevo tipo de dato que se puede utilizar para declarar
objetos de ese tipo. Sin embargo, para obtener objetos de una clase es necesario hacer dos pasos.
En primer lugar, se debe declarar una variable del tipo de la clase. Esa variable no define un objeto,
sino que es simplemente una variable que puede referirse a un objeto. En segundo lugar, se debe
obtener una copia fsica y real del objeto y asignarla a la variable.

La creacin de un objeto es bsicamente la creacin de una instancia de una clase. Un objeto de
una clase se crea mediante el operador new, como se muestra a continuacin:

Coordenadas plano = new Coordenadas ();

En realidad, en la sentencia dada se realizan tres acciones: la declaracin del objeto, la instanciacin
del objeto y la inicializacin del mismo. La declaracin del objeto no necesita realizarse junto con la
creacin del objeto. Pueden hacerse en pasos separados como se muestra a continuacin:

Coordenadas plano;
plano = new Coordenadas();

Aqu la primera de las dos lneas es la declaracin del objeto, en donde Coordenadas representa a la
clase y plano es la variable de referencia a los objetos. El operador new en J ava es llamado
operador de instanciacin, el cual se usa para crear nuevos objetos. La inicializacin del objeto
se hace usando Coordenadas(), que es la llamada a su constructor usado para inicializar el objeto.

- Constructores de una clase: Todas las clases en J ava tienen al menos un constructor
para inicializar un objeto nuevo creado a partir de un tipo en particular. El nombre del
constructor es el mismo que el nombre de la clase, no tiene tipo de retorno y debe ser
pblico. J ava nos permite tener tantos constructores como queramos para una clase
(sobrecarga del constructor). Mientras creamos nuestra propia clase, no necesitamos
escribirle un constructor, ya que el sistema en tiempo de ejecucin proporciona un
constructor por omisin para la clase si nosotros no desarrollamos ninguno. Este constructor
por omisin, tiene una implementacin vaca.

public class Coordenada {

// Constructor predeterminado de la clase Coordenadas
public Coordenada() {
super();
};

// Constructor parametrizado de la clase Coordenadas
public Coordenada(int x, int y) {
Curso de J ava Standard Edition J 2SE 28
super();
setEjeX(x);
setEjeY(y);
};

};
Ejemplo de invocacin de los constructores:
Coordenada plano1 = new Coordenada(); / / Constructor por omisin
Coordenada plano2 = new Coordenada(20,25); / / Constructor parametrizado

2 2. .2 2. . U US SO O D DE E O OB BJ J E ET TO OS S

Una vez que se crea un objeto, nos gustara usarlo para realizar alguna tarea. Podemos necesitar
alguna informacin del objeto, podemos querer cambiar su estado, o podemos querer usarlo para
realizar alguna tarea. Hacemos estas cosas ya sea manipulando o visualizando sus variables o
llamando a sus mtodos. En fin, el uso de los objetos est limitado a invocar a los mtodos
miembros de la clase a la cual pertenecen, y a cambiar de referencia.

Objeto.Mtodo(parmetros);

Supongamos que la clase Coordenada, posee un mtodo para asignar y obtener la coordenada x, su
implementacin e invocacin sera como sigue:

Coordenada OBJ = new Coordenada();
OBJ .setEjeX(12);
int X = OBJ .getEjeX();


2 2. .3 3. . D DE ES ST TR RU UC CC CI I N N D DE E O OB BJ J E ET TO OS S ( (R RE EC CO OL LE EC CC C O ON N D DE E B BA AS SU UR RA A) )

Los objetos estn dinmicamente asignados en una seccin de memoria libre por medio del
operador new. Como sabemos, la memoria no es infinita y la memoria libre puede agotarse. Por
esta razn, un componente clave para cualquier esquema de asignacin dinmica de memoria,
consiste en recobrar la memoria libre de objetos que no estn en uso, disponiendo de esta memoria
para reasignaciones posteriores. En muchos lenguajes de programacin, el liberar memoria asignada
con anterioridad se hace manualmente. Por ejemplo, en C++ se usa el operador delete para liberar
memoria que estaba asignada. Sin embargo, J ava emplea un mtodo diferente: recoleccin de
basura.

El sistema de recoleccin de basura de J ava, automticamente reclama objetos que aparecen
transparentemente detrs de escena, sin ninguna intervencin del programador. Trabaja de la
siguiente forma: cuando no existe una referencia a un objeto, se asume que ese objeto no se
necesita ms y se recupera la memoria ocupada por ste. Esta memoria reciclada puede usarse
entonces para una asignacin posterior.

La recoleccin de basura ocurre slo espordicamente durante la ejecucin de su programa. No
ocurrir simplemente porque uno o ms objetos existan y no se usen. La recoleccin de basura se
ejecuta, generalmente slo cuando se cumplen dos condiciones: que existan objetos para reciclar, y
la necesidad de reciclarlos.
Curso de J ava Standard Edition J 2SE 29

- El mtodo finalize (): De forma anloga a lo que eran los destructores en C++, en J ava
existen los finalizadores. Estos mtodos se emplean, cuando un objeto necesita realizar una
serie de acciones cuando es destruido. El finalizador de una clase se llama justo antes de la
recoleccin de basura, por lo que los finalizadores son diferentes a los destructores. Es
importante entender, que no se puede saber cundo (o inclusive si) el mtodo finalize()
ser ejecutado.

public class Ejemplo {

protected void finalize() {
// Cdigo de finalizacin
};
};

3 3. . P PA AQ QU UE ET TE ES S

Un paquete es un contenedor que permite guardar el nombre de la clase en una forma de
compartimientos. En muchas formas, un paquete es como un directorio, que permite guardar en
forma segura una clase dentro de l. Es decir, que los paquetes son grupos de clases relacionadas
almacenadas en una unidad, la cual ayuda a organizar el cdigo y proporciona otra capa de
encapsulacin.

En programacin, los paquetes, son tiles para agrupar las piezas relacionadas de un programa. En
J ava, un paquete sirve para dos propsitos: primero, suministra un mecanismo por el cual piezas
relacionadas de un programa pueden ser organizadas como una unidad; as, un paquete
proporciona la manera de nombrar una coleccin de clases. Segundo, un paquete participa en los
mecanismos de control de acceso en J ava. Las clases definidas dentro de un paquete pueden
hacerse privadas a ese paquete y no accesibles por cdigo fuera del paquete.

Es importante aclarar, que a los paquetes hay que considerarlos desde dos puntos de vista: el punto
de vista lgico, en el cual los paquetes almacenan las declaraciones de las clases (archivos fuente de
J ava); y el punto de vista fsico, en el cual los paquetes van a almacenar los archivos .class de las
clases definidas dentro del paquete.


3 3. .1 1. . E ES SP PA AC CI I O OS S D DE E N NO OM MB BR RE ES S

En general, cuando nombra una clase, est asignando un nombre desde el espacio de nombre.
Un espacio de nombre define una regin declaratoria. En J ava dos clases no pueden usar el mismo
nombre desde el mismo espacio. As, dentro de un espacio de nombre dado, cada nombre de clase
debe ser nico. Los paquetes suministran una manera de dividir el espacio de nombre, evitando
problemas de duplicidad de nombres. Cuando una clase se define dentro de un paquete, el nombre
de ese paquete se une a cada clase, con lo que se evita que los nombres choquen con otras clases
del mismo nombre, pero que estn en otros paquetes. Si Para una clase, no se define un paquete,
dicha clase pertenecer al paquete predeterminado de J ava y por ende al espacio de nombre
predeterminado o global de J ava.





Curso de J ava Standard Edition J 2SE 30
3 3. .2 2. . D DE EF FI I N NI I C CI I N N D DE E P PA AQ QU UE ET TE ES S

Todas las clases en J ava pertenecen a algn paquete. Como se mencion anteriormente, cuando no
se especifica algn paquete se usa el paquete predeterminado (o global). Adems, el paquete
predeterminado no tiene nombre, lo que lo hace transparente.

Para crear un paquete, coloque un comando package como la primera sentencia del archivo fuente
de J ava. Esto asegurar que cualquier clase declarada en ese archivo pertenecer a ese paquete
particular. Debido a que un paquete define un espacio de nombre, los nombres de las clases que
coloque dentro del archivo fuente, se convierten en parte de ese espacio del paquete. Una misma
sentencia package se puede incluir en ms de un archivo fuente, por lo que no se impide que otras
clases de otros archivos puedan formar parte de un mismo paquete. En las aplicaciones reales, los
paquetes se suelen distribuir en muchos archivos fuente.

J ava usa el sistema de archivo para manejar los paquetes, con cada paquete almacenado en su
propio directorio. Como el resto de J ava, los nombres de paquetes son sensibles a maysculas y
minsculas. Es decir, el directorio en el cual es guardado un paquete debe ser el mismo del nombre
del paquete.

package myPack;

Este paquete corresponder con un directorio en el sistema de archivos llama \myPack. Observe que
se puede crear una jerarqua de paquetes dentro de paquetes separando los niveles con puntos.

package paq1.paq2.paq3;

Esta jerarqua de paquetes se debe reflejar en el sistema de archivos del sistema de desarrollo de
J ava: \ paq1\ paq2\ paq3.


3 3. .3 3. . U UB BI I C CA AC CI I N N D DE E P PA AQ QU UE ET TE ES S

Como se explic, los paquetes son reflejados en directorios. Cmo sabe el sistema en tiempo de
ejecucin de J ava dnde buscar los paquetes que usted cre? La respuesta tiene dos partes.
Primero, por omisin: el sistema en tiempo de ejecucin de J ava busca en el directorio en curso
como punto de partida. As, si sus archivos de clase estn en el directorio actual, o en un
subdirectorio del directorio actual, ellos se encontrarn. Segundo, puede especificar una ruta o rutas
de directorios, colocndola en la variable de entorno CLASSPATH. Dicha variable, controla la
ubicacin particular que debe ser considerada por J ava como la raz de la jerarqua de paquetes.

Para configurar esta variable de entorno, desde la consola del sistema escribir lo siguiente:
[set] CLASSPATH=.;CLASSPATH[;otros_directorios]


3 3. .4 4. . P PA AQ QU UE ET TE ES S Y Y A AC CC CE ES SO O A A M MI I E EM MB BR RO OS S

J ava proporciona muchos niveles de proteccin para permitir un control adecuado de la visibilidad
de las variables y mtodos dentro de clases, subclases y paquetes. Las clases y los paquetes son
dos medios de encapsular y contener el espacio de nombre y alcance de las variables y mtodos.
J ava proporciona cuatro tipos de visibilidad para los miembros de clase. Visibilidad de los miembros
de la clase segn su modificador de acceso.



Curso de J ava Standard Edition J 2SE 31

ESPECIFICADOR CLASE SUBCLASE PAQUETE MUNDO
private Si No No No
protected Si Si Si No
public Si Si Si Si
package Si No Si No
Tabla 5. Paquetes y acceso a miembros

3 3. .5 5. . I I M MP PO OR RT TA AC CI I N N D DE E P PA AQ QU UE ET TE ES S

Dado que los paquetes existen y son un buen mecanismo para organizar de forma estructurada las
clases, es fcil de ver por qu todas las clases incorporadas en J ava se almacenan en paquetes. No
hay ninguna clase de J ava almacenada en el paquete por omisin.

De manera anloga, a lo que sera una directiva #include en C++, J ava incluye la sentencia
import, para que se puedan ver ciertas clases o paquetes enteros. En un archivo fuente de J ava,
las sentencias import tienen que ir inmediatamente despus de la sentencia package, si existe, y
antes de las definiciones de las clases.

import paquete.clase; / / Importa una clase especfica
import paquete.*; / / Importa todas las clases en un paquete


3 3. .6 6. . P PA AQ QU UE ET TE ES S D DE E R RE EL LE EV VA AN NC CI I A A

A continuacin estudiaremos los paquetes de mayor relevancia que proporciona la API de J ava.

- j ja av va a. .l la an ng g: : Este paquete se importa automticamente en todos los programas y contiene
clases e interfaces que son fundamentales para la programacin en J ava. Es el paquete ms
utilizado de J ava. java.lang incluye las siguientes clases:

Object Boolean SecurityManager
String Character ClassLoader
Number Class Proccess
Long System Thread
Integer Math ThreadGroup
Double StringBuffer Throwable
Flota Runtime Compiler

Nota: las clases en cursiva fueron vistas en los tipos de datos orientados a objetos (Tema
I). En esta parte se estudiaran las clases resaltadas en negrita.

o Class: encapsula el estado de ejecucin de un objeto o interfaz. Los objetos del
tipo Class se crean automticamente cuando se cargan las clases. Un objeto
Class no se puede declarar de forma explcita. Generalmente, se obtiene un
objeto Class llamando al mtodo getClass() definido en la clase Object. .
Algunos de los mtodos que define la clase Class son:
Curso de J ava Standard Edition J 2SE 32

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
static Class forName(String name)
Devuelve un objeto Class dando su nombre
completo.
Class [] getInterfaces()
Cuando se invoca sobre un objeto, devuelve
una matriz de interfaces implementadas por
la clase del objeto. Si se invoca sobre una
interfaz, devuelve una matriz con sus
interfaces Padre.
String getName()
Devuelve el nombre completo de la clase o
interfaz del objeto que llama el mtodo
Class getSuperclass()
Devuelve la clase padre del objeto. Retorna
null si el objeto es de tipo Object.
Bolean isInterface() Devuelve trae si el objeto es una interfaz

o System: esta clase contiene un conjunto de mtodos y variables estticos. La
entrada, salida y salida de error del intrprete de J ava se almacenan en las
variables in, out y err. Veamos algunos de los usos ms comunes de la clase
System:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
static long currentTimeMillis ()
Devuelve la hora actual en milisegundos
desde el 1 de enero de 1970
Static void exit(int codSalida)
Detiene la ejecucin y devuelve el valor
codSalida al proceso padre. El valor cero (0)
indica que ha terminado correctamente.
Static void gc() Inicia el sistema de recoleccin de basura
Static void loadLibrary(String lib)
Carga la biblioteca dinmica cuyo nombre
est asociado con lib
Static void runFinalization()
Inicia la llamada a los mtodos finalize() de
todos los objetos no utilizados y que todava
estn sin recolectar

o Math: contiene todas las funciones en coma flotante que se utilizan en
geometra y trigonometra, as como algunos mtodos de propsito general.
Math define dos constantes double E = 2.72 y double PI = 3,14.. los mtodos
definidos en la clase Math son:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
static int abs(int arg) Devuelve el valor absoluto de arg
static long abs(long arg) Devuelve el valor absoluto de arg.
static float abs(float arg) Devuelve el valor absoluto de arg.
static double abs(double arg) Devuelve el valor absoluto de arg.
static double ceil(double arg)
Devuelve el nmero completo ms pequeo
mayor o igual que arg.
static double floor(double arg)
Devuelve el nmero completo ms grande
menor o igual que arg.
Curso de J ava Standard Edition J 2SE 33
static int max(int x, int y) Devuelve el mximo de x e y.
static long max(long x, long y) Devuelve el mximo de x e y.
static float max(float x, float y) Devuelve el mximo de x e y.
static double max(double x,
double y)
Devuelve el mximo de x e y.
static int min(int x, int y) Devuelve el mnimo de x e y.
static long min(long x, long y) Devuelve el mnimo de x e y.
static float min(float x, float y) Devuelve el mnimo de x e y.
static double min(double x,
double y)
Devuelve el mnimo de x e y.
static double rint(double arg) Devuelve el valor entero mas cercano de Arg
static int round(float arg) Devuelve arg redondeado al int mas cercano
static long round(float arg)
Devuelve arg redondeado al long mas
cercano

- j ja av va a. .u ut ti il l: : La biblioteca de J ava contiene un conjunto de clases de utilidades que se utilizan
en los paquetes principales de J ava y que tambin estn disponibles para ser utilizados en
cualquier programa escrito. Estas clases se utilizan para almacenar conjuntos de objetos,
generar nmeros aleatorios, manipulacin de la fecha y hora y operaciones con cadenas. A
continuacin se muestran las clases incluidas en java.util:

Date Stack Observable
Random Dictionary Map
Vector Properties HashTable

Nota: En esta parte solo se estudiaran las clases en negrita.

o Date: Representa una fecha y hora. Los mtodos ms importantes definos en la
clase Date son lo siguientes:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
Date() Inicializa el objeto con la fecha y hora actual
Date(String fecha)
Construye un objeto con la fecha y hora
especificada.
Date(int ao, int mes, int dia)
Inicializa el objeto con la fecha pasada. El
parmetro ao especifica el nmero de aos
que han transcurrido de 1900. el parmetro
mes establece el mes del ao comenzando
en 0. El parmetro da establece el da del
mes. Este constructor establece la hora del
objeto a las 12:00:00
boolean after(Date fecha)
Devuelve trae si el objeto Date contiene una
fecha posterior a la especificada en fecha

Curso de J ava Standard Edition J 2SE 34
boolean befote(Date fecha)
Devuelve trae si el objeto Date contiene una
fecha anterior a la especificada en el
parmetro
boolean equals(Object fecha)
Devuelve trae si el objeto Date contiene la
misma fecha y hora que la especificada por
parmetro
int getDate() Devuelve el da del mes (1 31)
int getDay() Devuelve el da de la semana (0 Domingo)
Int getMonth() Devuelve el mes (0 - Enero)
Int getYear()
Devuelve el nmero de aos desde 1900.
por lo tanto el ao actual ser este valor
devuelto + 1900
int getHours() Devuelve la hora, en 24 horas
int getMinutes() Devuelve los minutos
Int getSeconds() Devuelve los segundos
void setDate(int dia) Establece el da del mes
void setMonth(int mes) Establece el mes
void setYear(int ao)
Establece el ao. El valor del ao se debe
colocar restndole 1900
void setHours(int hora) Establece la hora (0 23)
void setMinutes(int min) Establece los minutos (0 59)
void setSeconds(int sec) Establece los segundos (0 59)
Nota: no se puede establecer el da de la semana ya que ste depende del da
del mes.

o Random: es un generador de nmeros pseudos-aleatorios. Se les llama as,
porque son secuencias distribuidas uniformemente. Cuando se inicializa un
objeto Random con un valor (semilla), se est definiendo el punto inicial de
una secuencia aleatoria. Si se utiliza la misma semilla, para inicializar otro objeto
Random se obtendr la misma secuencia aleatoria. Para generar distintas
secuencias es necesario especificar distintas semillas. Algunos de los mtodos
que define la clase Random son:
o
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
Random()
Crea un generador de nmero que utiliza la
hora actual como valor inicial.
Random(long semilla)
Permite especificar el valor inicial de la
secuencia aleatoria.
double nextDouble() Devuelve el siguiente nmero aleatorio double
float nextFloat() Devuelve el siguiente nmero aleatorio float
int nextInt() Devuelve el siguiente nmero aleatorio int
long nextLong() Devuelve el siguiente nmero aleatorio long
void setSeed(long semilla)
Establece la semilla, es decir, el punto de inicio
del generador de nmero aleatorios

o Vector: La clase Vector es bsicamente un arreglo de longitud variable de
referencias a objetos, es decir, un Vector puede dinmicamente aumentar o
disminuir su tamao. Los vectores se crean con un tamao inicial y cuando se
Curso de J ava Standard Edition J 2SE 35
supera ese tamao, automticamente aumentan su tamao. Todos los vectores
comienzan con una capacidad inicial. Algunos de los mtodos definidos en la
clase Vector son los siguientes:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
Vector()
Este constructor crea un vector vaco con
capacidad para 10 elementos.
Vector(int N)
Este constructor crea un vector vaco con
capacidad para N elementos.
Vector(int N, int incr)
Este constructor crea un vector vaco con
capacidad para N elementos y cuyo
incremento es incr. El incremento especifica el
nmero de elementos que se tienen que
reservar cada vez que se aumenta el tamao
del Vector, si no se especifica incr, entonces el
Vector duplica su tamao cada vez que se
reserva memoria para l.
final void addElment(Object elm) Aade al Vector el objeto especificado por elm
Final void insertElementAt(Object o,
int pos)
Aade el Objeto al Vector en la posicin
indicada
final int capacity() Devuelve la capacidad del Vector
final int size() Devuelve el numero de elementos en el Vector
final boolean contain(Object obj) Devuelve true si el objeto est en el Vector
final Object elementAt(int pos) Devuelve el Objeto en la posicin especificada
final Object firstElement() Devuelve el primer objeto en el Vector
final Object lastElement() Devuelve el ultimo objeto en el Vector
final bolean isEmpty() Devuelve true si el Vector est vaco
final void removeAllElements()
Elimina todos los elementos del Vector. Una
vez ejecutado el tamao del Vector es cero.
final void removeElement(Object o)
Elimina la primera instancia del objeto en el
Vector
final void removeElementAt(int pos) Elimina el elemento de la posicin indicada
final void setElementAt(Object o, int p) Coloca el objeto en la posicin indicada
final int indexOf(Object element)
Devuelve la posicin de la primera ocurrencia
del elemento. Si el objeto no se encuentra
devuelve -1

o Stack: Esta es una subclase de Vector, que implementa la abstraccin de una
pila. Los mtodos que agrega la clase Snack son los siguientes:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
Stack() Crea una pila vaca
boolean empty() Devuelve true si la pila est vaca
Object peek()
Devuelve el elemento en el tope, pero no lo
retira de la pila
Object pop()
Devuelve el elemento en el tope y lo extrae
de la pila
Object push(Object element) Introduce un elemento en la pila.
Curso de J ava Standard Edition J 2SE 36

- j ja av va a. .n ne et t: : El paquete java.net, contiene todas las clases que permiten elaborar
aplicaciones en J ava, capaces de operar en redes. El estudio de estas clases est fuera
del alcance de este curso.

- j ja av va a. .i io o: : El paquete java.io, contiene todas las clases para realizar las operaciones de
Entrada/Salida (E/S). El estudio de estas clases se realizar en el Tema V:
Entrada/Salida.

- j ja av va a. .s sq ql l: : El paquete java.sql, suministra todas las clases que proporcionan la
conectividad a bases de datos. El estudio de estas clases se realizar en el Tema VI:
Tecnologas de acceso a datos.

- j ja av va a. .a aw wt t: : El paquete java.awt, proporciona las clases bsicas para el manejo de de
interfaces grficas de usuario. El estudio de estas clases se realizar en el Tema VII:
Interfaces Grficas.

- j ja av va ax x. .s sw wi in ng g: : El paquete javaxswing, proporciona todas las clases para realizar el
manejo de interfaces grficas de usuario. El estudio de estas clases se realizar en el
Tema VII: Interfaces Grficas.
Curso de J ava Standard Edition J 2SE 37
4 4. . U UN N P PR RO OG GR RA AM MA A J J A AV VA A C CO OM MP PL LE ET TO O

/**
* ARCHIVO....: Example.java
* @autor.......: Prof. Ronel J . Rivas R.
* @date........: 19/09/2005
* DESCRIPCIN: Archivo que contiene la especificacin de un ejemplo sobre:
* paquetes, importacin de paquetes y clases, clases generales,
* clases Ejecutables, objetos y referencias a objetos
**/

package myPack;

import java.io.*;
import java.util.Date;

/*************************
** CLASES DEL PAQUETE **
*************************/
// Clase para manejar la Hora
class J Time {
/ / VARIABLES DE INSTANCIA
private int hour, minutes, seconds;

/ / CONSTRUCTORES
public J Time() {
super();
setHour(12);
setMinutes(0);
setSeconds(0);
};
public J Time(int h,int m,int s) {
super();
setHour(h);
setMinutes(m);
setSeconds(s);
};

/ / METODOS DE INSTANCI A
public void setHour(int h) {
this.hour = h;
};
public int getHour(){
return this.hour;
};

Curso de J ava Standard Edition J 2SE 38
public void setMinutes(int m) {
this.minutes = m;
};
public int getMinutes(){
return this.minutes;
};
public void setSeconds(int s) {
this.seconds = s;
};
public int getSeconds(){
return this.seconds;
};
};

/**********************************
** CLASE PRINCIPAL DEL PAQUETE **
***********************************/
// Clase de Ejemplo
public class Example {
/ / VARIABLES DE INSTANCIA
private int day, month, year;
private J Time time;

/ / CONSTRUCTORES
public Example() {
super();
setDate(12,2,2004);
time = new J Time();
};

/ / METODOS DE INSTANCI A
public void setDay(int d) {
this.day = d;
};
public int getDay(){
return this.day;
};
public void setMonth(int m) {
this.month = m;
};
public int getMonth(){
return this.month;
};
public void setYear(int y) {
this.year = y;
};
Curso de J ava Standard Edition J 2SE 39
public int getYear(){
return this.year;
};
public void setDate(int d, int m, int y) {
setDay(d);
setMonth(m);
setYear(y);
};
public Date getDate(){
return new Date(getYear(),getMonth(),getDay());
};
public void setTime(int hour, int minutes, int seconds) {
time = new J Time(hour,minutes,seconds);
};
public J Time getTime() {
return this.time;
};

/ / METODO PRI NCI PAL
public static void main(String [] args){
Example miEjemplo = new Example();
J Time hora;

miEjemplo.setDate(12,2,2004);
miEjemplo.setTime(1,15,0);
hora = miEjemplo.getTime();

Sytem.out.println("La Fecha Actual es: " + miEjemplo.getDate());
System.out.print("La Hora Actual es: " + hora.getHour() + "-");
System.out.println(hora.getMinutes() + "-" + hora.getSeconds());

hora = new J Time(3,0,0);
Sytem.out.println("La nueva Hora es: " + hora);
};
};

Curso de J ava Standard Edition J 2SE 40
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
TEMA I I I : Herenci a, Cl ases Abst ract as e I nt erf aces



OBJ ETI VOS:
Manejar los conceptos de Herencia, clases abstractas, interfaces y polimorfismo.
Escribir un programa en J ava, donde se reflejen los conceptos de herencia y polimorfismo.



CONTENIDO:
Herencia
Clases abstractas
Interfaces











40
Curso de J ava Standard Edition J 2SE 41
1 1. . H HE ER RE EN NC CI I A A

1 1. .1 1. . F FU UN ND DA AM ME EN NT TO OS S

La herencia es considerada uno de los fundamentos de la programacin orientada a objetos, dado
que permite crear una jerarqua de clasificaciones. Usando este concepto se puede definir una clase
general que da la definicin de los rasgos comunes a un conjunto de clases relacionadas. Otras
clases que aaden caractersticas que son nicas para ellas pueden heredar de esta clase general.
En J ava, la clase que es heredada es llamada una superclase y la clase que hereda de otra, es
llamada una subclase. Por lo tanto, una subclase es un tipo especial de la superclase. Aunque una
superclase tenga una subclase, esto no significa que la superclase no pueda ser utilizada por s sola.

Slo puede haber una superclase para cualquier clase que se cree, ya que J ava no soporta la
herencia mltiple, es decir varias superclases en una subclase. Sin embargo, se puede crear una
jerarqua de herencia en la que una subclase llegue a ser una superclase de otra subclase. Ninguna
clase puede ser superclase de s misma.

Para especificar que una clase hereda de otra, la clase que hereda debe usar en su declaracin la
palabra clave extends despus del nombre de la clase. Esto implica que la subclase extiende la
funcionalidad y caractersticas de la superclase. La forma general de declarar una clase que hereda
de una superclase se muestra a continuacin:

class NombreSubClase extends NombreSuperClase {
// Cuerpo de la clase
};


1 1. .2 2. . A AC CC CE ES SO O A A M MI I E EM MB BR RO OS S Y Y H HE ER RE EN NC CI I A A

El siguiente programa es un ejemplo sencillo de herencia, donde se crea una superclase A y una
subclase llamada B.
//Crea una superclase
class A {
private int i;
private int j;
public void setIJ (int x, int y) {
i = x;
j = y;
}
public int getI () {
return i;
}
}

//Crea una subclase que extiende o hereda de la clase A
class B extends A {
private int total;
public void setTotal (int t) {
total = t;
}
public int getTotal () {
Curso de J ava Standard Edition J 2SE 42
return total;
}
public void sumar (){
setTotal ( getI() + j ); / / Error: j no es accesible aqu, por ser privada.
}
}

// Clase Ejecutable
public class Acceso {
public static void main (String args[]) {
B subObj = new B();
subObj.setIJ (10, 12);
subObj.sumar ();
System.out.println (El total es + subObj.getTotal());
}
}

Este programa no compila ya que la referencia a la variable j dentro del mtodo sumar () de la clase
B provoca una violacin de acceso. Como j es una variable privada slo es accesible por los otros
miembros de su propia clase. Aunque una subclase hereda todos los miembros de su superclase, no
puede acceder a aquellos miembros de su superclase que hayan sido declarados private. Para
solucionar esto es necesario implementar un mtodo de instancia pblico que tenga acceso al
miembro privado.


1 1. .3 3. . R RE EF FE ER RE EN NC CI I A AR R O OB BJ J E ET TO OS S S SU UB BC CL LA AS SE E A A T TR RA AV V S S D DE E O OB BJ J E ET TO OS S S SU UP PE ER RC CL LA AS SE E

Una referencia al objeto de la superclase puede tener asignada una referencia a cualquier objeto de
sus subclases. Cuando a una variable de referencia a superclase se le asigna la referencia a la
subclase, el acceso ser slo a los miembros que estn definidos en la superclase; debido a que la
superclase no conoce acerca de las caractersticas especiales aadidas por su subclase. El siguiente
ejemplo ilustra este aspecto, usando las clases A y B del ejemplo anterior (sin error):

//Crea una superclase
class A {
private int i;
private int j;
public void setIJ (int x, int y) {
i = x;
j = y;
}
public int getI () {
return i;
}
}
//Crea una subclase que extiende o hereda de la clase A
class B extends A {
private int total;
public void setTotal (int t) {
total = t;
}
Curso de J ava Standard Edition J 2SE 43
public int getTotal () {
return total;
}
public void sumar (){
setTotal ( getI() + getJ () );
}
}

// Clase Ejecutable
public class Acceso {
public static void main (String args[]) {
B subObj = new B();
A superObj = new A();
subObj.setIJ (10, 12);
subObj.sumar ();
System.out.println (El total es + subObj.getTotal());
// Asigna una referencia de B a una referencia de A
superObj = subObj;
superObj.setIJ (1, 5); / / Correcto: el mtodo setIJ () est definido en la superclase
superObj.sumar(); / / Error: en la clase A no est definido un mtodo sumar()
}
}

Como B es una subclase de A, es posible asignar subObj a superObj. Slo el tipo de variable
referencia determina los miembros que se pueden acceder, no el tipo de los objetos a los que se
hace referencia. Por lo tanto, la referencia superObj no puede acceder al miembro sumar(), que slo
est presente en la clase B.


1 1. .4 4. . E EL L M MO OD DI I F FI I C CA AD DO OR R S SU UP PE ER R

Al trabajar con herencia, es posible que tanto la superclase como la subclase proporcionen sus
propios constructores, donde cada uno tiene la responsabilidad de inicializar su porcin del objeto.

Cuando la superclase y la subclase definen juntas constructores, ambos constructores deben ser
ejecutados. En este caso debe usarse la palabra clave de J ava, super, que tiene dos formas
generales. La primera llama un constructor superclase. La segunda es utilizada para acceder a un
miembro de la superclase que ha sido ocultado por un miembro de una subclase.

- Uso de super para llamar constructores de superclase: Una subclase puede llamar al
constructor de la superclase utilizando el modificador super de la siguiente forma:
super (lista_de_parmetros);
Aqu, lista_de_parmetros especifica los parmetros del constructor de la superclase. Si
se utiliza el modificador super(), tiene que ser la primera sentencia ejecutada dentro del
constructor de la subclase.

Cuando una subclase llama a super(), el constructor de la superclase inmediata ser
llamado. As que, super() siempre se refiere a la superclase inmediatamente encima de la
clase que llama. Esto se cumple incluso en una jerarqua multinivel. Cualquier forma del
constructor definida por la superclase, puede ser llamada usando super(). Si se omite la
Curso de J ava Standard Edition J 2SE 44
llamada a super(), se ejecutar automticamente el constructor predeterminado de la
superclase.

//Crea una superclase
class A {
private int i;
private int j;
//Constructor con 2 parmetros
A (int x, int y) {
setIJ ( x, y);
}
//Constructor con 1 parmetro
A (int x) {
setIJ ( x, 1);
}
public void setIJ (int x, int y) {
i = x; j = y;
}
public int getI () {
return i;
}
public int getJ () {
return j;
}
}

//Crea una subclase que extiende o hereda de la clase A
class B extends A {
private int total;
//Constructor sin parmetros
B () {
super (1); //Invoca al constructor con 1 parmetro de la superclase
setTotal (0);
}
//Constructor con 3 parmetros
B (int n1, int n2, int n3) {
super (n1, n2); //Invoca al constructor con 2 parmetros de la superclase
setTotal (n3);
}
public void setTotal (int t) {
total = t;
}

Curso de J ava Standard Edition J 2SE 45
public int getTotal () {
return total;
}
public void sumar () {
setTotal ( getI() + getJ () );
}
}

// Clase Ejecutable
public class Acceso {
public static void main (String args[]) {
B obj1 = new B(); // Utiliza el constructor sin parmetros de la subclase y
// el constructor con 1 parmetro de la superclase
B obj2 = new B(2, 3, 0); // Utiliza el constructor con 3 parmetros de la subclase y
// el constructor con 2 parmetros de la superclase
obj1.sumar ();
System.out.println (El total 1 es + obj1.getTotal());
obj2.sumar ();
System.out.println (El total 2 es + obj2.getTotal());
}
}

- Uso de super para acceso a miembros de la superclase: La segunda forma de utilizar
super es parecida a la utilizacin de this, excepto que super siempre se refiere a la
superclase de la subclase en la que se utiliza. Su formato es:
super.miembro
Donde miembro puede ser cualquier mtodo o variable de la superclase a la cual se desea
hacer referencia. Esta forma es til cuando los miembros de la subclase sirven para ocultar
los miembros que tienen el mismo nombre en la superclase y se quiere tener acceso a los
miembros de la superclase.

// Crea una superclase
class A {
private int i;
public void setI (int x) {
i = x;
}
public int getI () {
return i;
}
}

// Crea una subclase que extiende o hereda de la clase A
class B extends A {
private int i;

Curso de J ava Standard Edition J 2SE 46
//Constructor con 2 parmetros
B (int n1, int n2) {
super.setI (n1); // setI() de A (superclase)
setI (n2); // setI() de B (subclase)
}
public void setI (int x) {
i = x; // Este setI oculta al setI de la superclase A
}
public int getI () {
return i; // Este getI oculta al getI de la superclase A
}
public void mostrar () {
System.out.println (i de la superclase: + super.getI());
System.out.println (i de la subclase: + getI());
}
}
// Clase Ejecutable
public class Acceso {
public static void main (String args[]) {
B obj = new B(1, 2);
obj.mostrar ();
}
}


1 1. .5 5. . C CR RE EA AC CI I N N D DE E U UN NA A J J E ER RA AR RQ QU U A A M MU UL LT TI I N NI I V VE EL L

Como se mencion, es perfectamente aceptable usar una subclase como superclase de otra. Por
ejemplo, dadas tres clases llamadas A, B y C. La clase C puede ser una subclase de B, que es una
subclase de A. Cuando este tipo de situacin ocurre, cada subclase hereda todas las caractersticas
encontradas en todas sus superclases. En este caso, C hereda todos los aspectos de B y A.
Objeto de A




Objeto de B




Objeto de C
Curso de J ava Standard Edition J 2SE 47
1 1. .6 6. . O OR RD DE EN N D DE E E EJ J E EC CU UC CI I N N D DE E L LO OS S C CO ON NS ST TR RU UC CT TO OR RE ES S

En una jerarqua de clases, los constructores son llamados en orden de derivacin, de superclases a
subclases. Adems, como super() tiene que ser la primera sentencia que se ejecuta dentro del
constructor de la subclase, este orden es el mismo tanto si se utiliza super() como si no. Si no se
utiliza super() entonces se ejecuta el constructor por omisin o sin parmetros de cada superclase.
El siguiente ejemplo ilustra el orden de ejecucin de los constructores:

// Clase A
class A{
//Constructor por omisin de A
A(){
System.out.println (Construyendo A);
}
}
// Clase B - subclase de A y superclase de C
class B extends A{
//Constructor por omisin de B
B(){
System.out.println (Construyendo B);
}
}
//Clase C - subclase de B
class C extends B{
//Constructor por omisin de C
C(){
System.out.println (Construyendo C);
}
}
public class Acceso{
public static void main (String args[]){
C c = new C();
}
}
La salida del programa es la siguiente:
Construyendo A
Construyendo B
Construyendo C


1 1. .7 7. . S SO OB BR RE ES SC CR RI I T TU UR RA A D DE E M M T TO OD DO OS S

En una jerarqua de clases, si un mtodo en la subclase tiene la misma fima (los mismos nombres
de mtodos, tipos de argumentos, tipo de retorno y excepciones que arroja), que el mtodo en la
superclase, entonces el mtodo en la superclase se dice que fue sobrescrito por el mtodo en la
subclase. Cuando se invoca un mtodo sobrescrito desde la subclase, siempre se refiere al mtodo
definido dentro de la subclase. La versin del mtodo que se encuentra en la superclase est oculto
y puede ser accedido usando la palabra super dentro de la subclase.

En caso de que el mtodo en la superclase y la subclase tengan el mismo nombre pero sus firmas
sean diferentes, entonces los mtodos se sobrecargan, ms no se sobrescriben; por lo tanto el
Curso de J ava Standard Edition J 2SE 48
mtodo de la superclase no est oculto y es accesible directamente desde la subclase, sin usar la
palabra super. Cuando se aplica sobrescritura, tanto para mtodos como para variables, no se
puede hacer menos accesible de lo que era inicialmente, desde la superclase. Por ejemplo, si un
mtodo en la superclase tiene acceso public, en la subclase slo puede aparecer como public. A
continuacin, se presenta un cuadro que resume el uso de los modificadores de acceso cuando se
trabaja con sobrescritura:

A AC CC CE ES SO O E EN N
S SU UP PE ER RC CL LA AS SE E
S SU UB BC CL LA AS SE E
private private, package, protected, public
package package, protected, public
protected protected, public
public public


1 1. .8 8. . U US SO O D DE EL L M MO OD DI I F FI I C CA AD DO OR R f fi in na al l

La palabra clave final tiene tres usos: con una variable, con un mtodo y con una clase. Cuando se
usa con una variable, permite crear el equivalente de una constante con nombre. Cuando se usa con
un mtodo, previene la sobrescritura del mtodo. Cuando se usa con una clase, previene que la
clase se herede.

- Uso del modificador final para prevenir sobrescritura: Cuando se desea que un
mtodo no sea sobrescrito, se usa el modificador final en la declaracin del mtodo. Al
declarar un mtodo como final en la superclase, no es posible sobrescribirlo en la subclase;
de ocurrir esto, se producir un error de compilacin. El uso del modificador final ayuda a
eliminar la sobrecarga de costo asociado con la llamada del mtodo. Usualmente, el
compilador de J ava resuelve la llamada a un mtodo dinmicamente en tiempo de
ejecucin; lo que se denomina enlace tardo. Como los mtodos finales no pueden
sobrescribirse, una llamada al mtodo final puede ser resuelta en tiempo de compilacin; lo
que se denomina enlace temprano.


class A {
private int x, y, w;
public final int sumar () {
setW ( getX() + getY() );
return w;
}
public int getX () {
return x;
}
public int getY () {
return y;
}
public void setW (int n) {
w = n;
}
}


Curso de J ava Standard Edition J 2SE 49

class B extends A{
private int total;
public int sumar () {
setTotal (super.sumar()); / / Error de compilacin: mtodo final no puede ser sobrescrito
int c = ( getTotal() + 5 );
return c;
}
public int getTotal () {
return total;
}
public void setTotal (int t) {
total = t;
}
}

- Uso del modificador final para prevenir herencia: El modificador final se utiliza en la
declaracin de una clase para evitar que esta se herede. Cuando la clase se declara como
final, J ava declara implcitamente todos los mtodos de la clase como final. No es posible
declarar una clase abstracta como final, dado que la clase abstracta no est completa por s
misma y espera que sus subclases proporcionen las implementaciones completas.

final class A{
private int x;
public void setX (int n){
x = n;
}
public int getX (){
return x;
}
}
class B extends A{ // Error de compilacin: no se puede heredar A
...
}

Curso de J ava Standard Edition J 2SE 50
1 1. .9 9. . E EJ J E EM MP PL LO O C CO OM MP PL LE ET TO O D DE E H HE ER RE EN NC CI I A A Y Y S SO OB BR RE ES SC CR RI I T TU UR RA A D DE E M M T TO OD DO OS S

// Superclase Figura
class Figura {
private double dim1;
private double dim2;
// Constructor por omisin
Figura (double a, double b) {
setDim1 (a);
setDim2 (b);
}
// Mtodos GETs y SETs
public void setDim1 (double x) {
dim1 = x
}
public double getDim1 () {
return dim1;
}
public void setDim2 (double x) {
dim2 = x
}
public double getDim2 () {
return dim2;
}
// Mtodo para calcular el rea de la figura (No definido)
public double area () {
System.out.println (El rea de la figura no est definida);
return 0;
}
}
// Clase Rectangulo que extiende a Figura
class Rectngulo extends Figura {
Retangulo (double a, double b) {
super (a, b); // Se inicializa el objeto usando el constructor de la superclase
}
// Sobrescribe el mtodo area para el rectngulo
public double area () {
System.out.println (Dentro del mtodo rea para un rectngulo);
Return getDim1() * getDim2();
}
}

Curso de J ava Standard Edition J 2SE 51
// Subclase Triangulo que extiende a Figura
class Triangulo extends Figura {
Triangulo (double a, double b) {
super (a, b); // Se inicializa el objeto usando el constructor de la superclase
}
// Sobrescribe el mtodo rea para un tringulo
public double area () {
System.out.println (Dentro del mtodo rea para un tringulo);
return getDim1() * getDim2() / 2
}
}

// Clase Ejecutable
public class EncontrarAreas {
public static void main (String args[]) {
Figura f = new Figura (10, 10);
Rectangulo r = new Rectangulo (5, 5);
Triangulo t = new Triangulo (4, 8);
Figura figRef;
FigRef = r;
System.out.println (El rea es: + figRef.area());
FigRef =tr;
System.out.println (El rea es: + figRef.area());
FigRef = f;
System.out.println (El rea es: + figRef.area());
}
}

La salida de este programa es la siguiente:

Dentro del mtodo rea para un rectngulo
El rea es: 25
Dentro del mtodo rea para un tringulo
El rea es: 16
El rea de la figura no est definida
El rea es: 0


Curso de J ava Standard Edition J 2SE 52
2 2. . C CL LA AS SE ES S A AB BS ST TR RA AC CT TA AS S

2 2. .1 1. . M MO OD DI I F FI I C CA AD DO OR R A AB BS ST TR RA AC CT T

El modificador abstract puede usarse de dos formas, con una clase y con un mtodo. Cuando una
clase tiene el modificador abstract en su declaracin, esta se denomina clase abstracta; lo que
indica que la clase no puede ser instanciada (no se puede crear un objeto de la clase). Cuando el
modificador abstract es usado en la declaracin de un mtodo, es llamado mtodo abstracto; en
este caso, el modificador indica que la implementacin del mtodo no se proporciona en la clase.
Los mtodos abs tractos slo pueden presentarse dentro de una clase abstracta. Si se incluye
el modificador abstract en la declaracin de un mtodo, indica que la clase que herede de esa clase,
tendr que proporcionar la implementacin para este mtodo; si no proporciona la implementacin,
entonces esa subclase deber ser declarada como abstract.


2 2. .2 2. . C CL LA AS SE ES S Y Y M M T TO OD DO OS S A AB BS ST TR RA AC CT TO OS S

Una clase abstracta sirve para definir el comportamiento genrico de la clase. La clase abstracta
tiene las definiciones de los mtodos, que proporcionan el comportamiento de la clase; tambin
puede implementar algunos de los mtodos definidos en la clase, dando una implementacin parcial
de su comportamiento.

Una clase abstracta no se puede instanciar, pero si se puede derivar. Tampoco es
posible, declarar constructores abstractos o mtodos estticos abstractos.

La forma general de declarar una clase abstracta es la siguiente:

abstract class X {
// Cuerpo de la clase

}

Las clases abstractas se usan cuando se quiere definir una superclase que declara la estructura de
una abstraccin sin proporcionar una implementacin completa de cada mtodo. Usualmente,
cuando una superclase es incapaz de brindar una implementacin significativa para un mtodo,
pueden aplicarse dos soluciones: la primera, simplemente dar un mensaje que se imprima en la
salida estndar; y la segunda, declarar el mtodo como abstracto.

La forma general de declarar un mtodo abstracto se da a continuacin:

abstract tipo nombreMtodo (lista_de_parmetros);

Como es evidente, el cuerpo del mtodo est ausente, lo que significa que la implementacin del
mtodo no se proporciona en la clase, y por lo tanto, debe ser implementado por la subclase.
Una clase abstracta puede contener cualquier cantidad de mtodos abstractos. Adems es posible
que una clase abstracta no tenga ningn mtodo abstracto en ella. Cuando una clase es
declarada como abstracta, no es necesario que la clase contenga mtodos abstractos,
pero cuando existe al menos un mtodo abstracto dentro de la clase, esta debe ser
declarada como abstract.


Curso de J ava Standard Edition J 2SE 53
2 2. .3 3 E EJ J E EM MP PL LO O D DE E C CL LA AS SE ES S Y Y M M T TO OD DO OS S A AB BS ST TR RA AC CT TO OS S. .

// Superclase Figura
abstract class Figura {
private double dim1;
private double dim2;
// Constructor
Figura (double a, double b) {
setDim1 (a);
setDim2 (b);
}
// Mtodos GETs y SETs
public void setDim1 (double x) {
dim1 = x;
}
public double getDim1 () {
return dim1;
}
public void setDim2 (double x) {
dim2 = x;
}
public double getDim2 () {
return dim2;
}
// Mtodo para calcular el rea de la figura (No implementado)
abstract public double area () {
System.out.println (El rea de la figura no est definida);
return 0;
}
}
// Clase Rectangulo que extiende a Figura
class Rectngulo extends Figura {
Retangulo (double a, double b) {
super (a, b); // Se inicializa el objeto usando el constructor de la superclase
}
// Sobrescribe el mtodo area para el rectngulo
public double area () {
System.out.println (Dentro del mtodo rea para un rectngulo);
Return getDim1() * getDim2();
}
}


Curso de J ava Standard Edition J 2SE 54
// Subclase Triangulo que extiende a Figura
class Triangulo extends Figura {
Triangulo (double a, double b) {
super (a, b); // Se inicializa el objeto usando el constructor de la superclase
}
// Sobrescribe el mtodo area para un tringulo
public double area () {
System.out.println (Dentro del mtodo rea para un tringulo);
return getDim1() * getDim2() / 2;
}
}

// Clase Ejecutable
class EncontrarAreas {
public static void main (String args[]) {
//Figura f = new Figura (10, 10); // Esto no es correcto
Rectangulo r = new Rectangulo (5, 5);
Triangulo t = new Triangulo (4, 8);
Figura figRef; // Esto es correcto
FigRef = r;
System.out.println (El rea es: + figRef.area());
FigRef = t;
System.out.println (El rea es: + figRef.area());
}
}

La salida de este programa es la siguiente:
Dentro del mtodo rea para un rectngulo
El rea es: 25
Dentro del mtodo rea para un tringulo
El rea es: 16


Curso de J ava Standard Edition J 2SE 55
3 3. . I I N NT TE ER RF FA AC CE ES S

Las interfaces son sintcticamente igual a las clases, pero sin variables de instancia y sin
implementacin para los mtodos declarados en ella. La palabra clave interface permite especificar
qu es lo que debe hacer la clase, pero no cmo lo hace. Una interfaz puede ser implementada por
cualquier nmero de clases. Adems, una clase puede implementar cualquier nmero de interfaces.
Una clase, que implementa una interfaz, debe implementar el conjunto completo de
mtodos definidos por la interfaz. Las interfaces actan como sustitutos para implementar la
herencia mltiple.


3 3. .1 1. . D DE EF FI I N NI I C CI I N N D DE E U UN NA A I I N NT TE ER RF FA AZ Z

La forma general de una interfaz es:

[acceso] interface NombreInterfaz [extends interfaz] {
tipo nombreVar = valor;
tipo_retorno nombreMetodo (lista_de_parmetros);

}

El acceso es public o no se utiliza. Cuando no se utiliza ningn modificador de acceso, entonces se
aplica el acceso por omisin y la interfaz est slo disponible para otros miembros del paquete en
que ha sido declarada. Pueden existir variables en la declaracin de la interfaz; implcitamente estas
sern de la forma final y static, lo que significa que no podrn ser cambiadas por la clase que las
implemente y adems deben ser inicializadas con un valor constante. Todos los mtodos declarados
en la interfaz son bsicamente mtodos abstractos, ya que no puede haber implementacin o
cuerpo para ninguno de ellos. Si la interfaz es declarada como pblica, entonces todos los mtodos
y variables en la interfaz tendrn acceso pblico.

interface Contestadora {
void guardarMensaje (String mens);
String getMensaje ();
}

3 3. .2 2. . I I M MP PL LE EM ME EN NT TA AC CI I N N D DE E U UN NA A I I N NT TE ER RF FA AZ Z

Una vez definida una interfaz, puede ser implementada por una o ms clases. Para implementar una
interfaz, es necesario incluir la sentencia implements en la definicin de la clase y crear los
mtodos definidos por la interfaz.

La forma general, de la implementacin de una clase, es la siguiente:

acceso class NombreClase [extends Superclase] [implements Interfaz1 [, Interfaz2] ] {
// Cuerpo de la clase
}

Si una clase implementa ms de una interfaz, las interfaces estn separadas con una coma. Si una
clase implementa dos interfaces que declaran el mismo mtodo, la clase da slo una implementacin
para el mtodo. Los mtodos que implementan una interfaz deben declarase como
pblicos y deben corresponder exactamente, en firma, con los mtodos definidos en la
interfaz.

Curso de J ava Standard Edition J 2SE 56
Ejemplo: El siguiente cdigo tiene la una clase que implementa la interfaz Contestadora:

class Telefono implements Contestadora {
String mensLlamada;
String mensGrabado = llame luego por favor;

public void guardarMensaje (String mens) {
System.out.println (Mensaje dejado en llamada: + mens);
mensLlamada = mens;
}
public String getMensaje () {
System.out.println (Mensaje grabado: + mensGrabado);
return (mensGrabado);
}

}

3 3. .3 3. . I I M MP PL LE EM ME EN NT TA AC CI I N N P PA AR RC CI I A AL L

Si una clase incluye una interfaz, pero no implementa todos los mtodos definidos por esa interfaz,
entonces esa clase tiene que ser declarada como abstract. Por ejemplo:

abstract class TeleFax implements Contestadora {
String mensGrabado = llame en 3 horas;
public String getMensaje () {
System.out.println (Mensaje grabado de TeleFax: + mensGrabado);
return (mensGrabado);
}
}

Como la clase TeleFax no implementa el mtodo guardarMensaje(String mens) tiene que ser
declarada como abstracta. Cualquier clase que herede de TeleFax, tiene que implementar el
mtodo guardarMensaje(String mens) o ser declarada como abstract.


3 3. .4 4. . V VA AR RI I A AB BL LE ES S E EN N U UN NA A I I N NT TE ER RF FA AZ Z

Es posible aplicar las interfaces para importar constantes compartidas en muchas clases, mediante
una interfaz que declara las variables que son inicializadas con valores deseados. La clase que
implementa la interfaz, incluir automticamente todos los nombres de variables como constantes.
Si una interfaz no tiene ningn mtodo, entonces cualquier clase que incluye dicha interfaz no se
tiene que preocupar de implementar nada; realmente, es como importar las variables constantes
declaradas en la interfaz como variables final en la clase que la implementa.

interface Constantes {
int A = 0;
int B = 1;
int C = 2;
}
class X implements Constantes {
int determinarConstante () {
Curso de J ava Standard Edition J 2SE 57
int ran = (int) (Math.random() * 100);
if (ran < 30) return A;
else if (ran < 60) return B;
else return C;
}
}

class Y implements Constantes {
void evaluarResultado (int res) {
switch (res) {
case A: System.out.println (Nmero bajo); break;
case B: System.out.println (Nmero medio); break;
case C: System.out.println (Nmero alto); break;
}
}
public static void main (String args []) {
X x = new X ();
Y y = new Y ();
y.evaluarResultado ( x.determinarConstante () );
}
}

Ambas clases implementaron la interfaz Constantes, donde A, B y C son los enteros definidos. El
valor de estas variables no puede ser cambiado por la clase que implementa la interfaz, pero los
valores que inicializan estas variables estn disponibles para las clases que implementes la interfaz,
como si cada clase las hubiese definido o heredado directamente.


3 3. .5 5. . J J E ER RA AR RQ QU U A A D DE E I I N NT TE ER RF FA AC CE ES S

Una interfaz puede heredar de otra interfaz usando la palabra clave extends. Esto es similar a la
herencia de clases. Slo una interfaz puede heredar de otra interfaz; una clase no puede heredar de
una interfaz. Cuando una clase implementa una interfaz que hereda de otra, tiene que implementar
todos los mtodos definidos en la cadena de herencia de la interfaz.

interface A {
void metodo1 ();
void metodo2 ();
}
interface B extends A {
void metodo3 ();
void metodo4 ();
}
interface C extends B {
void metodo4 ();
void metodo6 ();
}
interface D {
void metodo6 ();
}
Curso de J ava Standard Edition J 2SE 58
class PruebaInterfaz implements C, D {
public void metodo1 () {
System.out.println (Dentro de metodo1);
}
public void metodo2 () {
System.out.println (Dentro de metodo2);
}
public void metodo3 () {
System.out.println (Dentro de metodo3);
}
public void metodo4 () {
System.out.println (Dentro de metodo4);
}
public void metodo6 () {
System.out.println (Dentro de metodo6);
}
}
public class InterfazDemo {
public static void main (String args[]) {
PruebaInterfaz obj = new PruebaInterfaz ();
obj.metodo1 ();
obj.metodo2 ();
obj.metodo3 ();
obj.metodo4 ();
obj.metodo6 ();
}
}

La salida del programa es la siguiente:
Dentro de metodo1
Dentro de metodo2
Dentro de metodo3
Dentro de metodo4
Dentro de metodo6

Tanto la interfaz B como la C declaran el mismo mtodo: metodo4 (); a pesar que la interfaz C
hereda el metodo4 () definido en B. Esto es similar a la sobrescritura de mtodos en el caso de
clases. La clase PruebaInterfaz implementa las interfaces C y D. La clase tiene que proporcionar la
implementacin para los siguientes mtodos: metodo1 (), metodo2 (), metodo3(), metodo4() y
metodo6(); debido a que la interfaz C declara implcitamente todos los mtodos anteriores, dado
que hereda de las interfaces A y B. Tanto la interfaz C como la D declaran el mtodo: metodo6(),
pero la clase tiene que dar slo una implementacin del mtodo; en caso contrario, ocurre un error
de compilacin. Si la clase dejara de dar implementacin para alguno de los mtodos, esta
tendra que ser declarada como abstract.


3 3. .6 6. . U US SO O D DE E I I N NT TE ER RF FA AC CE ES S C CO OM MO O R RE EF FE ER RE EN NC CI I A AS S

Se pueden tener una variable de tipo interfaz, que hagan referencia a una instancia de una clase
que implementa la misma interfaz. Cuando se invoca un mtodo a travs de tal referencia, la versin
correcta del mtodo invocado se basar en la instancia actual de la interfaz que es referenciada (se
Curso de J ava Standard Edition J 2SE 59
elige dinmicamente, en tiempo de ejecucin). El manejo de interfaces a travs de referencia, es
similar a la referencia de una superclase, para acceder a una subclase. A continuacin se muestra
un programa que ilustra el poder polimrfico de una variable de referencia de interfaz:

interface Contestadora {
void guardarMensaje (String mens);
String getMensaje ();
}

class Telefono implements Contestadora {
String mensLlamada;
String mensGrabado = llame luego por favor;

public void guardarMensaje (String mens) {
System.out.println (Mensaje dejado en llamada en Telefono: + mens);
mensLlamada = mens;
}
public String getMensaje () {
System.out.println (Mensaje grabado de Telefono: + mensGrabado + \n);
return (mensGrabado);
}
}

class TelefonoCelular implements Contestadora {
String mensLlamada;
String mensGrabado = llame en 2 horas;
public void guardarMensaje (String mens) {
System.out.println (Mensaje dejado en llamada en TelefonoCelular: + mens);
mensLlamada = mens;
}
public String getMensaje () {
System.out.println (Mensaje grabado de TelefonoCelular: + mensGrabado + \n);
return (mensGrabado);
}
}

class InterfazDemo {
public static void main (String args[]) {
String mens;
Contestadora con = new Telefono();
mens = con.getMensaje();
System.out.pintln (Mensaje recibido: + mens) ;
con.guardarMensaje(cita a las 11 am);

TelefonoCelular t2 = new Telefono2();
con = t2;
mens = con.getMensaje();
System.out.pintln (Mensaje recibido: + mens) ;
con.guardarMensaje(cita a las 2 pm);
Curso de J ava Standard Edition J 2SE 60
}
}

La salida del programa es la siguiente:
Mensaje grabado en Telefono: llame luego por favor
Mensaje recibido: llame luego por favor
Mensaje dejado en llamada de Telefono: cita a las 11 am

Mensaje grabado de TelefonoCelular: llame en 2 horas
Mensaje recibido: llame en 2 horas
Mensaje dejado en llamada de TelefonoCelular: cita a las 2 pm




Curso de J ava Standard Edition J 2SE 61
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
TEMA I V: Excepci ones


OBJ ETI VOS:
Escribir programas en J ava, que manipulen los errores a travs de las excepciones definidas
en el lenguaje.
Crear y utilizar en programas J ava, excepciones definidas por el mismo, de acuerdo a las
necesidades de cualquier problema.

CONTENIDO:
Definicin de Excepcin
Tipos de excepciones
Manejo de excepciones
J erarqua de excepciones
Propagacin de excepciones
Sobrescritura de mtodos y excepciones
Definicin de excepciones propias










61
Curso de J ava Standard Edition J 2SE 62
1 1. . D DE EF FI I N NI I C CI I N N D DE E E EX XC CE EP PC CI I N N

Una de las verdades fundamentales al escribir programas es la ocurrencia inevitable de errores.
Algunos lenguajes de programacin controlan y manejan estos errores de forma manual mezclando
el cdigo de la aplicacin con el de verificacin y manejo de errores, lo que resultaba en un cdigo
complejo, difcil de leer y de mantener.

Lenguaje C:
void main() {
int a=10; int b=0;
double res=0;
if (b) {
res = a / b;
printf(El resultado es: %g, res)
} else {
printf(Error Divisin por 0);
}
}
Visual Basic:
Private Sub Dividir ()
Dim a, b As Integer
Dim res As Double
a=0 b=0 res=0
On Error Goto 110
res = a / b
print El resultado es: + CStr(res)
halt(0)
110: print Error Divisin por 0
End Sub

J ava ofrece una elegante solucin a estos problemas con un mecanismo para el manejo de los
errores en tiempo de ejecucin, conocida como manipulacin de Excepciones. Una excepcin es
una condicin anormal que ocurre durante la ejecucin de un programa e interrumpe el
flujo normal de sus instrucciones. En otras palabras, una excepcin es un error en tiempo de
ejecucin. Una excepcin en J ava es un Objeto que describe una condicin excepcional, es decir,
un error que se ha producido en un fragmento de cdigo. La gestin de excepciones de J ava evita
todos los inconvenientes de la gestin de errores por validaciones y cdigos de error y, en el
proceso, lleva a la gestin de errores en tiempo de ejecucin al mundo orientada a objetos.

public class ProgramaExcepciones {
public static void main(String [] args) {
int a=10; int b=0;
double res=0;
try {
res = a / b;
System.out.println(El resultado es: + res);
} catch (Exception e) {
System.out.println(Error Divisin por 0);
}
}
}


La ventaja ms importante del manejo de excepciones, es que ste automatiza gran parte del
cdigo para manejar aquellos errores en tiempo de ejecucin que previamente han sido
determinados. Por ejemplo, en varios lenguajes de programacin (como Visual Basic), los cdigos de
errores son retornados cuando un mtodo falla, y estos valores se deben revisar manualmente cada
vez que se invoque al mtodo. Esta aproximacin es tediosa y propensa a error. El manejo de
excepciones, controla los errores de lneas de flujo, lo que permite definir en un programa un bloque
de cdigo, conocido como manejador de excepciones, que es ejecutado automticamente
cuando ocurre un error. No es necesario comprobar manualmente el xito o falla de cada operacin
o mtodo especfico; si ocurre un error, ste ser procesado por el manejador de excepciones.
M
A
N
E
J
A
D
O
R

D
E

E
X
C
E
P
C
I
O
N
E
S

Curso de J ava Standard Edition J 2SE 63
2 2. . T TI I P PO OS S D DE E E EX XC CE EP PC CI I O ON NE ES S E EN N J J A AV VA A

Las excepciones pueden ser generadas por el intrprete J ava o pueden ser generados por el propio
cdigo. Las excepciones generadas por J ava estn relacionadas con errores fundamentales que
violan las reglas del lenguaje o las restricciones del entorno de ejecucin. Las excepciones
generadas manualmente se usan para informar de alguna condicin de error al mtodo que lo
invoc.

Todos los tipos de excepciones en J ava son subclases de la clase Throwable (lanzable) o de una de
sus subclases. Slo los objetos de esta clase, o de una de sus subclases, pueden ser lanzados al
sistema en tiempo de ejecucin con la clusula throw; y slo esta clase o una de sus subclases
puede ser un argumento en una clusula catch. Throwable contiene una copia de la pila de
llamadas de mtodos y un mensaje que describe al objeto lanzado. La clase Throwable se encuentra
en el paqueta java.lang. Las siguientes son subclases de Throwable:

- Error: los objetos de esta clase representan errores fatales en la J VM o fallas de enlace
dinmico. No es normal para un programa tpico de J ava lanzar Error.



Grfico 1. J erarqua de la clase Error

La siguiente tabla describe las clases de error ms generales:

ERROR DESCRIPCIN
LinkageError Se lanza cuando ocurre un error en tiempo de enlace
ThreadDeath Se lanza cuando la ejecucin de un hilo falla
VirtualMachineError Se lanza con un error interno de la Mquina Virtual de J ava


Throwable
Error
LinkageError ThreadDeath VirtualMachineError
ClassCircularityError
ClassFormatError
ExceptionInitializeErr
IncompatibleClassCh
NoClassDefFormatErr
UnsatisfiedLinkError
VerifyError
InternalError
OutOfMemoryError
StackOverflowError
UnknownError
AbstractMethodError
IllegalAccessError
InstantiantionError
NoSuchFieldError
NoSuchMethodError
Curso de J ava Standard Edition J 2SE 64
- Exception: indica que existe algn problema, no necesariamente uno fatal, que puede ser
manejado por un programa razonable. Todos los programas J ava probablemente lanzaran y
capturaran Exception pero no Error.



Grfico 2. J erarqua de la clase Excepcin

La siguiente tabla describe las clases de excepcin ms generales:

EXCEPTION DESCRIPCIN
ClassNotFoundException
Es lanzada, cuando no se consigue un recurso o una clase
solicitada
CloneNotSupportedException Lanzado cuando se ejecuta el mtodo clone() de la clase Class
RuntimeException Engloba una serie de errores en tiempo de ejecucin
IllegalAccessException Engloba los errores de acceso
InstantiationException Cuando ocurre un error en la instanciacin de una clase
IOException Se lanza cuando ocurre un error de Entrada/Salida (E/S)



Throwable
Exception
ClassNotFoundException
CloneNotSupportedException
RuntimeException
AritmeticException
ArrayStoreException
IllegalArgumentException
ClassCastExcepcion
IllegalMonitorStateException
IllegalStateException
IndexOutOfBoundsException
NegativeArraySizeException
SecurityException
NullPointerException
IllegalAccessException
InstantiationException
InterruptedException
IOException
IllegalThreadStateException
NumberFormatException
ArrayIndexOutOfBoundsExce
StringIndexOutOfBoundsExce
Curso de J ava Standard Edition J 2SE 65
3 3. . M MA AN NE EJ J O O D DE E E EX XC CE EP PC CI I O ON NE ES S E EN N J J A AV VA A

Cuando ocurre un error, se crea un objeto que representa la excepcin y se enva al sistema en
tiempo de ejecucin. El sistema en tiempo de ejecucin busca un manejador de excepciones
apropiado en la pila de llamadas hacia atrs, empezando con el mtodo en el que ocurri el error. Si
un manejador de excepcin es elegido se dice que captura la excepcin. Si no se encuentra un
manejador de excepcin apropiado, el sistema en tiempo de ejecucin y el programa J ava terminan.




Grfico 3. Manejo de Excepciones en J ava


El manejo de excepciones en J ava se realiza mediante cinco palabras claves: try, catch, throw,
throws y finally. Bsicamente el funcionamiento es el siguiente:

- Las sentencias del programa que pueden generar una excepcin se incluyen dentro del bloque
try.

- El cdigo puede capturar esta excepcin, usando cath, y tratarla de manera racional.
- Para generar una excepcin se usa throw.

- Para especificar las excepciones que puede lanzar un mtodo se usa throws.

- Cualquier cdigo que se tenga que ejecutar antes de que termine un mtodo se introduce en
un bloque finally.


Ocurre un ERROR
No
No
Si
Si
Objeto Excepcin
creado
Termina el sistema en
tiempo de ejecucin y el
programa J ava
Buscar hacia atrs en
la pila de llamadas
Objeto Excepcin
entregado al sistema
en tiempo de ejecucin
Busc en
toda la pila
de llamadas?
El sistema en tiempo de
ejecucin examina la pila de
llamadas empezando en el
mtodo en que ocurri el error
Manejador de
Excepciones apropiado
encontrado
Dejar que el manejador
capture la excepcin
La Excepcin
lanzada es del tipo
del manejador?
Curso de J ava Standard Edition J 2SE 66
Esta es la forma general de un bloque de cdigo con gestin de excepciones:

try {
// bloque de cdigo
} catch (tipoExcepcin e) {
// Cdigo para manejar las excepciones para el tipoExcepcin

} finally {
// bloque de cdigo que se ejecutara antes de que termine el try
}


4 4. . R RE EQ QU UE ER RI I M MI I E EN NT TO O D DE E C CA AP PT TU UR RA A O O E ES SP PE EC CI I F FI I C CA AC CI I N N D DE E J J A AV VA A

En J ava, es necesario que un mtodo capture o especifique todas las excepciones verificadas que
pueden ser lanzadas dentro del alcance del mtodo. Esto es:

- Capturar: un mtodo puede capturar una excepcin proporcionando un manejador
apropiado para ese tipo de excepcin.

- Especificar: si un mtodo elige no capturar una excepcin debe especificar que puede
lanzarla.

- Excepciones verificadas: son excepciones que el compilador verifica que sean capturadas
o especificadas.

- Alcance del mtodo: las excepciones pueden ser lanzadas directamente usando throw; o
indirectamente por la llamada a otros mtodos.


5 5. . J J E ER RA AR RQ QU U A A D DE E E EX XC CE EP PC CI I O ON NE ES S

Se debe capturar primero la excepcin ms especfica, y luego proceder a capturar las excepciones
ms generales hasta alcanzar aquella que sea la ms genrica.

try {
FileInputStream fis = new FileInputStream(archivo.dat);
} catch (FileNotFoundException fnfe) {

} catch (IOException ioe) {

} catch (Exception e) {

}


6 6. . P PR RO OP PA AG GA AC CI I N N D DE E E EX XC CE EP PC CI I O ON NE ES S

En la sintaxis declarativa de los mtodos, existe una seccin destinada a especificar cuales son las
excepciones que dicho mtodo no manipula en su cuerpo y que puede lanzar a la pila de llamadas.

[acceso] [modif] tipo nombreMetodo([parmetros]) [throws exceptions]
Curso de J ava Standard Edition J 2SE 67
Es posible que una excepcin no sea capturada en el alcance del mtodo. En tal caso, la excepcin
se propagar en la pila de llamadas hasta encontrar un manejador de excepcin apropiado.

Grfico 4. Propagacin de Excepciones

Un mtodo sobrescrito en una subclase solo puede lanzar excepciones declaradas en la clase padre
o hijos de las excepciones declaradas en la clase padre.

public class Base {
public void metodo1 () throws IOException {
};
}
public class Derivada extends Base {
public void metodo1 () throws FileNotFoundException {
};
}


7 7. . D DE EF FI I N NI I E EN ND DO O N NU UE ES ST TR RA AS S P PR RO OP PI I A AS S E EX XC CE EP PC CI I O ON NE ES S

Las clases de excepcin generalmente tienen constructores pero no datos ni mtodos. Todo lo que
hacen es llamar a los constructores de subclase. Por eso nosotros podemos crear nuestras propias
excepciones y para ello creamos una clase que extienda de clase Exception.

public class MiExcepcion extends Exception {
public MiExcepcion () {
super();
}
public MiExcepcion (String s) {
super(s);
}
}

8 8. . E EJ J E EM MP PL LO O C CO OM MP PL LE ET TO O D DE E U UN N P PR RO OG GR RA AM MA A J J A AV VA A Q QU UE E M MA AN NE EJ J A A E EX XC CE EP PC CI I O ON NE ES S

/*
* Ejemplo de un programa J ava con manejo de excepciones
* Sumar n nmeros enteros
*/


Curso de J ava Standard Edition J 2SE 68
public class SumarEnteros {
public static void main(String args[]) {
int r = 0;
try {
for(int i=0; i<args.lenght; i++)
r += Integer.parseInt(args[i]);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println(Formato: SumarEnteros n1 n2 nN);
} catch(NumberFormatException e) {
System.out.println(Error: Los argumentos deben ser enteros.);
} finally {
System.out.println(El resulado es + r);
}
}
}



Curso de J ava Standard Edition J 2SE 69
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
TEMA V: Ent rada/Sal i da


OBJ ETI VOS:
Escribir programas en J ava, que utilicen flujos de entrada y salida para interactuar con los
usuarios.
Crear y utilizar en programas J ava, que implementen la persistencia de datos, a travs de
los flujos de archivo y de la serializacin de objetos.

CONTENIDO:
Flujos
Tipos de flujos
Flujos predefinidos
Entrada/Salida por consola
Flujos de archivo
Serializacin de objetos










69
Curso de J ava Standard Edition J 2SE 70
Desde el comienzo del curso se han estado utilizando (sin una explicacin formal) partes del
Sistema de Entrada/ Salida (E/ S) de J ava, tales como System.out.println(). En este tema se
estudiar el mtodo de J ava para manejar las entradas y salidas desde consola y archivos. Aunque
solo se estudiar una porcin del extenso sistema, afortunadamente el mismo es coherente y
consistente, por lo que una vez que se entiendan sus fundamentos, el resto del sistema es fcil de
manejar.


1 1. . F FL LU UJ J O OS S ( (S ST TR RE EA AM MS S) )

Los programas J ava realizan procesos de E/S a travs de flujos. El programa establece una conexin
con un dispositivo fsico para leer informacin de l o para escribir informacin en l, y la
informacin se lee o escribe en forma serial.

Un flujo puede ser definido como una entidad lgica que produce o consume informacin, y
est encadenado a un dispositivo fsico por el sistema de E/ S de J ava. Los flujos pueden
ser dirigidos a cualquier dispositivo de E/S compatible. Todos los flujos se comportan de la misma
manera, aunque los dispositivos fsicos reales a los que estn ligados difieran. As las mismas clases
y mtodos de E/S pueden ser aplicadas a cualquier tipo de dispositivo, bien sea bien sea la entrada
o salida estndar, la memoria, un archivo, una conexin de red, etc.




Grfico 1. Flujos de Entrada/Salida


2 2. . T TI I P PO OS S D DE E F FL LU UJ J O OS S

El paquete java.io tiene las clases necesarias para la utilizacin de flujos en J ava. Los flujos pueden
ser clasificados de la siguiente manera:

- De acuerdo con el tipo de dato que utilizan: se pueden clasificar en flujos de
caracteres (manipulan los datos como caracteres Unicode) y flujos de bytes (manipulan los
datos como objetos).

- De acuerdo con el uso que se les d: se pueden clasificar en flujos consumidores
(obtienen datos de una fuente) y flujos de procesamiento (utilizan funciones para la
conversin, clasificacin y filtrado de datos obtenidos de los flujos).



Grfico 2. Clasificacin de Flujos en J ava
DATOS
Flujo de Salida
PROGRAMA
DISPOSITI V
O F SICO
DATOS
PROGRAMA
DISPOSITI V
O F SICO
Flujo de Entrada
Flujos
De Caracteres De Bytes
Class Reader Class Writer Class InputStream Class OutputStream
Curso de J ava Standard Edition J 2SE 71


Grfico 3. J erarqua de clases Reader y Writer




Grfico 4. J erarqua de clases InputStream y OutputStream


De las jerarquas de clases de flujos en J ava, es importante sealar que las clases que aparecen
sombreadas representan las clases procesadoras (aaden caractersticas a la forma de recibir o
enviar los datos de los dispositivos) y las otras son las clases consumidoras (definen de dnde o a
dnde se estn enviando o recibiendo los datos, es decir al dispositivo que se conecta en flujo).
La siguiente tabla explica la jerarqua de clases para los flujos de carcter:

OutputStream
FileOutputStream
PipedOutputStream
FilterOutputStream
ObjectOutputStream
DataOutputStream
PrintStream
BufferedOutputStre
am
PushBackOuputStre
am
ByteArayOuputStream
InputStream
FileInputStream
PipedInputStream
ByteArrayInputStream
StringBuferInputStream
SequenceInputStream
FilterInputStream
ObjectInputStream
DataInputStream
LineNumberInputStrea
BufferedInputStream
PushBackInputStream
Reader
BufferedReader
CharArrayReader
I nputStreamReader
FilterReader
PipedReader
StringReader
LineNumberReader
FileReader
PushBackReader
Writer
BufferedWriter
CharArrayWriter
OutputStreamWrit
er
FilterWriter
PipedWriter
StringWriter
FileWriter
PrintWriter
Curso de J ava Standard Edition J 2SE 72
COMPONENTE PROPSITO
Reader y Writer Clases abstractas para leer y escribir flujos de carcter.
BufferedReader y BufferedWriter
Leen o escriben texto desde los flujos de caracteres. Permiten
almacenar en un buffer los caracteres, de manera de leer o escribir
eficientemente caracteres, lneas y arreglos
CharArrayReader y CharArrayWriter
Heredan de Reader. El buffer de caracteres que implementan estas
clases sirven como flujo de entrada y salida de caracteres.
InputStreamReader y OutputStreamWriter
Actan como puente entre los flujos de bytes y los flujos de
caracteres. Permiten leer o escribir los bytes y convertirlos en
caracteres de acuerdo a la codificacin de caracteres especificada.
FileReader y FileWriter
Son subclases de InputStreamReader, y nos permiten leer o escribir
convenientemente en los archivos de caracteres.
FilterReader y FilterWriter
Son clases abstractas que heredan de la clase Reader y Writer.
Permiten leer o escribir flujos de caracteres filtrados.
PushBackReader
Es una subclase de FilterReader, y es una clase lectora de flujos de
caracteres. Nos permite colocar los caracteres en el flujo.
PipedReader y PipedWriter
Son subclases de Reader y Writer. Se usan para encauzar los flujos
de entrada y salida de caracteres.
StringReader y StringWriter
Son subclases de Reader y Writer. Permiten ller o escribir un flujo de
caracteres. La fuente del flujo debe ser una cadena
LineNumberReader
Hereda de BufferedReader. Es un flujo de entrada de caracteres que
se guarda en un buffer y permite llevar un registro de los nmeros de
lneas. Identifica el fin de la lnea usando un cambio de lneas \n o
un retorno de carro \r.
PrintWriter
Hereda de Writer. Permite imprimir en un flujo de salida de texto, las
representaciones del objeto que se est formateando. PrintWriter
implementa todas las versiones del mtodo print que estn
disponibles en PrintStream. Esta clase no puede ser usada para bytes
puros de datos (raw data).

Tabla 1. J erarqua de clases para Flujos de Caracter

La siguiente tabla explica la jerarqua de clases para los flujos de carcter:

COMPONENTE PROPSITO
InputStream y OutputStream Son clases abstractas que permiten leer bytes de datos.
FileInputStream y FileOutputStream
Son subclases de InputStream y OutputStream, que leen o escriben
contenido en un archivo en la forma de bytes.
PipedI nputstream y
PipedOutputStream
Es una subclase de InputStream y OutputStream, lee o escribe bytes
de datos a travs de una tubera de comunicacin y los
PipedXXXStream son el extremo de envo o recepcin de la tubera.
ByteArrayI nputStream y
ByteArrayOutputStream
Son subclases de InputStream y Outputstream, y posee un buffer
interno que guarda los bytes que pueden ser ledos o escritos en el
flujo. Tienen un contador interno que permite guardar un registro del
siguiente byte a ser proporcionado para la lectura o escritura.



Curso de J ava Standard Edition J 2SE 73
COMPONENTE PROPSITO
StringBufferInputStream
Es una subclase de InputStream. Permite que una aplicacin cree un
flujo en una cadena y lea su contenido en la forma de bytes. Esta
clase solo usa los ocho bits bajos usados para representar un carcter.
Est actualmente en desuso (deprecated).
SequenceInputStream
Es una subclase de InputStream. Representa la concatenacin lgica
de otros flujos de entrada. Se inicia con una coleccin de flujos de
entrada y lee el primer flujo hasta alcanzar el fin de la entrada, luego
toma el siguiente flujo de entrada y as sucesivamente, hasta que
alcanza el fin del ltimo flujo de entrada contenido.
FilterInputStream y FilterOutputStream
Son subclases de InputStream y OutputStream. Toman la data de
algn otro flujo de entrada/salida y la manipula segn se requiera.
DataInputStream y DataOutputstream
Son subclases de FilterInputStream y FilterOutputStream. Permiten
que una aplicacin lea o escriba los tipos de datos primitivos de J ava
desde el flujo de entrada/salida asociado, independientemente del tipo
de mquina.
BufferedInputStream y
BufferedOutputStream
Son subclases de FilterInputStream y FilterOutputStream. Permiten a
los flujos de entrada y salida almacenar en un buiffer los bytes de
data ya ledos o escritos, con lo cual no necesita efectuar llamadas al
sistema subyacente por cada byte, ledo o escrito.
PushBackInputStream y
PushBackOutputStream
Ofrecen la funcionalidad para colocar nuevamente (unread) un byte
especifico de dato de un flujo de entrada o salida. Es til cuando los
bytes de data que son ledos o escritos estn delimitados por un byte
especfico. El ltimo byte que es ledo o escrito ser regresado al flujo,
de manera que la siguiente operacin leer o escribir nuevamente
ese byte.
LineNumberInputStream
Es una subclase de FilterInputStream. Esta clase es un flujo de
entrada filtrado con una funcionalidad adicional para guardar un
registro del nmero de lnea actual. Identifica el fin de la lnea usando
un cambio de lneas \n o un retorno de carro \r.
PrintStream
Es una subclase de FilterOutputStream, permite que otro flujo base de
salida imprima convenientemente la representacin de varios tipos de
valores de datos.
ObjectInputStream y ObjectOutputStream
Permiten la serializacin deserializacin de datos primitivos u objetos
para ser ledos o escritos en un programa.

Tabla 2. J erarqua de clases para Flujos de Bytes


3 3. . F FL LU UJ J O OS S P PR RE ED DE EF FI I N NI I D DO OS S

En el paquete java.lang se encuentra la clase System que encapsula algunos aspectos del entorno
de ejecucin. Esta clase tiene 3 variables de clase pblicas que estn asociadas con flujos:

- out: se refiere al flujo de salida estndar que, por omisin, es la consola (System.in)
- in: se refiere a la entrada estndar que, por omisin, es el teclado (System.out)
- err: se refiere al error estndar que, por omisin, tambin es la consola (System.err)

Curso de J ava Standard Edition J 2SE 74
4 4. . E EN NT TR RA AD DA A/ / S SA AL LI I D DA A P PO OR R C CO ON NS SO OL LA A

En J ava, la entrada por consola se efecta leyendo bytes de un flujo de entrada. Estos bytes se
pueden leer en varios objetos, como pueden ser caracteres y cadenas. El mtodo de entrada de mas
bajo nivel es read(). Este mtodo est definido en la clase InputStream. Cada vez que se llama al
mtodo read() lee un nico byte del flujo de entrada y lo devuelve como un valor entero.
El mtodo devuelve -1 cuando encuentra el final del flujo.

int read() throws IOException

El siguiente programa muestra el funcionamiento del mtodo read(), donde leen caracteres de la
entrada estndar hasta que el usuario pulsa la letra s.

import java.io.*;
public class LecturaPorConsolaCaracter {
public static void main (String args[]) throws IOException {
char caract;
System.out.println(Introduzca caracteres, s para salir: );
do {
caract = (char) System.in.read( );
System.out.println (caract);
} while (caract != s);
}
}

System.in es, por omisin, un flujo con bfer, es decir, no se pasa ninguna entrada al programa
hasta que se pulsa la tecla ENTER. Esto hace que el mtodo read() no sea muy til para entradas
por consola interactivas, ya que una de las acciones de entrada ms comunes que realiza un
programa es la lectura de una cadena completa del teclado y el mtodo read() solo permite leer
carcter por carcter. Para facilitar la lectura por consola de una cadena entera con una sola
instruccin se utiliza el mtodo readLine() de la clase BufferedReader. Este mtodo lee todos los
caracteres hasta encontrar \n o \r y devuelve un String (sin incluir estos caracteres).

final String readLine() throws IOException

El siguiente programa muestra el funcionamiento del mtodo readLine(), donde lee una cadena de
caracteres de la entrada estndar.

import java.io.*;
public class LecturaPorConsolaCadena {
public static void main (String args[]) throws IOException {
String str;
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
System.out.println (Escriba una cadena de caracteres sin espacio y presione ENTER.);
s = br.readLine ();
System.out.println (Ud. escribi: + str);
}
}



Curso de J ava Standard Edition J 2SE 75
En J ava, la salida por consola se realiza con la ayuda de los mtodos print () y println() que estn
definidos en la clase PrintStream que es el tipo del objeto referenciado por System.out. los
mtodos print() y println(), permiten escribir por consola cualquier tipo de datos simple, ya que
estn sobrecargados para ello. Como la clase PrintStream es un flujo de salida derivado de
OutputStream, tambin implementa el mtodo de bajo nivel write ().

void write(int valorByte)

El siguiente programa utiliza el mtodo write() para imprimir el carcter A seguido de un carcter
de lnea nueva.

public class Escribir {
public static void main(String args[]) {
int a = new Integer(20);
Double dou = 15.5;
String cad = new String(El valor de pi es: );
System.out.write (a);
System.out.print (Un valor double es + dou + \n);
System.out.println (cad + Math.pi)
}
}
Cuando los mtodos print () o println () son invocados y se les pasa por parmetro un Object,
automticamente se imprime el resultado de ejecutar el mtodo toString() de la clase a la que
pertenece el parmetro referenciado.


5 5. . F FL LU UJ J O OS S D DE E A AR RC CH HI I V VO OS S

Para utilizar los archivos en J ava, se pueden emplear tanto los flujos de carcter como los flujos de
byte y ambos funcionan de manera similar, slo varan en la forma como el lenguaje se comunica
con el dispositivo fsico internamente. Para comprender esto, hay que tener en cuenta que los
archivos para J ava solo son secuencias de bytes, denominados archivos secuenciales; razn por
la cual no hace diferencia si el archivo es de texto o es un archivo estructurado. Por otro lado
tambin existen los archivos de acceso aleatorio que son tratados de forma diferente.


5 5. .1 1. . A AR RC CH HI I V VO OS S S SE EC CU UE EN NC CI I A AL LE ES S

Las clases FileReader y FileWriter crean flujos de caracteres asociados a los archivos
secuenciales. Mientras que las las clases FileInputStream y FileOutputStream crean flujos de
bytes asociados a los archivos. Para abrir un archivo, simplemente es necesario crear un objeto de
estas clases, especificando el nombre del archivo en el constructor. Para cerrar el archivo, se invoca
al mtodo close(), definido en todas las clases.
o FileReader(String rutaArchivo) throws FileNotFoundException // Abrir para Lectura
o FileInputStream(String rutaArchivo) throws FileNotFoundException // Abrir para Lectura
o FileWriter(String rutaArchivo) throws IOException // Abrir para escritura
o FileOutputStream(String rutaArchivo) throws IOException // Abrir para Escritura
Curso de J ava Standard Edition J 2SE 76
El siguiente programa utiliza el mtodo read() de la clase FileReader y FileInputStream para leer y
mostrar el contenido de un archivo.


import java.io.*;
public class LeerArchivoSecuencial{
public static void main(String args []) {
try {
FileReader fr = null;
try {
fr = new FileReader(ArchivoTexto.txt);
} catch (FileNotFoundException e) {
System.out.println(Archivo no encontrado);
}
int caract = fr.read();
while (caract != -1) {
System.out.println((char)caract);
caract = fr.read();
}
fr.close();
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
import java.io.*;
public class LeerArchivoSecuencial {
public static void main(String args []) {
try {
FileInputStream fis = null;
try {
fis=new FileI nputStream (Archivo.dat);
} catch (FileNotFoundException fnf) {
System.out.println(Archivo no encontrado);
}
int num = fis.read();
while (num != -1) {
System.out.println(num);
num = fis.read();
}
fis.close();
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}


El siguiente programa utiliza el mtodo write() de la clase FileWriter y FileOutputStream para
escribir una serie de bytes en un archivo.


import java.io.*;
public class EscribirArchivoSecuencial{
public static void main(String args[]) {
try {
FileWriter fw=null;
try {
fw= new FileWriter(ArchivoTexto.txt);
} catch (IOException ioe) {
System.out.println(Error al abrir el archivo
para salida);
}
for (int i=0;i<10;i++)
fw.write(Nmero + i + .);
fw.close();
} catch(IOException ioe){
System.out.println(Error al tratar el archivo
para salida: + ioe.getMessage ());
}
}
}
import java.io.*;
public class EscribirArchivoSecuencial {
public static void main(String args[]) {
try {
FileOutputStream fos=null;
try {
fos = new FileOutputStream(Archivo.dat);
} catch (IOException ioe) {
System.out.println(Error al abrir el archivo para
salida);
}
for (int i=0;i<10;i++)
fos.write(i);
fos.close();
} catch(IOException ioe){
System.out.println(Error al tratar el archivo para
salida: + ioe.getMessage ());
}
}
}


Curso de J ava Standard Edition J 2SE 77
5 5. .2 2. . A AR RC CH HI I V VO OS S D DE E A AC CC CE ES SO O A AL LE EA AT TO OR RI I O O

El paquete java.io declara una clase RandomAccessFile, que sirve para leer o escribir en archivos
de forma aleatoria. Los argumentos de la clase instanciada deciden si el objeto ser utilizado para
leer o escribir. Para abrir un archivo, simplemente es necesario crear un objeto de sta clases,
especificando el nombre del archivo en el constructor y el modo de apertura.
- RandomAccessFile(String rutaArchivo, r) // Abrir para Lectura
- RandomAccessFile(String rutaArchivo, rw) // Abrir para Lecto-Escritura

RandomAccessFile soporta el concepto de un puntero de archivo para indicar la ubicacin actual en
el archivo. En el momento de creacin del archivo, el puntero de archivo se establece en 0,
indicando el inicio del archivo. Luego el nmero de bytes que son ledos o escritos mueve el puntero
de archivo. RandomAccessFile dispone de los siguientes mtodos para manipular el puntero de
archivo:

- int skipBytes(int nroBytes): Mueve el puntero de archivo hacia delante el nmero de
bytes especificado.

- void seek(long pos): Posiciona el puntero de archivo antes del byte especificado.

- long getFilePointer(): Permite obtener la ubicacin actual del puntero de archivo.

En caso de que el fin de archivo se alcance antes de leer el nmero de bytes especificado, entonces
se lanza una EOFExcepcion y en caso de no leer o escribir un byte, entonces se lanza una
IOExcepcion.

El siguiente programa ejemplifica el uso de la clase RandomAccessFile para leer y mostrar el
contenido de un archivo.

import java.io.*;
public class LeerArchivoAleatorio {
public static void main(String args []) {
try {
RandomAccessFile ra = null;
try {
ra = new RandomAccessFile(Archivo.dat,r);
} catch (FileNotFoundException e) {
System.out.println(Archivo no encontrado);
}
for(int i=0;i<ra.length();i++){
ra.seek(i);
System.out.println(ra.readInt());
}
ra.close();
} catch(I OException ioe) {
ioe.printStackTrace();
}
}
}
import java.io.*;
public class EscribirArchivoAleatorio {
public static void main(String args []) {
try {
RandomAccessFile ra = null;
try {
ra = new RandomAccessFile(Archivo.dat,rw);
} catch (FileNotFoundException fnf) {
System.out.println(Archivo no encontrado);
}
for(int i=0;i<10;i++) {
seek(i);
ra.writeInt(i);
}
fis.close();
} catch(I OException ioe) {
ioe.printStackTrace();
}
}
}

Curso de J ava Standard Edition J 2SE 78
6 6. . S SE ER RI I A AL LI I Z ZA AC CI I N N D DE E O OB BJ J E ET TO OS S

La serializacin de objetos es el proceso por el cual el estado de un objeto es transformado en un
flujo de bytes. Se aplica en RMI (comunicacin entre objetos va conectores de red) y persistencia
ligera (forma de guardar slo el estado del objeto).

Para escribir una clase cuyos objetos sean serializables en J ava, la clase tiene que implementar la
interfaz java.io.Serializable. Serializable es una interfaz sin mtodos que permite identificar la
semntica de la serializacin.

interface Serializable {
}

El proceso de escribir o almacenar el estado de un objeto se conoce como serializacin.
El proceso de leer o recuperar el estado de un objeto se conoce como deserializacin.

La clase del objeto, la firma de la clase y los valores de los campos no transient y no static de un
objeto se escriben mediante el mecanismo de serializacin por omisin. Cualquier referencia a otros
objetos en campos no transient y no static causara que los objetos referenciados se escriban.

El siguiente programa permite almacenar objetos en un archivo.

import java.io.*;
public class Serializar {
public static void main(String args[]) {
FileOutputStream fos = new FileOutputStream(c:\Ejemplo.dat);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(1243); // Escribe un objeto de Integer
oos.writeObject(Ejemplo); // Escribe cualquier tipo Object
oos.close(); fos.close();
}
}

El siguiente programa muestra como son recuperados (deserializacin) los objetos escritos en el
archivo ejemplo.dat:

import java.io.*;
public class Deserializar {
public static void main(String args[]) {
FileInputStream fis = new FileInputStream(c:\Ejemplo.dat);
ObjectInputStream ois = new ObjectInputStream(fis);
System.out.println(ois.readInt);
System.out.println((String)ois.readObject());
ois.close(); fis.close();
}
}

Si una superclase de una clase no es serializable, entonces la subclase puede tomar la
responsabilidad de encargarse de serializar las variables public, protected, y friendly (cuando es
accesible) de la superclase y restaurarlos. Esto es posible cuando la superclase tiene un constructor
que no toma ningn parmetro para inicializar su estado y es accesible a subclase. Durante la
Curso de J ava Standard Edition J 2SE 79
deserializacin, los campos de la superclase son inicializados usando este constructor. Los campos
de la subclase serializable son recuperados de ObjectInputStream.

La interfaz java.io.Externalizable extiende de Serializable. No tiene comportamientos
automticos, todo esta en manos del programador.

interface Externalizable extends Serializable {
public void writeExternal(ObjectInput)
public void readExternal(ObjectOutput)
}

Al transformarse un objeto, el mtodo writeExternal() es responsable de todo lo que se hace. Slo
se guardar lo que se indique dentro de este mtodo.

El mtodo readExternal() debe ser capaz de recuperar lo guardado por writeExternal(). La
lectura debe ser en el mismo orden que la escritura. Es importante saber que antes de llamar a este
mtodo se llama al constructor de la clase.


Curso de J ava Standard Edition J 2SE 80
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
TEMA VI : Tecnol og a de Acceso a Dat os


OBJ ETI VOS:
Describir las tecnologas de acceso a bases de datos de J ava.
Escribir programas en J ava que sean capaces de interactuar con una base de datos.


CONTENIDO:
Manejo de Base de Datos en J ava
La API J DBC
Acceso a base de datos
Clases de soporte J DBC










80
Curso de J ava Standard Edition J 2SE 81
Hasta los momentos hemos visto como hace J ava para crear objetos, para implementar el principio
de Herencia, el concepto de clases abstractas e interfaces. Aprendimos sobre paquetes y sobre el
manejo de excepciones. Adems, entendimos el simple pero poderoso mecanismo para manejar las
entradas y salidas. En este tema, veremos como la informacin guardada en una base de datos
puede ser recuperada a travs de un programa en J ava, y aprender a escribir informacin en una
base de datos desde un programa hecho en J ava.


1 1. . M MA AN NE EJ J O O D DE E B BA AS SE ES S D DE E D DA AT TO OS S E EN N J J A AV VA A

Tradicionalmente en la programacin para Bases de Datos, las aplicaciones se enfrentan a docenas
de manejadores de bases de datos disponibles, y cada uno de ellos se comunica con tu aplicacin en
su propio lenguaje. Si la aplicacin necesita comunicarse con un nuevo motor de bases de datos,
entonces se tiene que aprender una nueva forma de comunicacin. Para los programadores J ava,
sin embargo, esto no representa un problema, ya que J ava brinda la capacidad de escribir una vez,
compilar una vez y correr donde sea, lo que implica que la programacin para bases de datos sea
bastante sencilla.

En la actualidad, se emplean, principalmente tres tipos de bases de datos: Bases de Datos
relacionales, Bases de Datos relacional-objeto, Bases de Datos orientadas a objetos. J ava
proporciona conectividad a todos los tipos de Bases de Datos, a travs de su Conectividad a
Bases de Datos J ava (J ava Data Base Connectivity - J DBC) API.

Ya que no se puede definir un denominador comn para el almacenamiento y acceso de datos entre
los tipos de bases de datos, la especificacin J DBC autoriza requerimientos no especficos en el
DBMS (Data Base Management System) subyacente. En lugar de colocar requerimientos de cmo
se debe implementar el DBMS para poderlo usar (ODBC), la especificacin J DBC de J ava, coloca
todos sus requerimientos en la implementacin especfica del mismo.

Al escribir programas en J ava que se comuniquen con una base de datos, se requiere:

o Una base de datos (relacional, orientada a objetos, etc.).
o Interfaz J ava (a travs de API J DBC).
o Simple conocimiento de sentencias SQL.


2 2. . P PA AS SO OS S I I N NV VO OL LU UC CR RA AD DO OS S E EN N E EL L A AC CC CE ES SO O A A B BA AS SE ES S D DE E D DA AT TO OS S

Cuando hablamos de acceso a una base de datos, las siguientes operaciones son las ms
importantes a travs de un programa J ava: el programa debe ser capaz de leer desde una base de
datos y el programa debe ser capaz de escribir informacin a una base de datos.

En J ava, hay una serie de pasos para acceder la informacin que se encuentra en una base de datos
y estos son:

- Se debe cargar en la memoria un controlador que habilitar la conexin entre el programa
J ava y el sistema de base de datos (DBMS).
- A travs de este controlador, se debe establecer una conexin a la base de datos.
- Una vez establecida la conexin y usndola, se pueden ejecutar las sentencias SQL.
- Finalmente, se debe cerrar la conexin.

Escribir programas en J ava que se conecten con una base de datos y trabajen, es tan simple como
implementar estos cuatro pasos.


Curso de J ava Standard Edition J 2SE 82
3 3. . E EL L A AP PI I J J D DB BC C

El API de J DBC proporciona una forma universal para acceder a datos desde el lenguaje de
programacin de J ava. Usando el API J DBC, usted puede acceder virtualmente cualquier fuente de
datos, desde las bases de datos relacional a las hojas de clculo y archivos planos. La tecnologa de
J DBC tambin proporciona una base comn sobre la cual pueden construirse herramientas e
interfaces.

Para trabajar con las empresas lderes en el campo de las bases de datos, Sun Microsystems,
desarroll una sencilla API para acceso a bases de datos J DBC. En el proceso de desarrollo, se
establecieron tres puntos principales:

- J DBC debe ser una API que soporte SQL.
- J DBC debe construirse sobre la experiencia de trabajar con otras API para bases de datos.
- El trabajo con J DBC debe ser sencillo.

J DBC es un API que soporta SQL, debido a que permite construir sentencias SQL embebidas
dentro de las llamadas a la API J DBC de J ava. J DBC permite comunicar sin problemas el mundo de
los manejadores de bases de datos con el de la programacin J ava, ya que se construy en base las
experiencias anteriores en el manejo de bases de datos, como por ejemplo el uso de la tecnologa
ODBC de Microsoft. Y finalmente, el trabajar con J DBC se hace sencillo, porque consiste
bsicamente en hacer uso de funciones predefinidas y que se comportan igual para cualquier
manejador de base de datos.


3 3. .1 1. . L LA A E ES ST TR RU UC CT TU UR RA A D DE E J J D DB BC C

J DBC logra establecer, para las interfaces J ava, implementaciones diferentes para cada manejador.
El grupo de clases, que implementan las interfaces J DBC para un motor de base de datos particular
es llamado un Driver J DBC. En la elaboracin de una aplicacin de bases de datos, no interesa
conocer como estn implementadas estas clases, ya que J DBC oculta la implementacin especfica
para cada base de datos, y solo se deben emplear los mtodos definidos en las diferentes interfaces
J DBC.


Grfico 1. La arquitectura J DBC

La arquitectura J DBC, establece que una aplicacin J ava trabaja con cualquier bases de
datos, empleando los mtodos definidos en las interfaces J DBC las cuales son
especficas para cada manejador.

Curso de J ava Standard Edition J 2SE 83

Grfico 2. Driver J DBC

La figura anterior, muestra como una aplicacin usa J DBC para comunicarse con una o ms bases
de datos sin conocer los detalles concernientes a la implementacin de Driver especfico para dicha
base de datos.


3 3. .2 2. . C CL LA AS SE ES S E E I I N NT TE ER RF FA AC CE ES S B B S SI I C CA AS S D DE E J J D DB BC C

El API J DBC se encuentra en dos paquetes:

- El paquete de java.sql, contiene las funcionalidades del lado cliente.
- El paquete javax.sql, agrega las capacidades del lado de servidor.

En esta API, existen clases e interfaces bsicas que se encuentran en cualquier programacin de
base de datos que involucre J DBC y estas son:

Driver
<<Interfaz>>
DriverManager
PreparedStatement
<<Interfaz>>
CallableStatement
<<Interfaz>>
0..n 0..n
Statement
<<Interfaz>>
Connection
<<Interfaz>>
0..n
0..n 1
DatabaseMetaData
<<Interfaz>>
ResultSet
<<Interfaz>>
0..n
1
ResultSetMetaData
<<Interfaz>>
0..n
Provides
Registers
0..n
Creates
1 1
Retirves
0..n
Provides
Provides

Grfico 3. J erarqua de clases J DBC
La relacin que existe entre las clases e interfaces del API J DBC, est en que:
- El DriverManager es usado por la aplicacin para obtener conexiones a la base de datos,
ya que ste carga el controlador requerido directamente.
- Internamente la interfaz Driver crea las conexiones.
Curso de J ava Standard Edition J 2SE 84
- La aplicacin usa el objeto Connection para obtener objetos Statement y ejecutar
sentencias SQL.
- El resultado de las sentencias, es decir de los objetos Statement se reciben en la aplicacin
mediante los objetos ResultSet.
- Los datos del objeto ResultSet son utilizados en la aplicacin.
- El objeto Connection agrega al objeto DatabaseMetaData.
- El DatabaseMetaData, tiene la informacin acerca de la base de datos para un
determinado objeto Connection.
- El objeto ResultSet agrega al objeto ResultSetMetaData.
- El ResultSetMetaData, tiene la informacin acerca de los datos que contiene un
ResultSet.
- El PreparedStatement hereda de Statement, y representa una extensin a la
funcionalidad que poseen los objetos Statement.
- El CallableStatement hereda de PreparedStatement, y esta permite hacer invocaciones a
Procedimientos almacenados en la base de datos.

Todas las clases con acceso a Base de Datos en la API J DBC, lanzan SQLException, la cual
necesita ser capturada y manejada.

4 4. . A AC CC CE ES SO O A A B BA AS SE ES S D DE E D DA AT TO OS S

Como hemos visto, en el trabajo con bases de datos en J ava existen cuatro pasos bsicos: cargar el
controlador, realizar la conexin, realizar las peticiones sobre la base de datos y por ltimo se debe
cerrar la conexin. Ahora, veremos como hacer cada una de estas tareas.

4 4. .1 1. . C CA AR RG GA AR R E EL L D DR RI I V VE ER R

Los fabricantes de sistemas de bases de datos proveen sus propios controladores para poder
conectarse con la base de datos. Para cargar el controlador, necesitamos usar el mtodo forName
especificado en la clase Class con el nombre del controlador como argumento. Los objetos de la
clase Class son construidos automticamente por la J VM cuando se cargan las clases. Para cargar un
controlador de base de datos, incluimos la siguiente sentencia antes de hacer cualquier acceso a la
base de datos.

Class.forName(nombre del controlador);

El nombre del controlador es especfico a cada base de datos. Veamos como cargar el controlador
para diversos manejadores de bases de datos:

- Microsoft Access y SQL Server: Class.forName(sun.jdbc.odbc.J dbcOdbcDriver);
- IBM DB2 Universal DataBase: Class.forName(com.ibm.db2.J dbc.net.DB2Driver);
- MySQL: Class.forName(com.mysql.jdbc.Driver);

Al invocar a Class.forName, automticamente se crea una instancia de la clase Driver y la registra
con DriverManager. No se est creando una instancia explcita del controlador, sino que una vez que
el controlador est cargado, este estar disponible para hacer la conexin a un DBMS. Cuando el
Driver indicado en el mtodo forName() es invlido se arroja la excepcin
ClassNotFoundExcepcion.


Curso de J ava Standard Edition J 2SE 85
4 4. .2 2. . R RE EA AL LI I Z ZA AR R L LA A C CO ON NE EX XI I N N

Las aplicaciones usan la clase DriverManager para establecer la conexin con el DBMS. La clase
DriverManager es responsable de buscar o rastrear las diferentes implementaciones J DBC que
pueden existir en un sistema. La aplicacin requiere que DriverManager le d una conexin de base
de datos.

La clase DriverManager provee un mtodo llamado getConnection(), el cual tiene tres argumentos:
- Un URL de base de datos.
- Identificacin del usuario.
- Clave de usuario.

DriverManager.getConnection(databaseURL, user, password);

Un URL de base de datos es un simple Localizador Uniforme de Recursos (Uniform Resources
Locator) estndar de Internet. El URL consiste de tres partes, separadas por dos puntos:

protocol:<subprotocol>:<subname>

La fuente de datos de J DBC es el protocol. El subprotocol es especfico a una implementacin
J DBC. Normalmente contiene el nombre del DBMS y la versin. El subname es especfico al DBMS y
le dice al controlador a dnde necesita conectarse la aplicacin, es decir representa un DSN
(Nombre de la Fuente de Datos - Data Source Name) de la base de datos. Por ejemplo:

jdbc:odbc:Sample
donde,

- jdbc, es el protocol
- odbc, es el subprotocol
- Sample, es el subname

Ahora veamos como conectarnos a los manejadores de bases de datos:

Microsoft Access
Class.forName(sun.jdbc.odbc.J dbcOdbcDriver);
Connection conn;
String databaseURL = jdbc:odbc:Sample;
conn = DriverManager.getConnection(databaseURL,,);

Microsoft SQL Server
Class.forName(sun.jdbc.odbc.J dbcOdbcDriver);
Connection conn;
String databaseURL = jdbc:odbc:Sample;
conn = DriverManager.getConnection(databaseURL,user1,xyz);

IBM DB2 Universal DataBase
Class.forName(com.ibm.db2.jdbc.net.DB2Driver);
Connection conn;
String databaseURL = jdbc:db2://Sample:8000;
String user = admin;
Curso de J ava Standard Edition J 2SE 86
String password = sql;
conn = DriverManager.getConnection(databaseURL,user,password);

MySQL Server
Class.forName(com.mysql.jdbc.Driver);
Connection conn;
String databaseURL = "jdbc:mysql://localhost:3306/test;
String user = root;
String password = sql;
conn = DriverManager.getConnection(databaseURL,user,password);

Un objeto Connection es una simple sesin de base de datos. Podemos tener cualquier nmero de
objetos Connection en un programa.

4 4. .3 3. . E EJ J E EC CU UT TA AR R P PE ET TI I C CI I O ON NE ES S

Habiendo establecido una conexin a base de datos, usando el mtodo getConnecticon() de la clase
DriverManager, se est en posicin de ejecutar peticiones sobre esa base de datos. Dichas
peticiones, se refieren a ejecutar sentencias SQL sobre la base de datos, bien sean sentencias:

- DDL (Data Define Language: CREATE, ALTER, DROP)
- DCL (Data Control Language: GRANT, REMOVE)
- DML (Data Manage Language: INSERT, UPDATE, DELETE)
- DQL (Data Query Language: SELECT)

Para ejecutar las sentencias SQL mencionadas anteriormente es necesario hacer uso de objetos
Statement, PreparedStatement y ResultSet.

- Objetos Statement: La interfaz Statement provee mtodos para hacer llamadas a las
sentencias SQL. En este caso, es indiferente a que DBMS est conectado los mtodos
funcionan igual para todos, ya que una simple interfaz es provista por el J DBC para acceder a
la informacin de cualquier base de datos.

La interfaz Statement provee los mtodos:
o excecuteUpdate(): para ejecutar sentencias DML. Este mtodo retorna el nmero de
filas afectadas por la sentencia ejecutada, bien sea INSERT, UPDATE o DELETE.
o executeQuery(): para ejecutar sentencias DQL. Este mtodo devuelve los resultados
(filas) para las sentencias SELECT.

Para ejecutar sentencias SQL, primero se declara un objeto Satatement y a travs del
objeto Connection creamos una sentencia usando el mtodo createStatement().
Class.forName(sun.jdbc.odbc.J dbcOdbcDriver);
Connection conn;
String databaseURL = jdbc:odbc:Sample;
conn = DriverManager.getConnection(databaseURL,user1,xyz);
Statement sentencia = null;
int filas = 0;
sentencia = conn.createStatement();
nro= sentencia.executeUpdate(INSERT INTO Tab VALUES(Enero,10));
Curso de J ava Standard Edition J 2SE 87
- Objetos PreparedStatement: La especificacin J DBC provee una clase adicional, derivada
de la clase Statement para facilitar al programador la realizacin de programas sotisficados
de base de datos.

Observemos el siguiente fragmento de cdigo:

//Cdigo para conectarse a la base de datos
Statement sentencia = null;
int nro = 0;
String mes = ENERO;
int dia = 10;
sentencia = conn.createStatement();
nro= sentencia.executeUpdate(INSERT INTO Tabla VALUES( + mes+ , + dia + ));

Podemos ver que, en la sentencia SQL se han empleado variables en lugar de constantes
como valores; de igual forma, tambin se pueden colocar expresiones dentro de una
sentencia que va a ser ejecutada por un objeto Statement.

nro= sentencia.executeUpdate(INSERT INTO Tabla VALUES( + mes+ , + dia + ));

El API J DBC de J ava, permite crear una sentencia SQL una sola vez y aplicarla cada que
queramos ejecutarla. La clase PreparedStatement, permite construir las sentencias SQL
requeridas una vez y ejecutarlas cualquier nmero de veces en la aplicacin. Un
PreparedStatement es una llamada a una base de datos precompilada que requiere que los
parmetros sean definidos.

Cuando se crea un PreparedStatement, la sentencia SQL es dada como argumento. La
sentencia SQL debe ser enviada al DBMS inmediatamente donde es compilada una vez. De
este modo, el objeto PreparedStatement contiene una sentencia SQL precompilada, lo que lo
diferencia de los objetos Statement, en los que la sentencia se compila cada vez que se
ejecuta. En los PrepareStatement, los valores de la sentencia SQL se dan cada vez que la
aplicamos y siempre podrn tener valores diferentes.

Para ejecutar sentencias SQL usando el objeto Statement cada vez, damos el nombre de la
columna y los valores. Cuando usamos el objeto PreparedStatement no podemos especificar
los valores cuando se crea el objeto, ya que en el momento de construccin de la sentencia
los valores no sern conocidos. Slo proveemos los poseedores de lugares usando el smbolo
? y despus se substituir cada smbolo con el valor deseado.

Veamos el siguiente fragmento de cdigo para entender como funcionan los
PreparedStatement.

//Cdigo para conectarse a la base de datos
PreparedStatement sentencia = null;
String SQL = INSERT INTO Tab (mesFecha, diaFecha) VALUES (?,?);
String mes = FEBRERO;
int dia = 20;
sentencia = conn.prepareStatement(SQL);
sentencia.setString(1 , mes);
Curso de J ava Standard Edition J 2SE 88
sentencia.setInt(2 , dia);
sentencia.execute();

Usamos el mtodo prepareStatement() en lugar de createStatement(). En el fragmento
anterior, la sentencia SQL INSERT es el argumento del mtodo prepareStatement(). Las
nicas diferencias notables aqu son los smbolos ?, que representan los parmetros de
entrada, en lugar de los valores reales. Los valores reales se dan cuando se ejecuta la
sentencia SQL. Los mtodos setXXX() de la clase PreparedStatement enlazan los
parmetros de entrada con los valores. De esta manera FEBREROser colocado en
mesFecha y 20 guardado en diaFecha. Es de hacer notar que en este caso se ejecuta el
mtodo execute(), en vez de excecuteUpdate(); pero si se tratase de una sentencia SELECT
se ejecutara igualmente el mtodo executeQuery().

La principal diferencia entre crear un objeto Satatement y objeto PrepareStatement est en la
forma como se aplican las sentencias SQL.

- Objetos ResultSet: El objeto Statement, como vimos anteriormente, tambin puede
retornar los resultados de una sentencia DQL (SELECT). El mtodo de Statement,
excecuteQuery() retorna los resultados de una sentencia SELECT. La sentencia puede
retornar una o ms filas, las cuales se capturan en un ResultSet.

Class.forName(sun.jdbc.odbc.J dbcOdbcDriver);
Connection conn;
String databaseURL = jdbc:odbc:Sample;
conn = DriverManager.getConnection(databaseURL,user1,xyz);
Statement sentencia = null;
ResultSet resultados = null;
sentencia = conn.createStatement();
resultados = sentencia.executeQuery(SELECT mes, dia FROM Tab);

Como el mtodo executeQuery(), puede devolver varias filas, puede ser necesario
desplazarnos dentro de ese conjunto de filas. Para ello, emplearemos el mtodo next()
provisto en la clase ResultSet. Este mtodo nos permite iterar a travs del ResultSet. Dicho
mtodo retorna true, si existe un registro activo o false en caso contrario. Ees de hacer
notar que para obtener la primera fila del ResultSet, es necesario emplear el mtodo next()
ya que el mismo no est posicionado en ningn registro cuando se obtienen los datos.

while(resultados.next())
System.out.println(\n Deslazndose en el cursor);
System.out.println(\n No hay ms datos en el cursor);

En el uso anterior del objeto ResultSet no se ha recuperado ninguna informacin de las filas
resultado, solo nos desplazamos por ellas. Para recuperar la informacin de las filas, se
utilizan los mtodos getXXX() de la clase ResultSet. Cada campo de informacin disponible
en una fila es de algn tipo de dato. Necesitaremos hacer una correspondencia entre los
tipos de datos del DBMS con los mtodos getXXX(). Hay un nmero de mtodos getXXX
disponibles en la clase ResultSet, algunos de los ms comunes son:

o getInt(), getShort(), getLong(), getFloat(), getByte()
o getString(), getDate(), getTime()
Curso de J ava Standard Edition J 2SE 89

Todos son mtodos sobrecargados que aceptan un entero o una cadena como argumento. El
argumento entero es el nmero de la columna en la sentencia y el argumento de cadena es
el nombre de la columna dada en la tabla. Cuando se especifica un nmero de columna como
argumento, se hace corresponder en el mismo orden como las columnas fueron especificadas
en la sentencia SELECT.

while(resultados.next()) {
System.out.println(resultados.getString(1));
System.out.println(resultados.getInt(dia));
System.out.println(resultados.getString(mes));
System.out.println(resultados.getInt(2));
}

- Soporte de Cursores: El API J DBC provee soporte limitado de cursores (ResultSet). Permite
que una aplicacin obtenga un cursor asociado con el resultado de un Query a travs del
mtodo executeQuery(); pero el movimiento del cursor ocurre, por omisin, slo con
direccin hacia delante. Por lo que, es necesario activar la navegabilidad del cursor.

Para que un ResultSet sea scrollable (navegable), hay que pasarle dos argumentos, bien
sea al createStatement() o al mtodo prepareStatement(). Los argumentos a pasar son:

o Tipo de resultado: El tipo de resultado, puede ser cualquiera de las variables de
clase definidas en ResultSet:

M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N
TYPE_FORWARD_ONLY El cursor se puede mover solo hacia delante.
TYPE_SCROLL_INSENSITIVE
El objeto ResultSet es navegable, pero no
sensitivo para hacer cambios por otros.
TYPE_SCROLL_SENSITIVE
El objeto ResultSet es navegable, pero
sensitivo a hacer cambios por otros.
Tabla 1. Tipos de resultado

o Concurrencia de resultado: La concurrencia de resultado, puede ser cualquiera
de las variables de clase definidas en ResultSet:

T TI I P PO O S SI I G GN NI I F FI I C CA AD DO O
CONCUR_READ_ONLY El objeto ResultSet no puede ser actualizado
CONCUR_UPDATABLE El ResultSet puede ser actualizado.
Tabla 2. Concurrencia de resultado


Una vez que el objeto ResultSet se hace scrollable, entonces el cursor se puede mover y
apunta a filas especficas, donde se puede actualizar, borrar, etc. Algunos de los mtodos
disponibles en ResultSet para el movimiento del cursor se listan a continuacin:

Curso de J ava Standard Edition J 2SE 90
M M T TO OD DO O R RE ET TO OR RN NO O D DE ES SC CR RI I P PC CI I N N
next() boolean Para moverse a la siguiente fila del resultado
previous() boolean Para moverse a la fila anterior
first() boolean Para moverse a la primera fila del ResultSet
last() boolean Para moverse a la ltima fila del ResultSet
getRow() int Retorna el nmero de la fila actual
Absolute(int row) boolean Ir a una fila especifica del ResultSet
insertRow() void
Inserta una fila en el Objeto ResultSet y en la
base de datos.
deleteRow(int row) void Elimina una fila del ResultSet.
Tabla 3. Mtodos para ResultSet scrollable

resultados.last(); System.out.println(\n ltima fila);
resultados.first(); System.out.println(\n Primera fila);
resultados.next(); System.out.println(\n Segunda fila);
resultados.previous(); System.out.println(\n Primera fila);
System.out.println(\n La fila actual en el cursor es: + resultados.getRow());

La informacin de las filas de un ResultSet, pueden ser actualizadas utilizando los mtodos
updateXXX() de la clase ResultSet., donde XXX corresponde a un tipo de dato presente el
DBMS. Algunos de los mtodos updateXXX ms comunes son:

o updateInt(columna, int dato), updateShort(columna, short dato)
o updateLong(columna, long dato), updateFloat(columna, float dato)
o updateByte(columna, byte dato), updateString(columna, String dato)
o updateDate(columna, Date dato), updateTime(columna, Time dato)

Todos son mtodos que trabajan sobre la fila actual. Estos mtodos estn sobrecargados y
aceptan un entero o una cadena como argumento para representar la columna. Si el
argumento es entero, indica el nmero de la columna en la sentencia, pero si el argumento
es cadena, representa el nombre de la columna dada en la tabla.

resultados.updateString(1,Marzo);
resultados.updateInt(dia,18);
resultados.updateString(mes,Abril);
resultados.updateInt(2,19);

4 4. .4 4. . C CE ER RR RA AR R L LA A C CO ON NE EX XI I N N

Como hemos visto la conexin a la base de datos se hace a travs de la clase DriverManager, la cual
le da a la aplicacin un objeto Connection que representa la conexin. De ese objeto Connection, se
pueden obtener muchos objetos Statement y ResultSet para manipular la informacin de la base de
datos.

Al terminar de trabajar con una base de datos, es buena prctica de programacin cerrar los objetos
Connection, Statement y ResultSet que se tengan asociados a la misma, para de esta manera liberar
Curso de J ava Standard Edition J 2SE 91
el recurso. Cuando se cierra un objeto Connection, los objetos Statement y ResultSet dependientes
de ste, tambin se cierran automticamente. Esto se realiza a travs del mtodo close.

res.close(); // Donde res es un objeto ResultSet
stmt.close(); // Donde stmt es un objeto Statement o PrepareStatement
Conn.close(); // Donde Conn es un objeto Connection


5 5. . C CL LA AS SE ES S D DE E S SO OP PO OR RT TE E J J D DB BC C

Existen otras clases e interfaces de soporte provistas por J DBC para ayudar a la funcionalidad del
API J DBC. Todas estas clases se definen en el paquete java.sql.

5 5. .1 1. . S SQ QL LE EX XC CE EP PT TI I O ON N
Extiende de la clase java.lang.Exception, esta clase provee ms informacin relacionada a errores
de la base de datos. Usamos esta clase ampliamente en todos los programas J ava que utilicen J DBC.
Esta clase incluye informacin acerca de:

- La cadena SQLState, que describe el error ocurrido.
- El cdigo de error especfico del proveedor de base de datos, que es normalmente un
nmero que puede ser encontrado en la documentacin de la base de datos.

Esta excepcin debe ser obligatoriamente capturada y manejada por todo programa que emplee las
funcionalidades de la API J DBC de J ava.

5 5. .2 2. . D DA AT TE E, , T TI I M ME E, , T TI I M ME ES ST TA AM MP P

Todas estas clases heredan de la clase java.util.Date. Ellas extienden para proveer niveles de
granularidad a la informacin ya existente en la clase Date. Son necesarias para proveer
compatibilidad con los campos tipo fecha de los manejadores de bases de datos.
5 5. .3 3. . T TY YP PE ES S

La clase java.sql.Types, define constantes para identificar tipos genricos SQL, llamados tipos
J DBC. Esta es una clase abstracta. LA misma no aade funcionalidades a los mtodos ya definidos
en la clase Object. Algunas variables de clase, que esta clase contiene son:

- ARRAY
- BIT
- BINARY
- CHAR
- CLOB
- DATE
- INTEGER
- NUMERIC
- REAL
- VARCHAR



Curso de J ava Standard Edition J 2SE 92
6 6. . E EJ J E EM MP PL LO O C CO OM MP PL LE ET TO O D DE E U UN N P PR RO OG GR RA AM MA A C CO ON N J J D DB BC C

El siguiente es un programa que ilustra como es el proceso de acceso a Bases de Datos utilizando la
API J DBC. Este programa se conecta con una base de datos en MySQL.

/**
* Programa Base de Datos
* @date: 26/09/2005
* @author: Ronel J . Rivas R.
*/

package database;

import java.io.*;
import java.sql.*;

public class J ExampleDB {
Connection conn;
Statement stmt;
PreparedStatement prep;
ResultSet res;

public J ExampleDB() {
super();
}
public void cerrarConexion() throws SQLException {
conn.close();
}
public void consultarTabla() throws SQLException {
// Crear la sentencia SQL
stmt = conn.createStatement();
String SQL = "SELECT * FROM Ejemplo";
res = stmt.executeQuery(SQL);
// Mostrar el resultado por pantalla
while (res.next()) {
System.out.print(res.getInt(1)+" - ");
System.out.println(res.getString("mes"));
}
// Liberar los recursos
res.close(); stmt.close();
}
public void crearConexion(String URL, String user, String passw) throws SQLException {
conn = DriverManager.getConnection(URL, user, passw);
}

Curso de J ava Standard Edition J 2SE 93
public int crearTabla() throws SQLException {
// Crear la sentencia SQL
stmt = conn.createStatement();
String SQL = "CREATE TABLE Ejemplo (DIA INTEGER CONSTRAINT clave PRIMARY KEY, MES TEXT)";
int nro = stmt.executeUpdate(SQL);
// Liberar el recurso
stmt.close();
return nro;
}
public int insertarStatement(int miDia, String miMes) throws SQLException {
// Crear la sentencia SQL
stmt = conn.createStatement();
String SQL = "INSERT INTO Ejemplo VALUES(" + String.valueOf(miDia) + ",'" + miMes + "')";
int nro = stmt.executeUpdate(SQL);
// Liberar el recurso
stmt.close();
return nro;
}
public int insertarPreparedStatement(int miDia, String miMes) throws SQLException {
// Preparar la sentencia SQL
String SQL = "INSERT INTO Ejemplo (dia,mes) VALUES(?,?)";
prep = conn.prepareStatement(SQL);
prep.setInt(1, miDia);
prep.setString(2, miMes);
// Ejecutar la sentencia
int nro = prep.executeUpdate();
// Liberar los recursos
prep.close();
return nro;
}
public static void main(java.lang.String[] args) {
J ExampleDB appDB = new J ExampleDB();
try {
// (1) Cargar el driver para Microsoft Access
Class.forName("com.mysql.jdbc.Driver");

// (2) Crear la conexin
String databaseURL = "jdbc:mysql://localhost:3306/test ";
String user = "root";
String password = "sql";
appDB.crearConexion(databaseURL, user, password);

// (3) Ejecutar peticiones
appDB.crearTabla();
Curso de J ava Standard Edition J 2SE 94
appDB.insertarStatement(1, "Enero");
appDB.insertarPreparedStatement(2, "Febrero");
appDB.consultarTabla();

// (4) Cerrar la conexin
appDB.cerrarConexion();

} catch (ClassNotFoundException e) {
System.out.println("ERROR: No se encuentra el Driver para el DBMS...");
} catch (SQLException e) {
System.out.println("ERROR: No se pudo ejecutar la sentencia...");
}
}
}

Curso de J ava Standard Edition J 2SE 95
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
TEMA VII: Interfaces Grfi cas


OBJ ETI VOS:
Describir las tecnologas para la creacin de interfaces grficas de usuario en J ava.
Escribir programas J ava que presenten GUI (Interfaces Grficas de Usuario), empleando la
tecnologa SWING.


CONTENIDO:
Fundamentos de las interfaces grficas
Construccin de interfaces grficas en J ava
Administradores de diseo
Manejo de eventos










95
Curso de J ava Standard Edition J 2SE 96
El objetivo de este tema es introducir los aspectos bsicos de diseo y construccin de una interfaz
grfica de usuario (GUI Graphical User Interface) y presentar cmo se proporciona el
funcionamiento de dicha interfaz. Con este propsito se presenta el modelo de objetos de los
componentes grficos y la programacin basada o dirigida por eventos.

1 1. . F FU UN ND DA AM ME EN NT TO OS S D DE E L LA AS S I I N NT TE ER RF FA AC CE ES S G GR R F FI I C CA AS S

Hasta el momento las aplicaciones creadas slo han presentado y ledo informacin textual para
realizar la interaccin con el usuario (aplicaciones de consola o en modo texto). El lenguaje de
programacin J ava proporciona distintos paquetes con bibliotecas de clases que implementan los
elementos grficos y posibilitan la creacin de interfaces grficas de una forma sencilla. Este
conjunto de paquetes se denomina J ava Foundation Classes (J FC). La J FC o Clases
Fundamentales de J ava, proporcionan una rica coleccin de clases de interfaz de usuario.

Las J FC son un grupo de APIs usadas para desarrollar la interfaz grfica de usuario y estas son:
o Abstract Windows Toolkit (AWT): es el principal conjunto de herramientas usado por
J ava para crear interfaces de usuario. Proporciona la base sobre la que descansa el resto de
la construccin del J FC. El propsito principal de AWT es soportar ventanas de Applet.
o API 2D: proporciona grficos de 2 dimensiones mejorados, texto y capacidades de
imgenes para programas J ava, a travs de extensiones a AWT. Este amplio paquete de
presentacin soporta arte de lneas, texto e imgenes, para desarrollar interfaces de usuario
ricas, programas de dibujo y editores de imgenes.
o Swing: es el conjunto de componentes ms ligeros construidos sobre AWT. Swing
proporciona reemplazos ligeros para los componentes pesados de AWT, en adicin de una
multitud de componentes adicionales de los que carece AWT. Swing tambin dispone de
una infraestructura notable para implementar interfaces grficas de usuario como los
componentes de aspecto (Look and Feel) de diferentes plataformas.
o Accesibilidad: el J FC contiene numerosas herramientas de accesibilidad, que trabajan
junto con el API de accesibilidad.

Es de hacer notar, que en el curso se estudiaran slo los componentes Swing y sus
componentes grficos ms frecuentes, as como breves ejemplos de su uso.

1 1. .1 1. . C CR RE EA AC CI I N N D DE E U UN NA A I I N NT TE ER RF FA AZ Z G GR R F FI I C CA A

Los pasos bsicos para la creacin de una interfaz grfica de usuario son los siguientes:
o El diseo y composicin de la apariencia de la interfaz grfica de la aplicacin.
Esto implica la eleccin de una ventana principal (contenedor) en la que se van a incluir el
resto de los elementos grficos de interaccin (componentes). El diseo se completa con la
eleccin del resto de los componentes grficos (botones, etiquetas, mens, etc.) que se
aaden a la ventana principal, su disposicin y la forma en que van a interactuar.
o Creacin de componentes. Significa escribir el cdigo que crea los componentes y la
apariencia de la interfaz.
o Manejo de eventos. Esto es escribir el cdigo que proporciona el comportamiento de
dicha interfaz como respuesta a las interacciones de los usuarios. Cada una de las acciones
del usuario sobre la interfaz (Ejemplo: hacer clic sobre un botn), se traduce en la creacin
de un evento en J ava. Por tanto hay que proporcionar los manejadores de eventos para
responder a las interacciones de los usuarios.
o Visualizacin. Una vez visualizada la interfaz, la aplicacin queda a espera de las
interacciones del usuario que provocarn la ejecucin de los manejadores de eventos.
Curso de J ava Standard Edition J 2SE 97

1 1. .2 2. . L LO OS S E EL LE EM ME EN NT TO OS S D DE E U UN NA A I I N NT TE ER RF FA AZ Z G GR R F FI I C CA A

Cmo se ha visto en los temas anteriores, en J ava prcticamente todas las cosas son objetos.
Esta circunstancia sigue siendo vlida en la creacin de interfaces grficas. Las ventanas son
objetos, todos los componentes grficos de interaccin contenidos en una ventana son objetos y
como resultado de las acciones del usuario se generan eventos que tambin son objetos. En
J ava una interfaz grfica se construye componiendo distintos objetos que
implementan elementos grficos de interaccin (botones, campos de texto, etiquetas,
etc.).

La creacin de un componente grfico supone la instanciacin o una especializacin de una de
las clases estndar proporcionadas por el lenguaje. Por omisin, los objetos de estas clases
tienen la particularidad de que saben como mostrarse a s mismos en la pantalla. Adems, los
componentes grficos como cualquier otro objeto, tienen unas caractersticas y un
comportamiento que viene dado por sus atributos y mtodos.

Finalmente, en J ava las interfaces grficas estn compuestas bsicamente por tres elementos:
o Componentes grficos: jerarqua de clases que implementan los componentes
grficos disponibles para una interfaz.
o Administradores de Diseo: la jerarqua de clases que gestionan la apariencia
del diseo la interfaz grfica.
o Listeners o Manejadores de Eventos: jerarqua de clases de eventos que
representan las interacciones de los usuarios con los componentes grficos y la
forma como son manejados.


2 2. . C CO OM MP PO ON NE EN NT TE ES S G GR R F FI I C CO OS S - - S SW WI I N NG G

Swing es un conjunto de bibliotecas de clases que implementan los elementos o componentes
grficos para la creacin de interfaces grficas de usuario. Swing posee la caracterstica
fundamental, de que casi todos sus componentes estn codificados completamente en J ava, de
modo que su comportamiento es el mismo para todas las plataformas.

Swing, en comparacin con las otras tecnologas para la creacin de interfaces grficas, presenta
diversas ventajas y funcionalidades, entre las que cabe destacar las siguientes:

o Los componentes Swing son J avaBeans. Los componentes son unidades autocontenidas
y reusables. Los componentes pueden ser manipulados visualmente usando herramientas de
construccin para aplicaciones visuales. La tecnologa de componentes se incorporan a la
plataforma J ava a travs del concepto de J avaBean. Las caractersticas que distinguen a un
J avaBean de una simple clase J ava son: Introspeccin (todas sus variables son privadas),
persistencia (permiten guardar y restaurar su estado - Serializacin), personalizacin (se
configuran visualmente) y manejo de eventos (utilizan los eventos para comunicarse con otros
objetos). Esto permite que los componentes Swing sean fcilmente integrados en
herramientas de diseo de componentes.

o Nuevos componentes y nuevas funcionalidades. Swing incorpora clases para crear
cuadros de dilogo estndar, aadir bordes sofisticados a los componentes, visualizar tablas y
rboles, manipular texto con formato, etc., as como tambin permite cualquier tipo de
anidamiento o inclusin de un componente dentro de otro, caractersticas que no estaban
disponibles en AWT.
Curso de J ava Standard Edition J 2SE 98
o Aspecto y comportamiento configurable. Las aplicaciones pueden tener el aspecto y el
comportamiento que el programador desee y no el que fija la plataforma en la que se
ejecutan. Por ejemplo, en Windows adems de botones con el mismo aspecto que las del
sistema operativo se pueden crear botones con aspecto metlico o con apariencia Mac. Esto
se denomina en ingls puggable Look and Feel, y significa que Swing contiene
implementaciones estndares de aspecto para los sistemas operativos ms populares, lo que
permite a un programa ser ejecutado sin modificacin en cualquier tipo de computadora y
siempre verse y sentirse como un programa escrito especficamente para el sistema operativo
en el que se est ejecutando. A la vez, tambin se puede implementar un programa para
siempre verse igual, sin importar sobre qu sistema operativo se ejecute.

o Arquitectura Modelo-Vista-Controlador (MVC). Esta es quizs la caracterstica ms
importante de Swing. En MVC un elemento tiene tres partes: un modelo que gestiona los
datos, una vista que gestiona cmo se muestran esos datos y un controlador que determina
qu modificaciones hay que hacer cuando se interacciona con el elemento. En Swing se utiliza
una adaptacin de esta arquitectura, de modo que la vista y el controlador se agrupan en el
componente, pero el modelo se mantiene separado.



Grfico 1. Modelo MVC de Swing

Por ejemplo, como los modelos gestionan y almacenan los datos existe la posibilidad de
compartir un mismo modelo entre varios componentes. Cada uno de los componentes puede
modificar el modelo y dicha modificacin se reflejar de forma automtica en el resto de los
componentes que comparten dicho modelo.



Grfico 2. Modelo MVC de Swing entre componentes

o Accesibilidad. Todos los componentes Swing son compatibles con los dispositivos de ayuda
para personas discapacitadas y permiten utilizar interfaces alternativas, tales como braille y
sintetizadores de voz.

El hecho de que el conjunto de herramientas de componentes Swing est construido en la
arquitectura MVC y con aspectos y comportamientos configurables, lo hacen ms complejo que las
herramientas de interfaz de usuario tradicionales, como la utilizada en visual Basic o Delphi. Sin
embargo, cuando la arquitectura de Swing es entendida, los beneficios son mayores que el esfuerzo
extra requerido para aprender y usar sus capacidades.


ACTUALIZACIN
Evento
VI STA

CONTROLADOR
(Listener)
C
O
M
P
O
N
E
N
T
E

CAMBIO
CAMBIO
ACTUALIZACIN

MODELO
(Clases Entidad)
ACTUALIZACIN
CAMBIO
CAMBIO
ACTUALIZACIN
CAMBIO
CAMBIO
ACTUALIZACIN
ACTUALIZACIN
Evento
VI STA
Atributo: Nombre
CONTROLADOR
(ActionPerform)
J
C
o
m
b
o


MODELO
(Clases Persona)
Evento
VI STA
Atributo: Nombre
CONTROLADOR
(ActionEvent)
J
L
i
s
t

Curso de J ava Standard Edition J 2SE 99
2 2. .1 1. . J J E ER RA AR RQ QU U A A Y Y T TI I P PO OS S D DE E C CO OM MP PO ON NE EN NT TE ES S G GR R F FI I C CO OS S

Como Swing presenta una gran cantidad de clases grficas no es posible ni presentarlas todas ni
describirlas de forma completa. Se trabajar con las clases ms utilizadas, estructuradas por
grupos, y sus mtodos ms importantes. Las clases grficas se presentan estructuradas en los
siguientes grandes grupos: clases bsicas, contendores (contenedores de alto nivel e
intermedios) y componentes atmicos.

o C CL LA AS SE ES S B B S SI I C CA AS S: : proporcionan el soporte y las funcionalidades bsicas para el resto de los
componentes. La raz de todos los elementos grficos en J ava es la clase abstracta
java.awt.Component y su subclase java.awt.Container. La clase
javax.swing.J Component, es la clase base para prcticamente todos los componentes
Swing. A continuacin se describen las clase bsicas:

o java.awt.Component: esta clase abstracta define la funcionalidad bsica de todos
los componentes grficos en J ava. Como la presentacin grfica es responsabilidad
de cada uno de los componentes, en esta clase se definen distintos mtodos
relacionados con los efectos visuales y con su respuesta a acciones.
J ava.awt.Component, proporciona un gran nmero de mtodos de utilidad, los
cuales se describen brevemente los ms utilizados:

MTODO FUNCIONALI DAD
void paint(gGraphics)
void repaint()
void update(Graphics)
Dibujo y actualizacin del componente en la pantalla.
boolean isVisible()
void setVisible(true)
Comprueba o establece si el componente es visible
boolean isEnabled()
void setEnabled()
Permite conocer si un componente est activado y
activarlo o desactivarlo
Point getLocation()
Point getLocationOnScreen()
void setLocation(Point)
void setLocation(int, int)
Devuelve o establece la posicin del componente
respecto al componente padre o respecto a la pantalla
Dimension getSize()
void setSize(int, int)
void setSize(Dimension)
int getWidth()
int getHeight()
Obtiene o establece el tamao de un componente, en
pxeles o como un objeto Dimension
float getAligmentX()
float getAligmentY()
Obtiene la alineacin del componente. Las constantes
correspondientes son:
CENTER_ALIGMENT, LEFT_ALIGMENT, RIGHT_ALIGMENT,
TOP_ALIGMENT Y BOTTOM_ALIGMENT
Color getForeground()
Color getBackground()
void setForeground(Color)
void setBackground(Color)
Obtiene o establece el color de fondo o de primer
plano del componente
Container getParent() Obtiene el contenedor padre del componente
String getName()
void setName(String)
Obtiene o establece el nombre del componente segn
la cadena proporcionada

Curso de J ava Standard Edition J 2SE 100
o java.awt.Container: esta clase abstracta implementa un contenedor genrico y
proporciona sus funcionalidades bsicas. Un contenedor es un objeto que permite
agrupar uno o ms componentes de forma que se puedan tratar como una unidad.
Proporciona mtodos para aadir y eliminar componentes o para definir el tipo de
presentacin que se realiza de los componentes en la pantalla (Layout Managers).
Los contenedores mantienen una lista de los objetos que contienen y por omisin
los objetos aparecen en el orden en que se han aadido, la cual ser utilizada por
los Layout Managers. Container proporciona los siguientes mtodos:

MTODO FUNCIONALI DAD
void add(Component)
void add(Component, int)
Aade un componente en el contenedor, por omisin
al final de la lista salvo que se indique un ndice.
Component getComponentAt(int,int)
Component getComponentAt(Point)
Obtiene el componente que contiene un determinado
punto (x,y)
Component [] getComponents() Obtiene todos los componentes del contenedor
void remove(Component)
void remove(int)
void removeAll()
Elimina un componente, dado su identificador o por
su posicin en la lista de componentes (o para el
primer componente), o todos los componentes.
void setLayout(LayoutManager)
LayoutManager getLayout()
Establece u obtiene el administrador de diseo que
utiliza el contenedor.


o javax.swing.J Component: es la clase base de casi todos los componentes de
interaccin que incorpora Swing, excepto los contenedores de alto nivel. Es una
especializacin de Conteiner, de modo que prcticamente todos los componentes
Swing se pueden anidar unos dentro de otros. Proporciona muchas de las
funcionalidades bsicas de los contenedores intermedios y los componentes
atmicos de Swing, tales como la gestin de bordes sofisticados, la inclusin de
ayudas contextuales, soporte para la presentacin en pantalla, o la mejora de la
visualizacin grfica (mediante un bfer doble). Component proporciona los
siguientes mtodos:

MTODO FUNCIONALI DAD
void setBorder(Border)
Border getBorder()
Establece u obtiene el borde que muestra un
componente alrededor de sus lmites.
void setOpaque(boolean)
Establece si un componente es opaco o no
(transparente).
void setToolTipText(String)
Establece el texto a mostrar como pista o ayuda
contextual del componente que se muestra en una
ventana emergente cuando el ratn se detiene sobre
un objeto particular de la pantalla.
void paintComponent(Graphics)
void repaint(Rectangle)
Dibuja el componente. Es necesario rescribirlo para
implementar un dibujo personalizado. Solicita que se
redibuje un rea especifica del componente
void setPreferredSize(Dimension)
void setMinimunSize(Dimension)
void setMaximunSize(Dimension)
Establece las recomendaciones de tamao preferido,
mnimo y mximo para un componente. Estos datos
slo son recomendaciones y pueden ser ignorados por
el Layout Manager.
void setAligmentX(float)
void setAligmentX(float)
Establece la alineacin del componente

Curso de J ava Standard Edition J 2SE 101
o C CO ON NT TE EN NE ED DO OR RE ES S: : un contenedor es tipo especial de componente que est formado por uno
o ms componentes (o por otros contenedores). La particularidad principal que aportan es
que todos los componentes agrupados dentro de un contenedor se pueden tratar como
una nica entidad. Los contendores en J ava estn representados por la clase
java.awt.Container. Existen dos tipos de contenedores: de alto nivel e intermedios.

C CO ON NT TE EN NE ED DO OR RE ES S D DE E A AL LT TO O N NI I V VE EL L: : los contenedores de alto nivel proporcionan la estructura
y funcionalidad bsica de una ventana, as como el espacio para que se muestren el
resto de los componentes que estn contenidos dentro de ella y que conforman la
interfaz de usuario. En Swing los contenedores de alto nivel son especializaciones de la
clase java.awt.Window.

Grfico 3. J erarqua de clases de los contenedores de alto nivel

A continuacin se describen los contenedores de alto nivel:

o java.awt.Window: esta encapsula un objeto genrico ventana, sin borde ni barra
de mens, que proporciona las funcionalidades bsicas a todas las ventanas. Son las
especializaciones de esta clase las que permiten crear las ventanas principales de la
aplicacin y dan soporte a los cuadros de dilogo con el usuario.

MTODO FUNCIONALI DAD
void pack()
Ajusta el tamao de la ventana segn el tamao
preferido y disposicin de sus componentes.
void toFront()
void toBack()
Coloca la ventana delante o detrs de otras ventanas.
void dispose()
Destruye la ventana as como sus componentes y
libera los recursos asignados a ella.
boolean isShowing()
void show()
Obtiene si la ventana es visible.
Hace que la ventana sea visible.


o javax.swing.J Frame: se emplea para crear la ventana principal de la aplicacin.
Es una subclase de java.awt.Frame, que a su vez es una especializacin de
java.awt.Window. Es una ventana con marco que incluye los controles habituales de
control (cerrar, minimizar y maximizar). Tiene un panel raz superior (J RootPane)
que gestiona el interior de la ventana. En este panel raz estn incluidos, el panel
de contenido (siempre presente) y, si existe, la barra de mens (J MenuBar). Los
componentes grficos no se aaden al J Frame directamente sino a su panel de
contenido.
java.awt.Container
java.awt.Window
java.awt.Frame java.awt.Dialog javax.swing.J Window
javax.swing.J Frame javax.swing.J Dialog
Curso de J ava Standard Edition J 2SE 102
A continuacin se describen sus principales mtodos:

MTODO FUNCIONALI DAD
J Frame()
J Frame(String)
Constructores que crean una ventana, inicialmente oculta y a
la que se le puede asignar un ttulo.
String getTitle()
void setTitle(String)
Obtiene o establece el titulo de la ventana.
void setResizable(boolean)
booleann isResizable()
Establece o determina si la ventana puede cambiar de tamao.
J RootPane createRootPane()
J RootPane getRootPane()
void setRootPane(J RootPane)
Crea, obtiene o establece el panel raz de la ventana. Este
panel gestiona el panel de contenido y la barra de mens.
Container getContentPane()
void setContentPane(Container)
Obtiene o establece el panel de contenido de la ventana.
Contiene a todos los componentes grficos de la ventana.
J MenuBar getMenuBar()
void setMenuBar(J MenuBar)
Obtiene o establece la barra de mens de la ventana.
int getDefaultCloseOperation()
void setDefaultCloseOperation(int)
Obtiene o establece el comportamiento de la ventana cuando
el usuario trata de cerrarla. El parmetro debe ser una de las
constantes:J Frame.DO_NOTHING_ON_CLOSE,
J Frame.HIDE_ON_CLOSE J Frame.DISPOSE_ON_CLOSE.

A continuacin se incluye el cdigo de creacin de una ventana principal de una
aplicacin, con una etiqueta:

package interfacesGraficas;

import javax.swing.*;

public class EjemploJ Frame extends J Frame {
public EjemploJ Frame(){
// AGREGAR LOS COMPONENETES A LA VENTANA
J Label etiqueta = new J Label(Ventana J Frame); // Crea el componente
getContentPane().add(etiqueta); // Agrega el componente

// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA
setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);
setTitle(Ejemplo de J Frame);
setSize(300,200);
}
public static void main(String[] args) {
EjemploJ Frame ventana;
ventana = new EjemploJ Frame(); / / Crea el objeto ventana
ventana.setVisible(true); // Muestra la ventana
}
}

Grfico 4. Ejemplo de ventana J Frame
Curso de J ava Standard Edition J 2SE 103
o javax.swing.J Dialog: es la base raz de las ventanas secundarias que
implementan cuadros de dilogo Swing. Se denominan ventanas secundarias porque
dependen de una ventana principal y si la ventana principal se cierra, se minimiza o
se maximiza, las ventanas secundarias realizan la misma operacin de forma
automtica. Al igual que J Frame, incorpora un panel raz, con sus componentes
panel de contenido y mens. Estas ventanas pueden ser modales o no. J Dialog
provee los mismos mtodos de J Frame y agrega los siguientes:

MTODO FUNCIONALI DAD
J Dialog(J Frame)
J Dialog(J Frame, boolean)
J Dialog(J Frame, String)
J Dialog(J Frame, boolean, String)
Constructores en los que se indica la ventana
principal (J Frame), si es modal o no y el titulo.
Existen los mismos constructores en donde la
ventana principal es un J Dialog.
void setLocationRelatiiveTo(Component)
Establece la posicin de la ventana en relacin al
componente indicado.

A continuacin se incluye el cdigo de creacin de una ventana emergente a una
ventana de una aplicacin, con una etiqueta:

package interfacesGraficas;

import javax.swing.*;

public class EjemploJ Dialog extends J Frame {
public EjemploJ Dialog(){
// Agregar los componentes a la ventana
J Label etiqueta = new J Label(Ventana J Frame); // Crea el componente
getContentPane().add(etiqueta); // Agrega el componente
// Establecer propiedades generales de la ventana
setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);
setTitle(Ejemplo de J Dialog);
setSize(300,200);
/ / CREAR LA VENTANA EMERGENTE
J Dialog ventanaEmergente;
ventanaEmergente = new J Dialog(this); // Crea la ventana emergente
ventanaEmergente.setDefaultCloseOperation(J Dialog.DISPOSE_ON_CLOSE);
ventanaEmergente.setTitle(Ventana Emergente);
ventanaEmergente.setSize(150,150);
ventanaEmergente.setVisible(true); // Muestra la ventana
}
public static void main(String[] args) {
EjemploJ Dialog ventana = new EjemploJ Dialog(); // Crea el objeto ventana
ventana.setVisible(true); // Muestra la ventana
}
}

Grfico 5. Ejemplo de ventana J Dialog
Curso de J ava Standard Edition J 2SE 104
C CU UA AD DR RO OS S D DE E D DI I L LO OG GO O E ES ST T N ND DA AR R: : Swing incorpora distintos componentes que
implementan diferentes tipos de cuadros de dilogo estndar, pero que no son
especializaciones de J Dialog.

Grfico 6. J erarqua de clases de los cuadros de dilogo estndar

A continuacin se describen las principales clases de cuadro de dilogo estndar:

o javax.swing.J OptionPane: esta clase se utiliza para crear los cuadros de dilogo
ms habituales, en los que se pide un valor al usuario o en los que se muestra un
mensaje de error o advertencia. Todos los cuadros de dilogo que implementa
J OptionPane son modales (bloquean la interaccin del usuario con otras ventanas).
La forma ms sencilla de uso de la clase es mediante la invocacin de alguno de sus
mtodos estticos para crear cuadros de dilogo. A continuacin se muestran dichos
mtodos:

MTODO FUNCIONALI DAD
static int showMessageDialog(Component, Object)
static int showMessageDialog(Component, Object,
String, int)
static int showMessageDialog(Component, Object,
String, int, Icon)
Muestra un cuadro de dilogo modal que
presenta informacin al usuario y tiene un
botn Aceptar. Los argumentos especifican
el componente padre, el mensaje, el ttulo, el
tipo de mensaje y el icono del cuadro de
dilogo.
static int showConfirmDialog(Component, Object)
static int showConfirmDialog (Component, Object,
String, int)
static int showConfirmDialog (Component, Object,
String, int, int)
static int showConfirmDialog (Component, Object,
String, int, int, Icon)
Muestra un cuadro de dilogo modal que
realiza una pregunta al usuario. Los
argumentos especifican el componente padre,
el mensaje, el ttulo, el tipo de opcin, el tipo
de mensaje y el icono del cuadro de dilogo.
static int showInputDialog(Object)
static int showInputDialog(Component, Object)
static int showInputDialog (Component, Object,
String, int)
static int showInputDialog (Component, Object,
String, int, Icon)
Muestra un cuadro de dilogo modal en el
que solicita una entrada al usuario. Los
argumentos especifican el componente padre,
el mensaje, el ttulo, el tipo de mensaje y el
icono del cuadro de dilogo.
static int showOptionDialog (Component, Object,
String, int, int, Icon, Object[],Object)
Muestra un cuadro de dilogo modal
personalizado. Los argumentos especifican el
componente padre, el mensaje, el ttulo, el
tipo de opcin, el tipo de mensaje, el icono,
las opciones y la opcin predeterminada del
cuadro de dilogo.

Mediante el parmetro tipo de mensaje se pueden proporciona el comportamiento
del cuadro del dilogo: Los tipos de mensaje predeterminados son:

- J OptionPane.ERROR_MESSAGE - J OptionPane.PLAIN_MESSAGE
- J OptionPane.INFORMATION_MESSAGE - J OptionPane.WARNING_MESSAGE
- J OptionPane.QUESTION_MESSAGE
J Component
J OptionPane J FileChooser
Curso de J ava Standard Edition J 2SE 105
Mediante el parmetro tipo de opciones se pueden proporcionar los botones que se
deben incluir. Las opciones predeterminadas son:

- J OptionPane.DEFAULT_OPTION - J OptionPane.OK_CANCEL_OPTION
- J OptionPane.YES_NO_OPTION - J OptionPane.YES_NO_CANCEL_OPTION

Todos los mtodos de la clase J OptionPane, devuelven cual es el botn pulsado, en
los valores representados por las constantes:

- J OptionPane.YES_OPTION - J OptionPane.OK_OPTION
- J OptionPane.NO_OPTION - J OptionPane.CLOSED_OPTION
- J OptionPane.CANCEL_OPTION

Ejemplo: Creacin de cuadros de dilogo estndar con J OptionPane:

package interfacesGraficas;
import javax.swing.*;

public class EjemploJ OptionPane extends J Frame {
public EjemploJ OptionPane (){
// Agregar los componentes a la ventana
J Label etiqueta = new J Label(Ventana J Frame); // Crea el componente
getContentPane().add(etiqueta); // Agrega el componente
// Establecer propiedades generales de la ventana
setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);
setTitle(Ejemplo de J OptionPane);
setSize(300,200);

//CREAR LOS CUADROS DE DIALOGO
/ / Mensaje de Error
J OptionPane.showMessageDialog(this, // Ventana principal
Error: Debe introducir todos los campos, // Mensaje
Error de entrada de datos, // Titulo
J OptionPane.ERROR_MESSAGE); // Tipo mensaje


Grfico 7. Cuadro de dialogo Mensaje
/ / Mensaje de confirmacin
int opc = J OptionPane.showConfirmDialog(this,
Desea Agregar el Registro?, // Mensaje
Mensaje de confirmacin, // Titulo
J OptionPane.YES_NO_OPTION); // Tipo Opciones


Grfico 8. Cuadro de dialogo de Confirmacin
/ / Cuadro de opcin personalizado
Object[] textoOpciones = {S adelante,Ahora no, No s que hacer};
int op = J OptionPane.showOptionDialog(this,
Desea realizar la operacin ahora?, // Mensaje
Mensaje de Confirmacin, // Titulo
J OptionPane.YES_NO_CANCEL_OPTION, // Tipo opciones
J OptionPane.QUESTION_MESSAGE, // Tipo de Mensaje
null, // Icono
textoOpciones, // Opciones
textoOpciones[0]); // Opcin principal
}


Grfico 9. Cuadro de dialogo Personalizado
public static void main(String[] args) {
EjemploJ OptionPane ventana = new EjemploJ OptionPane ();
ventana.setVisible(true);
}
}

Curso de J ava Standard Edition J 2SE 106
o javax.swing.J FileChooser: un selector de archivos permite la seleccin interactiva
por parte del usuario de un archivo o directorio, bien a partir de una lista que se le
proporciona o bien introduciendo directamente su nombre. Un selector de archivos
muestra todos los archivos y directorios no ocultos de una posicin determinada del
sistema de archivos. Si slo se est interesado en algn tipo de archivos se puede
modificar la presentacin aplicando filtros.

MTODO FUNCIONALI DAD
J FileChooser()
J FileChooser(String)
Constructores. Mediante los argumentos se
establece el directorio actual
int showOpenDialog(Component)
int showSaveDialog(Component)
Muestra el selector de archivos abrir o guardar.
Devuelven como resultado si el usuario ha
aceptado o no la operacin (APPROVE_OPTION
CANCEL_OPTION).
void setSelectedFile(File)
File getSelectedFile()
Establece u obtiene el archivo o directorio
seleccionado
void setFileSelectionMode(int)
int getFileSelectionMode()
Estable u obtiene el mo de seleccin. Por omisin
slo se pueden seleccionar archivos (FILES_ONLY),
pero se puede cambiar a solo directorio
(DIRECTORIES_ONLY) o ambos (FILES_AND_DIRECTORIES)
boolean getControlButtonsAreShown()
void setControlButtonAreShown(boolean)
Obtiene o establece si se muestran o no los
botones de control predeterminados del selector

Ejemplo: en el siguiente cdigo se crea un selector de archivos y se muestra en la
salida estndar el nombre del archivo seleccionado o si se cancel la operacin:

package interfacesGraficas;
import javax.swing.*;
import java.io.*;

public class EjemploJ FileChooser extends J Frame {
public EjemploJ FileChooser (){
// Agregar los componentes a la ventana
J Label etiqueta = new J Label(Ventana J Frame); // Crea el componente
getContentPane().add(etiqueta); // Agrega el componente
// Establecer propiedades generales de la ventana
setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);
setTitle(Ejemplo de J OptionPane);
setSize(300,200);

/ / SE CREA EL SELECTOR DE ARCHI VOS
J FileChooser selector = new J FileChooser();
selector.setFileSelectionMode(J FileChooser.DI RECTORI ES_ONLY);
int opc = selector.showOpenDialog(this);
if(opc == J FileChooser.APROVE_OPTI ON) {
File archivo = selector.getSelectedFile();
System.out.println(Archivo seleccionado: + archivo);
} else
System.out.println(Operacin cancelada por el usuario);
}

Grfico 10. Selector de archivos
public static void main(String[] args) {
EjemploJ FileChooser ventana = new EjemploJ FileChooser ();
ventana.setVisible(true);
}
}

Curso de J ava Standard Edition J 2SE 107
C CO ON NT TE EN NE ED DO OR RE ES S I I N NT TE ER RM ME ED DI I O OS S: : los contenedores intermedios no generan una ventana
independiente y su propsito es agrupar otros componentes para mejorar la gestin de
la interfaz (por ejemplo, presentacin o gestin de eventos). Ofrecen diferentes
funcionalidades, desde la simple agrupacin de componentes (J Panel) hasta la gestin
de componentes en mltiples capas (como J TabbedPane).


Grfico 11. J erarqua de clases de los contenedores intermedios

A continuacin se describen los principales contenedores intermedios:

o javax.swing.J Panel: es un contenedor simple de propsito general, hereda de
J Component, no posee ninguna caracterstica grfica sofisticada. J Panel sirve para
agrupar a otros componentes. Habitualmente se utiliza para dividir una zona de
pantalla en secciones. Inicialmente estos paneles no son visualizables, salvo por el
color de su fondo, pero es sencillo aadirles bordes. De forma predeterminada
J Panel emplea FlowLayout, como administrador de diseo.

MTODO FUNCIONALI DAD
J Panel()
J Panel(LayoutManager)
Constructores. Permite crear un panel para agrupar
componentes, adems permite establecer el
administrador de diseo para el contenedor.
void add(J Component)

o javax.swing.J ScrollPane: proporciona un panel con la capacidad de incluir barra
de desplazamiento para mostrar su contenido. Por tanto, es muy adecuado para
presentar una informacin que esta contenida en otro componente y que no cabe
completamente en la zona de visualizacin que tiene asignada en la pantalla.

MTODO FUNCIONALI DAD
J ScrollPane()
J ScrollPane(Component)
J ScrollPane(Component, int, int)
Constructores. Se puede indicar el componente que
proporciona el contenido y la poltica de
presentacin de las barras de desplazamiento.
void setViewportView(Component)
Establece el componente que proporciona el
contenido.
void setVerticalScrollBarPolicy(int)
int getVerticalScrollBarPolicy()
Establece u obtiene la poltica de presentacin de la
barra de desplazamiento vertical. Las posibilidades
son: que se muestre cuando sea necesario
(VERTICAL_SCROLLBAR_AS_NEEDED), que se muestren
siempre (VERTICAL_SCROLLBAR_ALWAYS) y que no se
muestren nunca (VERTICAL_SCROLLBAR_NEVER).
void setHorizontalScrollBarPolicy(int)
int getHorizontalScrollBarPolicy()
Establece u obtiene la poltica de presentacin de la
barra de desplazamiento horizontal. Las
posibilidades son: que se muestre cuando sea
necesario (HORIZONTAL_SCROLLBAR_AS_NEEDED), que se
muestren siempre (HORIZONTAL_SCROLLBAR_ALWAYS) y
que no se muestren nunca
(HORIZONTAL_SCROLLBAR_NEVER).

J Component
J Panel J ScrollPane J SplitPane J TabbedPane J ToolBar
Curso de J ava Standard Edition J 2SE 108
Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J ScrollPane.

package interfacesGraficas;

import java.awt.*;
import javax.swing.*;

public class EjemploScrollPane extends J Frame {
public EjemploScrollPane() {
// CREAR LOS COMPONENTES DE LA VENTANA
J Panel panel = new J Panel();
J Label etq = new J Label("Etiqueta");
panel.add(etq);

J ScrollPane scroll = new J ScrollPane( );
scroll.setVerticalScrollBarPolicy(J ScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scroll.setHorizontalScrollBarPolicy(J ScrollPane.HORI ZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setViewportView(panel);

// AGREGAR COMPONENTES A LA VENTANA
getContentPane().add(scroll);

// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA
setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);
setTitle("Ejemplo de ScrollPane");
setSize(150, 100);
}

public static void main(String[] args) {
EjemploScrollPane ventana;
ventana = new EjemploScrollPane();
ventana.setVisible(true);
}
}


Grfico 12. Contenedor ScrollPane


o javax.swing.J SplitPane: es un contenedor que gestiona dos componentes
(normalmente dos paneles) colocados vertical u horizontalmente y diferenciados por
un separador que puede ser reposicionado por el usuario. El usuario puede decidir
cual es el tamao asignado a cada uno de los componentes pulsando con el ratn
sobre el separador y arrastrndolo.

MTODO FUNCIONALI DAD
J SplitPane()
J SplitPane(int)
J SplitPane(int, Component, Component)
Constructores. Se le puede proporcionar la
orientacin y los componentes de sus dos partes.
void setOrientation(int)
int getOrientation()
Establece u obtiene la orientacin de la divisin. Por
omisin aparece uno al lado del otro
(HORIZONTAL_SPLIT) y se puede cambiar para que
aparezca uno encima de otro (VERTICAL_SPLIT)
Curso de J ava Standard Edition J 2SE 109
void setDividerSize(int)
int getDividerSize()
Establece u obtiene el tamao del separador en
pxels.
void setTopComponent(Component)
void setBottomComponent(Component)
void setLeftComponent(Component)
void setRigthComponent(Component)
Component getTopComponent()
Component getBottomComponent()
Component getLeftComponent()
Component getRigthComponent()
Establece u obtiene el componente que aparece en
cada una de las zonas. Izquierda es equivalente a
arriba y derecha es equivalente abajo para poder
cambiar posteriormente la posicin del separador.
void setDividerLocation(double)
void setDividerLocation(int)
int getDividerLocation()
Establece u obtiene la posicin del separador. Dicha
posicin puede indicarse en porcentaje o en pxels.

Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J SplitPane.

package interfacesGraficas;

import java.awt.*;
import javax.swing.*;

public class EjemploSplitPane extends J Frame {
public EjemploSplitPane() {
// CREAR LOS COMPONENTES DE LA VENTANA
J ScrollPane panelIzquierdo = new J ScrollPane();
panelIzquierdo.setVerticalScrollBarPolicy(J ScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
J ScrollPane panelDerecho = new J ScrollPane();
panelDerecho.setHorizontalScrollBarPolicy(J ScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

J SplitPane panelDividido = new
J SplitPane(J SplitPane.HORI ZONTAL_SPLIT,panelIzquierdo,panelDerecho);
panelDividido.setDividerLocation(150);

// AGREGAR COMPONENTES A LA VENTANA
getContentPane().add(panelDividido);

// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA
setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);
setTitle("Ejemplo de SplitPane");
setSize(300, 200);
}
public static void main(String[] args) {
EjemploSplitPane ventana;
ventana = new EjemploSplitPane();
ventana.setVisible(true);
}
}

Grfico 13. Contenedor J SplitPane
Curso de J ava Standard Edition J 2SE 110
o javax.swing.J TabbedPane: es contenedor que gestiona varios componentes (o
grupos de componentes, aunque habitualmente paneles) como una pila de fichas.
Los componentes se superponen completamente los unos a los otros de forma que
slo uno de ellos es visible en cada momento. El usuario puede decidir cual de los
componentes se visualiza, seleccionando la solapa o lengeta correspondiente a
dicho componente. El administrador de diseo por omisin es CardLayout.

MTODO FUNCIONALI DAD
J TabbedPane()
J TabbedPane(int)
Constructor. Se puede establecer la posicin de
las solapas mediante las constantes TOP, BOTTOM,
LEFT y RIGTH.
void addTab(String, Icon, Component, String)
void addTab(String, Icon, Component)
void addTab(String, Component)
Aade una nueva ficha o componente (con su
solapa) al contenedor. Los argumentos
proporcionan el texto de la solapa, su icono, el
componente a mostrar cuando se seleccione esa
solapa y la ayuda contextual para la solapa.
void insertTab(String, Icon, Component, String, int)
Igual que addTab(), pero indica el ndice en la que
se aade la ficha en la lista de fichas.
int getSelectedIndex()
Component getSelectedComponent()
void setSelectedIndex(int)
void setSelectedComponent(Component)
Obtiene o establece el ndice o la ficha
seleccionada. La seleccin de una ficha supone su
presentacin automtica en pantalka.
void removeComponent(Component)
void removeTabAt(int)
Elimina la ficha del componente o la del ndice
correspondiente.
void setComponentAt(int, Component)
Component getComponentAt(int)
void setTitleAt(int, String)
String getTitleAt(int)
void setIconAt(int, Icon)
Icon getIconAt(int)
Establece u obtiene el componente, el titulo o el
icono asociado con la ficha situada en dicho
ndice.


Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J TabbedPane.

package interfacesGraficas;

import java.awt.*;
import javax.swing.*;

public class EjemploTabbedPane extends J Frame {
public EjemploTabbedPane() {

// CREAR LOS COMPONENTES DE LA VENTANA
J Panel panel1 = new J Panel();
panel1.add(new J Label("Panel 1"));

J Panel panel2 = new J Panel();
panel2.add(new J Label("panel2"), J Label.CENTER);

J TabbedPane panelSolapas = new J TabbedPane();
panelSolapas.addTab("Primero", panel1);
panelSolapas.addTab("Segundo", panel2);



Curso de J ava Standard Edition J 2SE 111
// AGREGAR COMPONENTES A LA VENTANA
getContentPane().add(panelSolapas);

// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA
setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);
setTitle("Ejemplo de TabbedPane");
setSize(300, 200);
}
public static void main(String[] args) {
EjemploTabbedPane ventana;
ventana = new EjemploTabbedPane();
ventana.setVisible(true);
}
}

Grfico 14. Contenedor J TabbedPane


o javax.swing.J ToolBar: esta clase implementa una barra de herramientas,
formada normalmente por botones o controles que incluyen iconos y que aparecen
organizados como una fila o una columna dependiendo de la zona de la pantalla
donde se coloque. El administrador de diseo predeterminado de una barra de
herramienta es BoxLayout.

MTODO FUNCIONALI DAD
J ToolBar()
J ToolBar(String)
J ToolBar(int)
Constructor que crea una barra de herramientas. Se
puede especificar el nombre y la orientacin de la
barra de herramientas. Los valores posibles son
HORIZONTAL o VERTICAL.
Component add(Component)
Aade un componente a la barra de herramientas.
Normalmente los componentes son botones.
void addSeparator()
Aade un separador al final de la barra de
herramientas
void setFloatable(boolean)
boolean isFloatable()
Establece u obtiene si la barra de herramientas se
puede desplazar o no.


Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J ToolBar.

package interfacesGraficas;

import java.awt.*;
import javax.swing.*;

public class EjemploJ ToolBar extends J Frame {
public EjemploJ ToolBar() {

// CREAR LOS COMPONENTES DE LA VENTANA
Curso de J ava Standard Edition J 2SE 112
J Button boton1 = new J Button(new ImageIcon("images/Web/tips.gif"));
J Button boton2 = new J Button(new ImageIcon("safe_easy_easier.jpg"));
J Button boton3 = new J Button(new ImageIcon("images/Web/bullet.gif"));

J ToolBar barra = new J ToolBar(J ToolBar.HORI ZONTAL);
barra.add(boton1);
barra.add(boton2);
barra.addSeparator();
barra.add(boton3);

// AGREGAR COMPONENTES A LA VENTANA
getContentPane().add(barra, BorderLayout.NORTH);

// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA
setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);
setTitle("Ejemplo de J ToolBar");
setSize(350, 150);
}

public static void main(String[] args) {
EjemploJ ToolBar ventana;
ventana = new EjemploJ ToolBar();
ventana.setVisible(true);
}

}


Grfico 15. Contenedor J ToolBar
Curso de J ava Standard Edition J 2SE 113
C CO OM MP PO ON NE EN NT TE ES S A AT T M MI I C CO OS S: : un componente simple o atmico, es un objeto que tiene una
representacin grfica que se puede mostrar en la pantalla y con la que puede
interactuar el usuario. No estn formados por otros componentes grficos ms simples.


Grfico 16. J erarqua de clases de los componentes atmicos

A continuacin se describen los componentes atmicos:

o javax.swing.ImageIcon: esta clase implementa la interfaz Icon, y genera un
icono a partir de una imagen en formato GIF o J PG. La imagen se especifica a
travs de un objeto Image, un String o mediante un localizador uniforme de
recursos (URL).

MTODO FUNCIONALI DAD
ImageIcon(String)
Crea un icono desde un archivo especificado. Puede
incluir la ruta en donde se encuentra la imagen,
empleando como separador de directorios el carcter
/.

J Component
ImageIcon
J Label
AbstractButton
J MenuBar
J PopupMenu
J Separator
J TextComponent
J List
J ComboBox
J Button
J ToggleButton
J Menu
J RadioButton
J CheckBox
J MenuItem
J RadioButtonMenuItem
J CheckBoxMenuItem
J TextField
J TextArea
J EditorPane
J PasswordField
J TextPane
Curso de J ava Standard Edition J 2SE 114
void setDescription(String) Establece una descripcin para el icono
String getDescription() Devuelve la descripcin del icono

o javax.swing.J Label: esta clase implementa una etiqueta que puede contener una
cadena de texto, un icono o ambos, y puede mostrarse en cualquier contenedor.
Una etiqueta es un campo de solo salida, es decir muestra su contenido que no es
ni seleccionable ni editable por el usuario. Se emplea par dar nombre (etiquetar) a
otros componentes de la interfaz grfica. Una caracterstica importante de las
etiquetas en Swing es que estas admiten varias lneas, con distintos tipos de fuente.

MTODO FUNCIONALI DAD
J Label(String)
J Label(String, int)
J Label(Icon)
Constructores. Se puede especificar el texto, el icono
y la alineacin horizontal del contenido en la etiqueta.
void setText(String)
String getText()
Establece u obtiene el texto de la etiqueta.
void setIcon(Icon)
Icon getIcon()
Establece u obtiene el icono de la etiqueta.
void setHorizontalAligment(int)
int getHorizontalAligment()
Establece u obtiene la alineacin horizontal del
contenido. Los valores posibles son: LEFT (por
omisin), CENTER, RIGTH, LEADING y TRAILING.
void setVerticalAligment(int)
int getVerticalAligment()
Establece u obtiene la alineacin vertical del
contenido. Los valores posibles son: CENTER (por
omisin), TOP y BOTTOM.

o javax.swing.J Button: esta clase implementa la forma ms habitual de botn
grfico de interaccin que sirve para ejecutar una accin haciendo clic sobre l.
Tambin se puede activa mediante el teclado si se le ha asociado una combinacin
de teclas

MTODO FUNCIONALI DAD
J Button(String)
J Button(Icon)
J Button(String,Icon)
Constructor, en el cual se puede especificar el texto
del botn y el icono asociado.
void doClick()
Selecciona el botn mediante programa (equivale a
que el usuario haga clck sobre el botn).
Icon getIcon()
void setIcon(Icon)
Obtiene o establece el icono del botn.
String getText()
void setText(String)
Obtiene o establece el texto del botn.
boolean isSelected()
void setSelected (bolean)
Obtiene o establece el estado del botn (seleccionado
o no seleccionado).
boolean getEnabled()
void setEnabled(bolean)
Obtiene o establece el estado de activacin del botn
(Activado o desactivado).

o javax.swing.J TextField: Componente que permite mostrar y editar una nica
lnea de texto. Se utiliza para solicitar al usuario entradas de datos breves en forma
de texto. Utiliza principalmente los mtodos heredados de la clase J TextComponent,
y representa una obtener y validar datos proporcionados por el usuario.

Curso de J ava Standard Edition J 2SE 115
MTODO FUNCIONALI DAD
J TextField()
J TextField(String)
J TextField(int)
J TextField(String,int)
Constructores. Se puede especificar un texto inicial y
el nmero de caracteres que podr contener.
void setText(String)
String getText()
Estable u obtiene el texto contenido en el
componente.
void setEditable(boolean)
boolean isEditable()
Establece u obtiene si el usuario puede editar el texto
contenido


o javax.swing.J CheckBox: esta clase implementa una casilla de verificacin. Es una
especializacin de un botn con estado o conmutador (J ToggleButton) y, por tanto,
tiene dos estados posibles, seleccionada o no seleccionada que determina y
modifica su apariencia grfica (normalmente mediante una cruz o marca de
seleccin).

MTODO FUNCIONALI DAD
J CheckBox(String, Icon, boolean)
Constructor. Permite establecer el texto de la casilla,
un icono y el estado inicial (true seleccionado,
false no seleccionado)
boolean isSelected()
void setSelected (bolean)
Obtiene o establece el estado del botn (seleccionado
o no seleccionado).
boolean getEnabled()
void setEnabled(bolean)
Obtiene o establece el estado de activacin del botn
(Activado o desactivado).


o javax.swing.J RadioButton: esta clase implementa los botones de radio o de
opcin que son una especializacin de un botn con estado o conmutador
(J ToggleButton) caracterizados porque en un grupo de botones de opcin slo uno
de ellos puede estar seleccionado, es decir, que so mutuamente excluyentes de
modo que si se selecciona otro botn de radio distinto el anterior, deja de estar
seleccionado. Para conseguir este comportamiento de excusin mutua los botones
de radio se deben agrupar en un objeto de grupo de botones ButtonGroup. La
forma de agruparlos es crear el grupo de botones, crear los botones y aadirlos al
grupo mediante el mtodo add() de ButtonGroup, como si se tratara de un
contenedor. Esta agrupacin es nicamente lgica, por tanto para dar al usuario la
idea de que estn relacionados normalmente se incluyen en algn contenedor
intermedio (por ejemplo, J Panel), y se le aade algn tipo de borde.

J RadioButton
MTODO FUNCIONALI DAD
J RadioBox(String, Icon, boolean)
Constructor. Permite establecer el texto del botn de
opcin, un icono y el estado inicial (true
seleccionado, false no seleccionado)
boolean isSelected()
void setSelected (bolean)
Obtiene o establece el estado del botn (seleccionado
o no seleccionado).
boolean getEnabled()
void setEnabled(bolean)
Obtiene o establece el estado de activacin del botn
(Activado o desactivado).


Curso de J ava Standard Edition J 2SE 116
ButtonGroup
MTODO FUNCIONALI DAD
ButtonGroup() Constructor que crea un grupo de botones
add(AbstractButton) Aade un botn al grupo de botones, de forma lgica

o javax.swing.J ComboBox: esta clase implementa un cuadro combinado
desplegable, en el que se agrupan las funcionalidades de una lista y un campo de
texto. El campo de texto y la lista de valores (su modelo) tienen una estrecha
relacin de dependencia, de modo que si el usuario escribe texto en el cuadro la
lista se desplaza hasta la concordancia ms prxima entre sus valores. Cuando el
usuario selecciona un elemento de esa lista, ese valor pasa automticamente a
mostrarse como contenido del cuadro combinado. En la lista, adems de valores
textuales se pueden incluir iconos. Tiene dos posibles formas de uso: la primeroa
forma es cuado se presenta una lista fija de posibles valores para que usuario las
elija; y la segunda es cuando el usuario tambin puede introducir un nuevo valor a
la lista.

MTODO FUNCIONALI DAD
J ComboBox()
J ComboBox(Object [ ])
J ComboBox(Vector)
Constructores. El contenido inicial de la lista de
valores se puede hacer a partir de un arreglo de
objetos o de un Vector.
void addItem(Object)
void insertItemAt(Object,int)
Aade un objeto al final de la lista de valores o lo
inserta en una determinada posicin.
Object getItemAt(int)
Object getSelectedItem()
Obtiene un elemento de una determinada posicin o
el elemento actualmente seleccionado del cuadro
combinado. Tiene los mtodos set correspondientes
para establecer estos valores.
void removeItemAt(int)
void removeItem(Object)
Elimina un objeto de la lista de la posibles valores,
dada una posicin o un objeto especifico.
void setEditable(boolean)
boolean isEditable()
Establece u obtiene si un campo combinado
desplegable es editable o no
void setMaximunRowCount(int)
Establece el nmero mximo de filas que muestra
para realizar la eleccin. Para acceder al resto
presenta de forma automtica barras de
desplazamiento.


Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J Frame con los
componentes grficos de Swing vistos previamente.

package interfacesGraficas;

import java.awt.*;
import javax.swing.*;

public class EjemploComponentesGraficos extends J Frame {

public EjemploComponentesGraficos() {

/ / CREAR LOS COMPONENTES DE LA VENTANA
J Label jblNombre= new J Label("Nombre:");
J TextField jtfNombre = new J TextField("",10);
J Button jbtBuscar = new J Button("Buscar");

Curso de J ava Standard Edition J 2SE 117
J RadioButton jrbOpcA = new J RadioButton("Femenino", true);
J RadioButton jrbOpcB = new J RadioButton("Masculino");
ButtonGroup grupoOPC = new ButtonGroup();
grupoOPC.add(jrbOpcA);
grupoOPC.add(jrbOpcB);
Panel panelOPC = new Panel();
panelOPC.setName("Opciones");
panelOPC.add(jrbOpcA);
panelOPC.add(jrbOpcB);

J CheckBox chkOp1 = new J CheckBox("Femenino");
J CheckBox chkOp2 = new J CheckBox("Masculino");
Panel panelCHK = new Panel();
panelCHK.setName("CASILLAS");
panelCHK.add(chkOp1);
panelCHK.add(chkOp2);

String [] valores = new String[]{"Femenino","Masculino"};
J ComboBox jcbSexo = new J ComboBox(valores);

/ / AGREGAR COMPONENTES A LA VENTANA
getContentPane().setLayout(new FlowLayout());
getContentPane().add(jblNombre);
getContentPane().add(jtfNombre);
getContentPane().add(jbtBuscar);
getContentPane().add(panelOPC);
getContentPane().add(panelCHK);
getContentPane().add(jcbSexo);

// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA
setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);
setTitle("Componentes Grficos Swing");
setSize(330, 200);
}

public static void main(String[] args) {
EjemploComponentesGraficos ventana;
ventana = new EjemploComponentesGraficos();
ventana.setVisible(true);
}
}


Grafico 17. Ejemplo de los componentes grficos de Swing

o javax.swing.J List: esta clase implementa una lista de elementos que se presenta
en forma de columna. En esta lista el usuario puede realizar la seleccin de uno
(comportamiento predeterminado) o varios de sus elementos. Si la lista tiene
muchos elementos y, por tanto, pueden no caber en el espacio de visualizacin
asignado, debera incluirse dentro de un panel con barras de desplazamiento.
Curso de J ava Standard Edition J 2SE 118
El contenido de una lista viene dado por su modelo de datos que debe implementar
la interfaz J ava ListModel, aunque se proporcionan constructores y mtodos que
crean automticamente dicho modelo a partir de un arreglo de objetos o de un
Vector. Adems, se proporciona una implementacin predeterminada del modelo de
datos de la lista mediante la clase DefaultListModel. Esta clase permite modificar
el contenido de una lista de forma dinmica mediante los mtodos addElement() y
removeElement().

MTODO FUNCIONALI DAD
J List(ListModel)
J List(Vector)
J List(Object [])
Constructores. Permiten crear la lista de datos a partir
de una modelo de datos, una Vector o un arreglo de
objetos
void setListData(Vector)
void setListData(Object [ ])
ListModel getModel()
Establece u obtiene el modelo de datos de la lista
(contenido)
void setSelectionMode(int)
int getSelectionMode()
Establece u obtiene el modo de seleccin. Las
posibilidades son: por omisin seleccin simple
(SINGLE_SELECTION), la seleccin de un nico intervalo
(SINGLE_INTERVAL_SELECTION) o la seleccin de intervalos
mltiples (MULTIPLE_INTERVAL_SELECTION)
int getSelectionIndex()
int getMinSelectionIndex()
int getMaxSelectionIndex()
int [ ] getSelectedIndices()
Object getSelectedValue()
Object [] getSelectedValues()
Obtiene el ndice o valor seleccionado (o ndices o
valores dependiendo del modelo de seleccin que est
activado). Estos mtodos tienen sus mtodos set
correspondientes para establecer estos valores.
void clearSelection()
bolean isSelectionEmpty()
Desactiva la seleccin actual o detecta si la seleccin
es vaca.


o javax.swing.J Table: esta clase es usada para mostrar y editar cuadriculas
regulares de dos dimensiones. En esta tabla el usuario puede realizar la seleccin de
una (comportamiento predeterminado) o varias de filas o columnas. Si la tabla tiene
muchos elementos y, por tanto, pueden no caber en el espacio de visualizacin
asignado, debera incluirse dentro de un panel con barras de desplazamiento.

El contenido de la tabla viene dado por su modelo de datos que debe implementar
la interfaz J ava TableModel, aunque se proporcionan constructores y mtodos que
crean automticamente dicho modelo a partir de una matriz de objetos y de un
arreglos de objetos o a partir de dos objetos de Vector.


MTODO FUNCIONALI DAD
J Table()
J Table(Object[][], Object[])
Constructor. Permite construir una tabla a partir de
una matriz que posee el contenido de la Tabla y de un
arreglo que contiene los encabezados de las columnas
de la tabla.
int getRowCount()
int getColumnCount()
Devuelve el nmero de filas y columnas de la Tabla.
String getColumnName(int)
Devuelve el nombre de la columna pasada por
parmetro. Las filas y las columnas se numeran a
partir de cero (0).
Curso de J ava Standard Edition J 2SE 119


int getSelectedColumn()
int [ ] getSelectedColumns()
int getSelectedRow()
int [ ] getSelectedRow()
Devuelve el nmero o nmeros de la(s) columna(s) o
de la(s) fila(s) seleccionada(s) respectivamente. Si no
hay nada seleccionada devuelve -1.

Nota: Es importante tener en cuenta que si ocurre un cambio en el modelo, tanto
de un J List o de un J Table, automticamente se actualiza el contenido del mismo.

Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J Frame con una
Barra de Men y los componentes grficos de Swing J List y J Table.

package interfacesGraficas;

import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;

import java.util.Vector;

public class EjemploListaTabla extends J Frame {

public EjemploListaTabla() {

// CREAR LOS COMPONENTES DE LA VENTANA
J Label jblLista = new J Label("J Lista:");
J Label jblTabla1 = new J Label("J Table 1:");
J Label jblTabla2 = new J Label("J Table 2:");

// Crear la Lista de elementos
Vector elementos = new Vector(5);
elementos.add("Elemento 1");
elementos.add("Elemento 2");
elementos.add("Elemento 3");
elementos.add("Elemento 4");
elementos.add("Elemento 5");
J List jlLista = new J List(elementos);

// Crear la Tabla 1
String [][] contenido = new String[][]{
{"Celda 0","Celda 1","Celda 2"},
{"Celda 3","Celda 4","Celda 5"},
{"Celda 6","Celda 7","Celda 8"}
};
String [] columnas = new String[]{"Columna 1","Columna 2","Columna 3"};
J Table jtTabla1 = new J Table(contenido,columnas);

// Crear la Tabla 2
String [][] contents = new String[5][3];
String [] colums = new String[]{"Col1","Col2","Col3"};
contents[2][2] = new String("Celda (2,2)");
J Table jtTabla2 = new J Table(contents,colums);

// AGREGAR COMPONENTES A LA VENTANA
getContentPane().setLayout(new FlowLayout());
getContentPane().add(jblLista);
getContentPane().add(jlLista);
getContentPane().add(jblTabla1);
Curso de J ava Standard Edition J 2SE 120
getContentPane().add(jtTabla1);
getContentPane().add(jblTabla2);
getContentPane().add(jtTabla2);

/ / Si se edita el Modelo, automticamente se actualiza la vista
contents[3][0] = new String("Celda (3,0)");

// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA
setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);
setTitle("Ejemplo de Listas y Tablas");
setSize(450, 250);
}

public static void main(String[] args) {
EjemploListaTabla ventana;
ventana = new EjemploListaTabla();
ventana.setVisible(true);
}

}


Grafico 18. Ejemplo de J List y J Table

o javax.swing.J MenuBar: esta clase implementa una barra de men que
habitualmente se aade al panel raz de un contenedor, mediante el mtodo
void setJ MenuBar(J MenuBar) del contenedor. Para crear una barra de mens se
crea un objeto J MenuBar, al que posteriormente se le aaden los mens
desplegables (objetos J Menu).

MTODO FUNCIONALI DAD
J MenuBar() Constructor no necesita parmetros
void add(J Menu)
Permite aadir un men desplegable a una barra de
men.

o javax.swing.J Menu: esta clase implementa cada uno de los mens desplegables
asociados a las entradas o ttulos de una barra de mens. Un men desplegable
debe estar asociado a una barra de men (J MenuBar). Para crear un men
desplegable, al crearlo se le asigna su ttulo y posteriormente se le aaden el resto
de los elementos de men o cadenas de texto que se desean que aparezcan.

Permite adems, crear mens en cascada, tambin llamados mens jerrquicos o
secundarios. Para crearlos simplemente hay que aadir un men desplegable a otro
men desplegable.

Curso de J ava Standard Edition J 2SE 121
MTODO FUNCIONALI DAD
J Menu()
J Menu(String)
Constructores. Se puede dar el titulo que se muestra
en la barra de men.
J MenuItem add(J MenuItem)
J MenuItem add(String)
Aade un elemento al final del men desplegable.
Tambin se puede aadir una cadena de texto.
void addSeparator() Aade un separador al final de un men desplegable
J MenuItem insert(J MenuItem, int)
void insert(String, int)
void insertSeparator(int)
Inserta un elemento, una cadena o un separador en
la posicin indicada del men. El ndice del primer
elemento del men es 0.
void remove(J MenuItem)
void remove(int)
void removeAll()
Elimina un elemento del men a partir del objeto o de
una posicin especifica. Adems permite eliminar
todos los elementos.

o javax.swing.J MenuItem: esta clase es la implementacin de un elemento de un
men desplegable. Un tem de men es esencialmente un botn situado la lista de
opciones de un men. Cuando el usuario selecciona el botn (J MenuItem), la accin
asociada al tem del men es realizada.

MTODO FUNCIONALI DAD
J MenuItem(String)
J MenuItem(String, Icon)
Constructores. Se puede especificar el texto y un
icono al elemento del men desplegable.
void setEnabled(boolean) Activa o desactiva el elemento del men

Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J Frame con una
Barra de Men.

package interfacesGraficas;

import javax.swing.*;

public class EjemploMenus extends J Frame {

public EjemploMenus() {
// CREAR LOS COMPONENTES DE LA VENTANA
J MenuItem itmOPC1 = new J MenuItem("Opcion 1");
J MenuItem itmOPC2 = new J MenuItem("Opcion 2");
J MenuItem itmOPC3 = new J MenuItem("Opcion 3");
J MenuItem itmOPC4 = new J MenuItem("Opcion 4");
J Menu mnu1 = new J Menu("Menu 1");
mnu1.add(itmOPC1);
mnu1.add(itmOPC2);
mnu1.add(itmOPC3);
mnu1.add(new J CheckBoxMenuItem("Opcion CHK"));
mnu1.add(new J Separator());
mnu1.add(itmOPC4);

J Menu mnu2 = new J Menu("Menu 2");
mnu2.add(new J MenuItem("Opcion 5"));
mnu2.add(new J MenuItem("Opcion 6"));
mnu2.add(new J MenuItem("Opcion 7"));

J MenuBar mnuBar = new J MenuBar();
mnuBar.add(mnu1);
mnuBar.add(mnu2);

Curso de J ava Standard Edition J 2SE 122
// AGREGAR COMPONENTES A LA VENTANA
getRootPane().setJ MenuBar(mnuBar);

// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA
setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);
setTitle("Ejemplo de Menus");
setSize(450, 250);
}

public static void main(String[] args) {
EjemploMenus ventana;
ventana = new EjemploMenus();
ventana.setVisible(true);
}
}



Grafico 19. Ejemplo de Mens en J ava


Curso de J ava Standard Edition J 2SE 123
3 3. . L LO OS S A AD DM MI I N NI I S ST TR RA AD DO OR RE ES S D DE E D DI I S SE E O O

Un administrador de disposicin o diseo es un objeto auxiliar que colabora con la aplicacin, y con
el sistema operativo en la sta se ejecuta, para determinar la mejor manera de mostrar los
elementos grficos en la ventana principal de la aplicacin. Un administrador de disposicin permite
una mayor flexibilidad y control para colocar los componentes grficos dentro de un contenedor, a la
vez que proporciona portabilidad e independencia frente a la plataforma concreta en la que se
ejecuta. Por ejemplo, el programador no tiene que preocuparse sobre qu pasa si el usuario cambia
el tamao de la ventana, el tamao de la pantalla o si su aplicacin se ejecuta en Windows o UNIX.

La administracin de diseo es el proceso en el que se determina el tamao y la posicin de
los componentes grficos de un contenedor. En este proceso se tiene en cuenta las
sugerencias de tamao de cada componente (su tamao mnimo, preferido y mximo) y, en la
mayora de los casos el orden en el que se han aadido al contenedor. El administrador de
diseo acta de forma automtica cada vez que se ha realizado alguna modificacin en
el contenedor que pueda producir un cambio en su presentacin grfica.

Cada contenedor (Conteiner) tiene asignado de forma predeterminada un administrador de diseo.
En el constructor de cada contenedor se crea y se asigna un administrador de disposicin por
omisin, que puede ser cambiado por el programador.

o J Panel FlowLayout
o J Frame BorderLayout
o J Dialog BorderLayout
o J Window FlowLayout

Si el programador desea cambiar el administrador predeterminado, primero debe crear un
objeto del tipo de administrador deseado y despus asociarlo al contenedor. La asociacin se realiza
mediante el mtodo del contenedor void setLayout(LayoutManager lay). El tipo de
administrador puede cambiar la forma en la que se aaden los componentes al contenedor.

Otra posibilidad es no utilizar un administrador de diseo y realizar una colocacin
absoluta de los componentes dentro del contenedor. Para esto simplemente hay que especificar
que el administrador para dicho contenedor es null. No obstante, esta posibilidad no es muy
recomendable en la mayora de los casos, ya que la aplicacin puede no presentarse de forma
adecuada si se ejecuta en una plataforma diferente o si se cambia la resolucin de la pantalla.

3 3. .1 1. . T TI I P PO OS S D DE E A AD DM MI I N NI I S ST TR RA AD DO OR RE ES S D DE E D DI I S SE E O O

En las primeras versiones de J ava, que slo tenan AWT, se proporcionaban de forma estndar
cinco administradores de diseo:

o FlowLayout
o BorderLayout
o GridLayout Todos los administradores implementan la interfaz LayoutManager
o CardLayout
o GridBagLayout


Curso de J ava Standard Edition J 2SE 124
o FlowLayout: es el administrador de disposicin ms simple que proporciona J ava y es el
que se proporciona por omisin en los paneles (J Panel). Los componentes se colocan en una
fila de izquierda a derecha hasta ocupar el espacio horizontal completo asignado al
contenedor, segn el orden en el que han sido aadidos. Si todos los componentes, no
caben en una sola fila, se sigue en la siguiente. Los componentes se dimensionan segn el
tamao que necesitan (su tamao preferido) y dentro de cada fila se muestran centrados
por omisin.

Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J Frame con el
administrador de diseo FlowLayout, as como los elementos que administra.

package interfacesGraficas;

import java.awt.*;
import javax.swing.*;

public class EjemploFlowLayout extends J Frame {
// Constructor de la Ventana
public EjemploFlowLayout() {
setTitle(Administrador de Diseo: FlowLayout);
getContentPane().setLayout(new FlowLayout());
getContentPane().add(new J Button(Botn 1));
getContentPane().add(new J Button(Segundo Botn));
getContentPane().add(new J Button(3 Botn));
getContentPane().add(new J Button(Bot. 4));
getContentPane().add(new J Button(Botn5));
}
// Mtodo principal
public static void main(String[] args) {
EjemploFlowLayout Flow = new EjemploFlowLayout();
Flow.pack();
Flow.setVisible(true);
}
}


Grafico 20. Administrador de Diseo FlowLayout

El administrador FlowLayout proporciona tres constructores:
o public FlowLayout()
o public FlowLayout(int aligment)
o public FlowLayout(int algment, int horizontalGAP, int verticalGAP)

Es obligatorio que el argumento aligment tenga el valor FlowLayout.LEFT,
FlowLayout.CENTER o FlowLayout.RI GHT. Los argumentos horizontalGAP y verticalGAP
especifican el nmero de pxeles presentes entre los componentes. Si no se especifica
ningn valor de espaciado (GAP), FlowLayout asume el valor de cinco (5 pxels) por omisin.

o BorderLayout: Es el administrador predeterminado de los contenedores de alto nivel
(J Frame y J Dialog). Este administrador de disposicin est basado en dividir el contenedor
en cinco zonas, una central y otras cuatro segn los puntos cardinales. Los puntos
Curso de J ava Standard Edition J 2SE 125
cardinales norte, sur, este y oeste se corresponden con las partes superior, inferior,
izquierda y derecha del contenedor. No es necesario utilizar todas las zonas, de modo que
las zonas ocupadas se reparten el espacio disponible. La zona central se considera
privilegiada y trata de ocupar la mayor parte del espacio del contenedor.

Al aadir un componente a un contenedor que utilice BorderLayout., se debe indicar la zona
en la que se quiere colocar el componente. Cada una de estas zonas estn indentificadas
por la correspondiente constantes de clase: BorderLayout.CENTER, BorderLayout.NORTH,
BorderLayout.SOUTH, BorderLayout.EAST y BorderLayout.WEST. El componente aadido
debe ocupar todo el espacio asignado a su zona y, por omisin, no se deja espacio entre las
distintas zonas. Si slo se incluye un componente y no se indica la zona, se coloca en la
zona central y ocupa todo el espacio disponible.

Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J Dialog con el
administrador de diseo BorderLayout, as como los elementos que administra.

package interfacesGraficas;

import java.awt.*;
import javax.swing.*;

public class EjemBorderLayout extends J Dialog {
public EjemBorderLayout() {
J Button b1, b2, b3, b4, b5;
b1 = new J Button(Botn 1 (CENTER));
b2 = new J Button(Segundo Botn (NORTH));
b3 = new J Button(3 Botn (SOUTH));
b4 = new J Button(Bot. 4 (EAST));
b5 = new J Button(Botn5 (WEST));
// Se obtiene el panel de contenido
Container panelContenido = getContentPane();
// Se aaden los botones al panel de contenido
panelContenido.setLayout(new BorderLayout());
panelContenido.add(b1, BorderLayout.CENTER);
panelContenido.add(b2, BorderLayout.NORTH);
panelContenido.add(b3, BorderLayout.SOUTH);
panelContenido.add(b4, BorderLayout.EAST);
panelContenido.add(b5, BorderLayout.WEST);
}
public static void main(String[] args) {
EjempBorderLayout Border = new EjemBorderLayout();
Border.setTitle(Administrador de Diseo:
BorderLayout);
Border.pack();
Border.setVisible(true);
}
}





Grfico 21. Administrador de Diseo BorderLayout

El administrador BorderLayout proporciona dos constructores: uno vaco BorderLayout() y
otro en el que se puede especificar en pxeles una separacin horizontal y vertical entre las
zonas BorderLayout(int horizontalGAP, int verticalGAP).

o GridLayout: con este administrador los componentes se colocan en una matriz de celdas
(definida por el nmero de filas y columnas) que ocupa todo el espacio asignado al
Curso de J ava Standard Edition J 2SE 126
contenedor. Todas las celdas son iguales y los componentes utilizan todo el espacio
disponible para cada celda.

Al aadir los componentes se va rellenando la matriz primero por filas, cuando una fila est
llena se pasa a la siguiente. Proporciona dos constructores, uno en el que solo se indican el
nmero de filas y el nmero de columnas de la matriz GridLayout(int filas, int cols) y
otro en el que adems, se especifica en pxeles la separacin horizontal y vertical entre
celdas GridLayout(int filas, int cols, int horizontalGAP, int verticalGAP). Por lo
menos uno de los argumentos que especifican el nmero de filas o columnas debe ser
distinto de cero. Por omisin no hay espacio de separacin entre las celdas.

Ejemplo: A continuacin se presenta un ejemplo que puede ubicar nueve botones en tres
filas y tres columnas.

package interfacesGraficas;

import java.awt.*;
import javax.swing.*;

public class EjemploGridLayout extends J Frame {

public EjemploGridLayout() {
// Se obtiene el panel de contenido
Container panelContenido = getContentPane();
// Se aaden los botones al panel de contenido
panelContenido.setLayout(new GridLayout(3, 3));
panelContenido.add(new J Button(Botn 1));
panelContenido.add(new J Button(2 Botn));
panelContenido.add(new J Button(Botn 3));
panelContenido.add(new J Button(4 Botn));
panelContenido.add(new J Button(Botn 5));
panelContenido.add(new J Button(6 Botn));
panelContenido.add(new J Button(Botn 7));
panelContenido.add(new J Button(8 Botn));
panelContenido.add(new J Button(Botn 9));
}
public static void main(String[] args) {
EjemploGridLayout Grid = new EjemploGridLayout();
Grid.setTitle(Administradores de Diseo: GridLayout);
Grid.pack();
Grid.setVisible(true);
}
}



Grafico 22. Administrador de Diseo FlowLayout
Curso de J ava Standard Edition J 2SE 127
o CardLayout: este administrador de disposicin permite gestionar distintos componentes
que ocupan un mismo espacio de forma que en cada momento slo uno de ellos es visible.
Utiliza la idea de PI LA en donde solo es visible el primer componente, de modo que para
visualizar los otros hay que ir ponindolas sucesivamente en la parte superior. La ordenacin
de la pila viene determinada por el orden en el que se han aadido los componentes. Estos
son los mtodos de uso ms frecuente en CardLayout:

METODO FUNCIONALI DAD
CardLayout() y CardLayout(int, int) Constructores. Se puede proporcionar la separacin
void add(String, Object) Aade un componente al contenedor y le da nombre
void first(Container)
void last(Container)
void next(Container)
void previous(Container)
Selecciona el primer componente, el ltimo, el
siguiente o el componente anterior del mazo. Al ser
seleccionado se muestra automticamente. El orden
es segn se han aadido al contenedor.
void show(Container, String) Muestra el componente cuyo nombre se proporciona

package interfacesGraficas;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class EjemploCardLayout extends J Frame implements ItemListener{
J Panel cards;
public EjemploCardLayout() {
// Se obtiene el panel de contenido
Container panelContenido = getContentPane();
// Se aaden los botones al panel de contenido
panelContenido.setLayout(new BorderLayout());
// Se crea y agrega el combo de seleccin de elementos
J Panel cp = new J Panel();
Choice c = new Choice();
c.add(J Button); c.add(TextField); c.add(J Label); c.addI temListener(this);
cp.add(c);
panelContenido.add(BorderLayout.NORTH, cp);
// Se crean y agregan los componentes a sobreponer
cards = new J Panel();
cards.setLayout(new CardLayout());
J Panel p1 = new J Panel(); p1.add(new J Button(Botn 1));
J Panel p2 = new J Panel(); p2.add(new TextField(TextField, 20));
J Panel p3 = new J Panel(); p3.add(new TextArea(J Label,20));
cards.add(J Button, p1); cards.add(TextField, p2); cards.add(J Label, p3);
panelContenido.add(BorderLayout.CENTER, cards);
}
public void itemStateChanged(ItemEvent ie) {
CardLayout c1 = (CardLayout) (cards.getLayout());
c1.show(cards, (String) ie.getItem());
}
public static void main(String[] args) {
EjemploCardLayout Card = new EjemploCardLayout();
Card.setTitle(Administradores de Diseo: CardLayout);
Card.pack(); Card.setVisible(true);
} }






Grfico 23.Administrador de Diseo CardLayout
Curso de J ava Standard Edition J 2SE 128
o GridBagLayout: es el administrador de disposicin ms verstil y funcional, ya que permite
organizar los componentes tanto verticalmente como horizontalmente, aunque tengan
distinto tamao. Con este propsito mantiene una malla dinmica rectangular de celdas,
donde las filas y columnas pueden tener distinto tamao, en las que se sitan los
componentes. Un componente puede ocupar varias celdas contiguas. La situacin y espacio
ocupado por cada uno de los componentes se describe por medio de restricciones
(constrains). A cada componente se le asocia un objeto de la clase GridBagConstrains
que especifica las restricciones y que, junto con las indicaciones de tamao del componente
(tamao mnimo y preferido), determinan la presentacin final del objeto en el contenedor.

CONSTRAINS DESCRI PCI N
GridBagConstraints.gridx
GridBagConstraints.gridy
Especifica la celda superior izquierda en el rea de pantalla del
componente, donde la celda superior izquierda tiene la direccin gridx=0,
gridy=0. el valor por omisin, GridBagConstraints.RELATI VE indica
que el componente debe simplemente colocarse a la derecha de (para
gridx) o justo debajo del (para gridy) componente que se aadi al
contenedor justo antes de que este componente fuera aadido.
GridBagConstraints.gridwidth
GridBagConstraints.gridheight
Especifica el nmero de celdas en una fila (gridwidth) o columna
(gridheight) en el rea de pantalla del componente. El valor
predeterminado es 1. GridBagConstraints.REMAI NDER indica que el
componente tiene que ser el ltimo en su fila (gridwith) o columna
(wridheight).
GridBagConstraints.fill
Se utiliza cuando el rea de pantalla del componente es mayor que el
tamao solicitado del componente, a fin de averiguar si debe, y cmo,
redimensionar el componente. Los valores posibles para ste son:
GridBagConstraints.NONE (valor por omisin),
GridBagConstraints.HORIZONTAL (para hacer suficientemente ancho
al componente para rellenar su rea en forma horizontal),
GridBagConstraints.VERTICAL(para hacer suficientemente alto al
componente para rellenar su rea en forma vertical) y
GridBagConstraints.BOTH (para que rellene toda su rea).
GridBagConstraints.ipadx
GridBagConstraints.ipady
Especifica el relleno interno del componente dentro del diseo. Nos dice
cunto ms se necesita aadir al tamao mnimo del mismo. El ancho del
componente debe ser al menos el ancho mnimo ms ipadx*2 pxeles.
Esto es debido a que el relleno se aplica a ambos lados del componente.
En forma similar, la altura del componente debe ser al menos la altura
mnima ms ipdy*2 pxeles.
GridBagConstraints.insets
Especifica el relleno externo del componente, la cantidad mnima de
espacios entre el componente y los lmites de su rea de pantalla.
GridBagConstraints.anchor
Se usa cuando el componente es ms pequeo que su rea de pantalla y
permite determinar dnde tiene que colocarse el componente, dentro del
rea de pantalla. Los valores vlidos son: GridBagConstraints..CENTER
(valor por omisin). Los otros valores vlidos son:
GridBagConstraints.NORTH, GridBagConstraints.NORTHEAST,
GridBagConstraints.EAST, GridBagConstraints.SOUTHEAST,
GridBagConstraints.SOUTH, GridBagConstraints.SOUTHWEST,
GridBagConstraints.WEST, GridBagConstraints.NORTHWEST.
GridBagConstraints.weightx
GridBagConstraints.weighty
Permite determinar como distribuir el espacio, cuando se especifica el
comportamiento de cambio de tamao. Si no especificamos un peso para
al menos un componente en una fila (weightx) y columna (weighty), todos
los componentes que han sido ubicados se amontonarn en el centro del
contenedor. Esto ocurre porque el GridBackLayout coloca todo el espacio
extra entre su malla de celdas y los lmites del objeto contenedor, cuando
el peso es cero.

Ejemplo: El siguiente cdigo genera tres componentes, administrados por GridBagLayout.:

Curso de J ava Standard Edition J 2SE 129
package interfacesGraficas;

import java.awt.*;
import javax.swing.*;

public class EjemploGridBagLayout extends J Frame {
public EjemploGridBagLayout() {
/ ** Se obtiene el panel de contenido * */
Container panelContenido = getContentPane();
GridBagLayout gb1 = new GridBagLayout();
panelContenido.setLayout(gb1);
/ ** CREA UN CAMPO DE TEXTO * */
J TextField display = new J TextField(12);
// Aade las restricciones para el campo de texto
GridBagConstraints displayConstraints = new
GridBagConstraints();
displayConstraints.gridx = 0;
displayConstraints.gridy = 0;
displayConstraints.gridwidth = 4;
displayConstraints.gridheight = 1;
displayConstraints.fill = GridBagConstraints.HORIZONTAL;
// Aade el campo de texto
gb1.setConstraints(display, displayConstraints);
panelContenido.add(display);
/ ** CREA UN BOTN LIMPI AR * */
J Button clear = new J Button(Limpiar);
// Aade las restricciones para el Boton
GridBagConstraints clearConstraints = new
GridBagConstraints();
clearConstraints.gridx = 0;
clearConstraints.gridy = 1;
clearConstraints.gridwidth = 1;
clearConstraints.gridheight = 1;
clearConstraints.fill = GridBagConstraints.BOTH;
clearConstraints.insets = new Insets(3, 3, 3, 3);
// Aade el boton
gb1.setConstraints(clear, clearConstraints);
panelContenido.add(clear);
/ ** CREA UN BOTN IGUAL * */
J Button equal = new J Button(Igual);
// Aade las restricciones para el Boton
GridBagConstraints equalConstraints = new
GridBagConstraints();
equalConstraints.gridx = 1;
equalConstraints.gridy = 1;
equalConstraints.gridwidth = 1;
equalConstraints.gridheight = 1;
equalConstraints.fill = GridBagConstraints.BOTH;
equalConstraints.insets = new Insets(3, 3, 3, 3);
// Aade el boton
gb1.setConstraints(equal, equalConstraints);
panelContenido.add(equal);
}
public static void main(String[] args) {
EjemploGridBagLayout egbl = new EjemploGridBagLayout();
egbl.setTitle(Administradores de Diseo: GridBagLayout);
egbl.pack();
egbl.setVisible(true);
}
}

Grfico 24. Administrador de Diseo
GridBagLayout

Curso de J ava Standard Edition J 2SE 130
4 4. . E EV VE EN NT TO OS S

El usuario se comunica con una aplicacin con interfaz grfica, mediante la interaccin con dicha
interfaz (por ejemplo, se pulsa el ratn o se escribe texto). Como resultado de estas acciones se
generan eventos. El tratamiento o gestin de estos eventos, mediante la ejecucin de un mtodo o
mtodos en el que se responde a la accin del usuario, es la forma de obtener la interactividad de la
aplicacin. Este modo de programar se denomina programacin dirigida por eventos.


4 4. .1 1. . M MO OD DE EL LO O D DE E D DE EL LE EG GA AC CI I N N D DE E E EV VE EN NT TO OS S

En J ava el tratamiento de los eventos se realiza mediante el Modelo de Delegacin de
Eventos. La idea bsica del modelo es que el tratamiento de un evento que ocurre en un objeto
(objeto fuente) no se realiza en ese mismo objeto, sino que se delega en otro objeto diferente
(objeto oyente). Este modelo se basa en la posibilidad de propagacin o envo de eventos
desde el objeto fuente donde se producen a los objetos oyentes que los gestionan. La forma de
hacerlo es la siguiente:
o El objeto fuente registra qu objetos oyentes estn interesados en recibir algn evento
especfico, para comunicrselo una vez ste se produzca.
o Cuando ocurre el evento, el objeto fuente se lo comunica a todos los oyentes registrados.
o La comunicacin entre la fuente y el oyente se realiza mediante la invocacin de un
mtodo del oyente, proporcionado como parmetro el evento generado.

Un evento es un objeto en el que se encapsula toda la informacin sobre la
interaccin del usuario con los componentes de la interfaz grfica. Por tanto, cuando un
oyente recibe un evento dispone de toda la informacin asociada a dicha interaccin. Existe una
jerarqua de clases de eventos, en las que cada tipo de evento se representa mediante una clase
diferente.

Esta separacin entre fuente y oyente facilita la creacin de cdigo robusto para la gestin de
eventos. Adems, esto permite una separacin clara entre el cdigo propio de la aplicacin
(modelo), el cdigo que genera la interfaz (vista) y el cdigo que gestiona la interfaz
(controlador).



Grfico 25. Modelo de delegacin de eventos


Es de hacer notar, que este modelo de tratamiento de eventos es simple pero muy verstil y fcil
de ampliar, ya que un objeto fuente puede tener registrados varios oyentes y un mismo oyente
puede estar registrado en varios objetos fuente.

Se pasa el EVENTO
a los oyentes
ACCIN DEL
USUARIO
COMPONENTE
(VISTA)


Objeto Fuente
LISTENER
(CONTROLADOR)

Procesa el evento
LISTENER 2
(CONTROLADOR)

Procesa el evento
Se pasa el EVENTO
a los oyentes
Curso de J ava Standard Edition J 2SE 131

4 4. .2 2. . E EV VE EN NT TO OS S, , O OB BJ J E ET TO OS S F FU UE EN NT TE E Y Y O OB BJ J E ET TO OS S O OY YE EN NT TE E

En funcin de la interaccin concreta que realice el usuario y dependiendo de qu tipo de
componente grfico est implicado se producirn uno o varios eventos. Dicho componente es el
objeto fuente en el que se crea un evento de la clase correspondiente, que se transmite al
oyente u oyentes que lo gestionan. Para poder gestionar el registro y eliminacin de objetos
oyentes (Listeners) de cada evento concreto se proporcionan tres mtodos:

o void set<TipoEvento>Listerner(Listener obj): establece un objeto oyente para el
TipoEvento.
o void add<TipoEvento>Listener(Listener obj): aade el objeto a la lista de oyentes.
o void remove<TipoEvento>Listener(Listener obj): elimina el objeto oyente
correspondiente.

Los eventos estn representados en una jerarqua de clases cuya raz es la clase
java.util.EventObject. Esta clase tiene como nico atributo el objeto en el que se ha generado
el evento y proporciona el mtodo Object getSorce(), para acceder a l. El resto de las clases
que la especializan representan tipos de eventos concretos y encapsulan toda la informacin
necesaria para dar respuesta a ese tipo de interaccin (por ejemplo, qu botn del ratn se ha
presionado, el instante y la posicin donde se ha producido, si se tena presionado alguna trecla
modificadora tal como Ctrl. O AltGr, etc.). Esta informacin se obtiene mediante los mtodos de
acceso correspondientes get<Atributo>().

Un objeto oyente o Listener aquel que gestiona, maneja o responde a un evento. Con este
propsito define uno o varios mtodos que sern ejecutados automticamente por la fuente de
eventos en respuesta a cada tipo de evento especfico. En esta llamada automtica al mtodo
correspondiente del oyente se pasa como argumento un objeto de la clase de evento generada.

En el tratamiento o gestin de eventos hay que seguir tres pasos:


Crear una clase oyente del tipo de eventos que implemente la interfaz J ava
correspondiente.

Implementar en la clase oyente el mtodo o mtodos de la interfaz J ava
correspondiente.

Crear un objeto de la clase oyente y registrarlo como Listener de uno o ms
componentes grficos en los que se desea proporcionar esa interaccin con el usuario.

Ejemplo: A continuacin se presenta un ejemplo sencillo en el que se crea una aplicacin con
una interfaz grfica para ilustrar la gestin de eventos.

La interfaz grfica de la aplicacin consta de una ventana principal en la que se presenta una
etiqueta y dos botones. La etiqueta y los botones se agrupan aadindolos a un panel
contenedor que despus se aade al panel de contenido de la ventana principal.

En la aplicacin se incluye una clase interna que acta como oyente de eventos de tipo accin
(ActionListener) para gestionar las interacciones con los botones. En esta clase, como respuesta
a la pulsacin por parte del usuario, el programa modifica el texto de la etiqueta indicando el
botn que ha pulsado. Ntese que se registra el mismo objeto oyente en dos objetos fuente
diferentes (los dos botones). Una clase interna es muy adecuada, ya que tenemos acceso
a todos los elementos de la clase en la que est definida (en este caso la etiqueta).
package interfacesGraficas;
Curso de J ava Standard Edition J 2SE 132

import java.awt.event.*;
import javax.swing.*;

public class EjemploEventos extends J Frame {
/ / Componentes de la ventana
J Label etiqueta;
J Button botonHola;
J Button botonAdios;
J Panel panel;

public EjemploEventos() {
/ / Se crean los componentes de la ventana
etiqueta = new J Label("Etiqueta inicial");
botonHola = new J Button("Hola");
botonAdios = new J Button("Adios");
panel = new J Panel();
/ / Se aaden los componentes al panel
panel.add(etiqueta);
panel.add(botonHola);
panel.add(botonAdios);
/ / Aade el panel a la venta principal
getContentPane().add(panel);
/ / Se crea un objeto oyente de accin que se registra en los dos botones
OyenteAccion oyenteBoton = new OyenteAccion();
botonHola.addActionListener(oyenteBoton);
botonAdios.addActionListener(oyenteBoton);
}
public static void main(String[] args) {
EjemploEventos ventana = new EjemploEventos();
ventana.setTitle("Ejemplo simple de Eventos");
ventana.setSize(350, 70);
ventana.setVisible(true);
}
/**
* CLASE INTERNA: Se crea la Clase Oyente de Eventos de accin (ActionListener)
*/
class OyenteAccion implements ActionListener {
public void actionPerformed(ActionEvent evento) {
// Se obtiene el botn fuente del evento
J Button boton = (J Button) evento.getSource();
// Tratamiento del evento
if (boton.getText().equalsIgnoreCase("Hola"))
etiqueta.setText("Se ha presionado el botn HOLA");
else if (boton.getText().equalsIgnoreCase("Adios"))
etiqueta.setText("Se ha presionado el botn ADIOS");
}
}

}

Grfico 26. Ejemplo de manejo de eventos

Curso de J ava Standard Edition J 2SE 133


4 4. .3 3. . J J E ER RA AR RQ QU U A A Y Y T TI I P PO OS S D DE E E EV VE EN NT TO OS S

Como se ha mencionado previamente, los eventos se organizan en una jerarqua de clases,
donde cada clase representa un tipo de evento o un grupo de eventos relacionados, cuya raz es
java.util.EventObject. Esta clase deriva de la clase java.awt.AWTEvent para tener en
cuenta los eventos generados por los componentes grficos.

En el paquete java.awt.event se encuentran la mayora de las definiciones de clases e
interfaces necesarias para la gestin de eventos generados en una interfaz grfica sencilla. Con
la aparicin de Swing este paquete se ha visto complementado por javax.swing.event, donde
se representan los eventos propios de las nuevas caractersticas propias de Swing.

Conceptualmente los eventos generados en los componentes grficos se pueden clasificar en:
o Eventos de bajo nivel: stos estn relacionados con los aspectos fsicos de la
interaccin con los elementos de la interfaz. Representan las modificaciones en el sistema
de ventanas (por ejemplo cambio de tamao, cambio de posicin, obtencin o prdida del
foco) o las entradas producidas por el usuario (con el teclado o ratn).
o Eventos semnticos (o de alto nivel): representan la operacin con un elemento de la
interfaz. Se denominan semnticos porque tratan de capturar el significado de la
interaccin, por ejemplo seleccionar un elemento. No estn relacionados con una clase
especfica de componente, siendo aplicables a todos los componentes que implementen
un modelo de operacin similar. No obstante, estos componentes no tienen que generar
dicho evento de la misma forma, por ejemplo, el evento ActionEvent se genera cuando
se hace clic sobre un botn o cuando se pulsa la tecla Intro en un campo de texto.

EVENTOS DE BAJ O NI VEL
EVENTO DESCRI PCIN
ComponentEvent Cambios en el tamao, posicin o visibilidad de un componente
FocusEvent
Cambio de foco (capacidad de un componente para recibir entradas
desde el teclado)
KeyEvent Operacin con el teclado
MouseEvent Operacin con los botones del ratn o movimientos del ratn
WindowEvent Cambio de estado en una ventana
AncestorEvent
Cambio en la composicin, visibilidad o posicin de un elemento
superior (ancestro) de la jerarqua de composicin
EVENTOS DE ALTO NI VEL
EVENTO DESCRI PCIN
ActionEvent Realizacin de una accin especfica asociada al componente
ChangeEvent Cambio de estado del componente
ItemEvent Elemento seleccionado o deseleccionado
CaretEvent
Cambio en la posicin del cursor de insercin en un componente que
gestiona texto
ListSelectionEvent Cambio en la seleccin actual en una lista


Curso de J ava Standard Edition J 2SE 134
4 4. .4 4. . C CL LA AS SE ES S O OY YE EN NT TE ES S D DE E E EV VE EN NT TO OS S ( (L LI I S ST TE EN NE ER RS S) )

Un Listener es el objeto que es notificado siempre que se genera un evento. Tiene dos
requerimientos principales: el listener debe ser registrado con una o ms fuentes para recibir
notificaciones cuando un evento especfico se genere, y tambin debe implementar mtodos para
recibir y procesar estas notificaciones.

Como se explico anteriormente, el modelo de delegacin de eventos tiene dos partes: los objetos
fuente y los listeners. Los listeners se crean implementando una o ms de las interfaces definidas
por el paquete java.awt.event. Cuando ocurre un evento, el fuente invoca al mtodo apropiado
definido por el listener y le proporciona el objeto evento como su parmetro. A continuacin se
listan algunos de los Listeners ms importantes:

LISTENER DESCRIPCIN MTODOS
ActionListener
Define un mtodo para recibir
eventos de accin
void actionPerformed(ActionEvent)
FocusListener
Define dos mtodos para
reconocer instancias cuando un
componente adquiere o pierde el
control del teclado (Foco)
void focusGained(FocusEvent)
void focusLost(FocusEvent)
KeyListener
Define tres mtodos para
reconocer cundo se presiona,
libera o golpea una tecla
void keyPressed(KeyEvent)
void keyReleased(KeyEvent)
void keyTyped(KeyEvent)
MouseListener
Define siete mtodos para
identificar instancias cuando el
ratn hace clic, entra a un
componente, sale del
componente, presiona o liber
void mouseClicked(MouseEvent)
void mouseEntered(MouseEvent)
void mouseExited(MouseEvent)
void mousePressed(MouseEvent)
void mouseReleased(MouseEvent)
MouseMotionListener
Define 2 mtodos para cuando
se arrastra o se mueve el ratn
void mouseDragged(MouseEvent)
void mouseMoved(MouseEvent)
TextListener
Define un mtodo de identificar
cambios en los valores de texto
void textChanged(TextEvent)
WindowListener
Define siete mtodos para
identificar instancias cuando una
ventana se activa, se cierra, se
restaura, se minimiza (iconiza),
se abre o se sale de ella
void windowActivated(WindowEvent)
void windowClosed(WindowEvent)
void windowDeactivated(WindowEvent)
void windowDeiconfied(WindowEvent)
void windowInconfied(WindowEvent)
void windowOpened(WindowEvent)
void windowClosing(WindowEvent)

4 4. .5 5. . C CL LA AS SE ES S A AD DA AP PT TA AD DO OR RA AS S D DE E E EV VE EN NT TO OS S

La mayora de la interfaces oyentes estn diseadas para responder a varios eventos diferentes,
de modo que incluyen ms de un mtodo. Por ejemplo, el oyente de interacciones de ratn
(MouseListener) contiene cinco mtodos relacionados con la operacin de los botones y el
movimiento del mismo; esto provoca que la clase oyente deba implementarlos todos, aunque
slo le interese alguno de ellos, y deje vacos los otros (si no lo hace la clase sera abstracta).


Curso de J ava Standard Edition J 2SE 135
Para simplificar la escritura de Listeners J ava proporciona un conjunto de clases adaptadoras
abstractas, que incluyen las definiciones vacas de los mtodos correspondientes. As un oyente
se puede crear especializando un adaptador e implementando slo el mtodo que interese. En
J ava se incluye una clase adaptadora por cada Listener que tiene ms de un mtodo.

CLASE ADPTADORA INTERFAZ LISTENER
FocusAdapter FocusListener
KeyAdapter KeyListener
MouseAdapter MouseListener
MouseMotionAdapter MouseMotionListener
WindowAdapter WindowListener

package interfacesGraficas;
import java.awt.event.*;
import javax.swing.*;

public class EjemploAdapters extends J Frame {
public J Label etiqueta;
public EjemploAdapters() {
// agregar el componente grfico
etiqueta = new J Label("Eventos:");
getContentPane().add(etiqueta);
/ / Registrar los oyentes de evento
addMouseListener(new MyMouseAdapter(this));
addMouseMotionListener(new yMouseMotionAdapter(this));
}
public static void main(String[] args) {
EjemploAdapters ventana = new EjemploAdapters();
ventana.setTitle("Ejemplo de Clases Adpatadoras");
ventana.setSize(300, 200);
ventana.setVisible(true);
}
}

// Clase adaptadora para eventos de Acciones del Ratn
class MyMouseAdapter extends MouseAdapter {
EjemploAdapters fuente; // Objeto de referencia al fuente
public MyMouseAdapter(EjemploAdapters obj) {
fuente = obj;
}
// Maneja el click del ratn
public void mouseClicked(MouseEvent me) {
fuente.etiqueta.setText("Click del ratn...");
}
}
// Clase adaptadora para eventos de Movimiento del Ratn
class MyMouseMotionAdapter extends MouseMotionAdapter {
EjemploAdapters fuente; // Objeto de referencia al fuente
public MyMouseMotionAdapter(EjemploAdapters obj) {
fuente = obj;
}
// Maneja el arrastre del ratn
public void mouseDragged(MouseEvent me) {
fuente.etiqueta.setText("Ratn arrastrado...");
}
}






Grfico 27. Ejemplo de Clases
Adaptadores de Evento

Curso de J ava Standard Edition J 2SE 136
4 4. .6 6. . E EV VE EN NT TO OS S Y Y C CO OM MP PO ON NE EN NT TE ES S G GR R F FI I C CO OS S

Los distintos componentes grficos de una aplicacin pueden generar o ser fuentes de eventos y
para cada uno de ellos se puede registrar un oyente correspondiente. Un evento que pueda
generar una clase determinada, tambin lo podr generar cualquiera de sus especializaciones o
clases derivadas. Por ejemplo todos los componentes son capaces de generar FocusEvent,
KeyEvent, MouseEvent y MouseMotionEvent, ya que son los eventos generados por la clase
java.awt.Component de la que son especializaciones los componentes grficos.

En la Tabla siguiente se presentan los componentes de uso ms frecuente junto con los eventos
que pueden generar.

EVENTOS QUE PUEDE GENERAR
COMPONENTE
Swing
ActionEvent ItemEvent ChangeEvent CaretEvent ListSelectionEvent
J Button X X X
J CheckBox X X X
J ComboBox X X
J TextField X X
J RadioButton X X X
J List X
J TextArea X X
J MenuItem X X
J TabbedPane X
J ToggleButton X X X
J PasswordField X X
J EditorPane X



Curso de J ava Standard Edition J 2SE 137




1 1. . C CO OM MP PI I L LA AC CI I N N Y Y E EJ J E EC CU UC CI I N N D DE E P PR RO OG GR RM MA AS S J J A AV VA A ( (J J A AV VA AC C/ / J J A AV VA A) )

Para crear un programa fuente de J ava se puede utilizar cualquier editor de texto, como Bloc de
Notas. Una vez copiado el programa, se guarda el archivo con el mismo nombre de la clase
(respetando maysculas y minsculas) y con extensin .java. Adicionalmente, existen editores
especializados para J ava, tales como J Creator, Eclipse, NetBeans, etc., que proporcionan un IDE que
facilita el proceso de creacin de programas J ava.

Se procede entonces a compilar el programa copiado usando el comando javac. Este comando
genera el cdigo binario del programa en un archivo con el mismo nombre del programa copiado
pero con extensin .class. La sintaxis del comando es la que sigue:

javac NombreCompletoDeLaClase.java

Para ejecutar el programa, simplemente se ejecuta el comando java. Dicho comando despierta a la
J VM y es esta la que se encarga de ejecutar el programa (interpretar su cdigo binario). La sintaxis
del comando es la que sigue:

java NombreCompletoDeLaClase

En la grafica siguiente se describe el proceso de compilacin y ejecucin de programas J ava:



PROGRAMA
FUENTE J AVA
(.J AVA)
RESULTADOS DE LA
EJ ECUCIN
COMPILACI N
(J AVAC)
EJ ECUCIN
(J AVA)
CDIGO BINARIO
(.CLASS)
APNDICE I: Herramientas y Utilidades de desarrollo - BSICAS
Curso de J ava Standard Edition J 2SE 138

1 1. .1 1. . E EJ J E EM MP PL LO O

Paso 1: Haga clic en el men Inicio y seleccione Programas Accesorios Bloc de Notas.

Paso 2: Escriba el siguiente cdigo.

package myPack;

/**
* Ejemplo de un programa J ava simple
* @autor Ronel J . Rivas R.
* @version 1.0, Septiembre de 2005
*/

public class a {

/**
* Este mtodo transforma una cadena a un entero
* @param cad String que representa la cadena a transformar
* @return Un int que representa el valor numrico de la cadena
*/
public static int strToInt(String cad) {
return Integer.parseInt(cad);
}

/**
* Programa Principal
* @param args No utilizado
* @return Nada
*/
public static void main(String[] args) {
int r = 0;

for(int i=0; i<args.length; i++)
r+=strToInt(args[i]);

System.out.println("El resultado es " + r + ".");
}

}

Paso 3: Una vez copiado, haga clic en Guardar en el men Archivo. Guarde el archivo con el
nombre SumarEnteros.java en el directorio Z:\myPack (si no existe el directorio, crelo).

Paso 4: Abra una consola del sistema. Para ello, haga clic en el men Inicio y seleccione Ejecutar.
Aparecer un cuadro de dilogo donde debe escribir cmd. Se abrir una consola del intrprete de
comandos de Windows. Cmbiese al directorio raz (C:\), escribiendo cd\.

Paso 5: Escriba el siguiente comando para compilar el programa: javac SumarEnteros.java

Paso 6: Se ha generado el cdigo binario. Escriba el siguiente comando para ejecutar el programa:
java SumarEnteros 1 2 4 3

La salida podr ser vista en el intrprete de comandos, y ser algo como esto: El resultado es 10
Curso de J ava Standard Edition J 2SE 139

2 2. . E EL L D DO OC CU UM ME EN NT TA AD DO OR R D DE E J J A AV VA A ( (J J A AV VA AD DO OC C) )

J ava soporta tres tipos de comentarios.; los primeros dos son // y /* */, que permiten realizar una
aclaratoria dentro del cdigo del programa. El tercer tipo es denominado comentario de documento,
y comienza con la sucesin de caracteres /** y finaliza con */. Los comentarios de documentacin
le permiten insertar informacin acerca de su programa dentro de l mismo. Entonces, puede utilizar
el programa de utilidad javadoc para extraer sta informacin y ponerla dentro de un archivo HTML.
Los archivos HTML generados por la aplicacin javadoc, son idnticos a la documentacin de la API
de J ava.


2 2. .1 1. . E ET TI I Q QU UE ET TA AS S j ja av va ad do oc c

La utilidad javadoc reconoce las siguienteS etiquetas:

E ET TI I Q QU UE ET TA A S SI I G GN NI I F FI I C CA AD DO O S SI I N NT TA AX XI I S S
@autor Identifica al autor de una clase @autor nombreAutor
@deprecated
Especifica que una clase o miembro est
deprecado
@deprecated descripcion
{@docRoot}
Especifica la ruta para el directorio raz de la
documentacin actual
{@docRoot} ruta
@excepcion Identifica una excepcin lanzada por un mtodos @excepcion Excepcion Explicacin
{@link} Inserta un vnculo en lnea a otro tema
{@link nombre} nombre es el nombre
de la clase o mtodo al que se est
haciendo el hipervnculo
@param Documenta los parmetros de un mtodo @param parmetro Explicacin
@return
Documenta un valor de retorno para un
mtodo
@return Explicacin
@see Especifica un vnculo a otro tema
@see ancla: hipervnculo a un URL
@see pkg.clase#miembro: es un
hipervnculo a un paquete, clase o
miembro
@serial Documenta un campo seriado por omisin @serial descripcion
@serialData
Documenta los datos escritos por los mtodos
writeObject() o writeExternal()
@serialData descripcion
@serialField
Documenta un componente de
ObjectStreamField
@serialField nombre tipo descripcin
@since
Establece actualizaciones en la que se
introdujo un cambio especfico
@since actualizacin
@throws Lo mismo que excepcin @throws Excepcion Explicacin
@version Especifica la versin de una clase @version nmero

Como se puede observar, todas las etiquetas de documentacin comienzan con un signo @. En un
comentario de documentacin, tambin se pueden utilizar otras etiquetas estndar
(<TAG></TAG>) de HTML. Sin embargo, algunas etiquetas tales como un ttulo no pueden ser
empleadas, porque desorganizan la apariencia del archivo HTML producido por javadoc.

Curso de J ava Standard Edition J 2SE 140
Puede utilizar los comentarios de documentacin para documentar clases, interfaces, variables,
constructores y mtodos. En todo caso, los comentarios de documentacin deben preceder
inmediatamente al punto del cdigo que est siendo documentado.

Las siguientes son algunas sugerencias en el orden de las etiquetas de documentacin, a la hora de
documentar su cdigo:
- Clases e interfaces: @see, @author, @since, @serial, @version y @deprecated
- Variables: @see, @since, @serial, @serialfield y @deprecated
- Mtodos y Constructores: @see, @since, @param, @exception, @throws, @return,
@serialData y @deprecated

2 2. .2 2. . F FO OR RM MA A G GE EN NE ER RA AL L D DE E L LO OS S C CO OM ME EN NT TA AR RI I O OS S D DE E D DO OC CU UM ME EN NT TA AC CI I N N

Despus del /** inicial, la primera lnea o lneas llegan a ser la descripcin principal de su clase,
variable o mtodo. Despus de eso, puede incluir uno o ms rtulos @ (Etiquetas). Cada rtulo @
debe arrancar al comienzo de la nueva lnea, o a continuacin de un asterisco (*) que est al
comienzo de la lnea. Mltiples rtulos del mismo tipo deben ser agrupados juntos. Ejemplos de
Comentarios de Documentacin para:

- Clase:
/**
* Esta clase dibuja un grfico de barras
* @autor Ronel J . Rivas R.
* @version 1.0, Septiembre de 2005
*/
public class J Bar {

}

- Variable:
/**
* Nombre del usuario, para ser utilizado en la verificacin de acceso
* @see myPack.Users#password
*/
String userName;

- Mtodo:
/**
* Este mtodo introduce un nmero del usuario por teclado
* @param args Representa la entrada del usuario en forma de cadena
* @exception IOException En error de entrada
* @see IOException
* @return Un int que representa la entrada del usuario como nmero
*/
public int obtenerNumero(String args) throws IOException {

}

2 2. .3 3. . E EJ J E EC CU UT TA AR R E EL L j ja av va ad do oc c

La forma de ejecutar el documentador de java es la siguiente:

javadoc NombreClase.java

You might also like