You are on page 1of 333

Contenido

1. Introduccin a Java
1.1 Historia de Java
1.2 Examinando la Tecnologa de Java
1.2.1 Simple
1.2.2 Orientado a Objetos
1.2.3 Distribuido
1.2.4 Interpretado
1.2.5 Robusto
1.2.6 Seguro
1.2.7 De arquitectura neutral
1.2.8 Porttil
1.2.9 Alto rendimiento
1.2.10 Multitarea
1.2.11 Lenguaje Dinmico
2. Comenzar con Java 2 SDK
2.1 Obtener J2SE 1.4
2.2 Los requerimientos mnimos
2.3 Instalacin del J2SE 1.4
2.4 Variables de ambiente
2.5 Prueba de la instalacin
2.6 Tipos de programas en Java
2.7 Estructura de un programa
2.8 Como se crean aplicaciones Java con SDK
2.9 Como se crean applets Java con SDK
3. Elementos Bsicos del Lenguaje
3.1 Comentarios
3.2 Comentarios de javadoc
3.2.1 Un ejemplo de comentarios javadoc
3.3 Palabras reservadas
3.4 Tipos de variables en Java
3.5 Tipos de datos primitivos
3.5.1 Clases wrapper
3.6 Literales
3.7 Secuencias de escape de caracter
3.8 Inicializacin de variables
3.9 Sentencias y expresiones
3.10 Operadores y operandos
3.10.1 Jerarqua de operadores
3.10.2 Operadores aritmticos
3.10.3 Operadores relacionales
3.10.4 Operadores booleanos
3.10.5 Operadores de manipulacin de bits
3.10.6 Operadores de cadena
3.10.7 Operadores de asignacin
3.10.8 Operadores especiales
3.10.9 Modificadores
3.10.9.1 Modificadores de almacenamiento
3.10.9.2 Modificadores de accesibilidad

4. Control de flujo con Java

4.1 Flujo secuencial


4.1.1 Ejemplos flujo secuencial
4.2 Selectiva simple
4.2.1 La sentencia if
4.2.2 Ejemplos seleccin simple
4.3 Selectiva doble
4.3.1 La sentencia if-else
4.3.2 Ejemplos seleccin doble
4.4 Selectiva mltiple
4.4.1 La sentencia if else-if ... else-if else
4.4.2 Ejemplos seleccin mltiple ( if anidados )
4.5 Ciclo while
4.5.1 La sentencia while
4.5.2 Ejemplos de ciclo while
4.6 Ciclo do-while
4.6.1 La sentencia do-while
4.6.2 Ejemplos ciclo do-while
4.7 Ciclo for
4.7.1 La sentencia for
4.7.2 Ejemplos ciclo for
4.8 Sentencia switch
4.8.1 La sentencia switch
4.8.2 La sentencia switch con default
4.8.3 Ejemplos sentencia switch

5. Trabajo con clases y objetos


5.1 Definicin de clase
5.2 Creacin de objetos
5.2.1 Colector de basura
5.2.2 El mtodo finalice()
5.3 Variables y mtodos
5.4 Mtodos sobrecargados
5.5 Abstraccin y encapsulamiento
5.6 Implementando la herencia
5.6.1 Qu es la herencia?
5.6.2 Mecnica de la herencia
5.6.3 Sobreposicin de mtodos y variables.
5.6.4 Upcasting
5.6.5 Tipos de herencia
5.6.5.1 Herencia para reutilizar la implementacin
5.6.5.2 Herencia por diferencia
5.6.5.3 Herencia por substitucin de tipos
5.7 Composicin
5.8 Clases abstractas
5.9 Polimorfismo
5.9.1 Enlazamiento temprano
5.9.2 Enlazamiento tardo
5.10 Interfaces
5.10.1 Qu es una interfaz?
5.10.2 Creacin de una interfaz
5.10.3 Implementacin de una interfaz
5.10.4 Ejemplo de interfaces mltiples
5.10.5 Agrupacin de constantes en una interfaz

5.10.6 Ejemplo de un sistema robusto de enumeracin

6. Usando arreglos y strings


6.1 Declaracin e inicializacin de arrays
6.1.1 Creacin de arrays
6.1.2 Uso de arrays
6.2 Copia de arreglos
6.3 Arreglo de objetos
6.4 La clase String
6.5 Algunos mtodos de la clase String
6.6 La clase StringBuffer y sus mtodos

7. Manejo de excepciones
7.1 Modelo del manejo de excepciones
7.2 Lanzando excepciones try / catch
7.2.1 Ejemplos de try / catch
7.3 La clusula finally
7.3.1 Ejemplos de finally
7.4 Mtodos que lanzan excepciones
7.4.1 Como arrojar excepciones explcitamente
7.4.2 Ejemplos de mtodos que lanzan excepciones
7.5 Creacin de clases de excepcin personalizadas
7.6 Lectura de un volcado de Stack

8. Flujos
8.1 Qu es un Flujo?
8.2 Los flujos estndar
8.2.1 Algunos ejemplos de flujo estndar
8.3 Los flujos que ofrece java.io
8.4 Flujos de bytes
8.5 Gestin de excepciones de entrada / salida
8.6 Flujos de acceso a archivos
8.7 La clase File
8.7.1 Ejemplos de la clase File
8.8 La clase FileOutputStream
8.9 La clase DataOutputStream
8.10 La clase DataInputStream
8.11 Ejemplo de DataInputStream y DataOutputStream

9. Uso de paquetes
9.1 Qu es un paquete?
9.2 Creacin y uso de paquetes ( package / import )
9.3 Paquetes estndar de Java

9.3.1 Paquete java.lang


9.3.2 Paquete java.util y java.math
9.3.3 Paquete java.io
9.3.4 Paquete java.text
9.3.5 Paquete java.beans
9.3.6 Paquetes para la seguridad
9.3.7 Paquete java.awt
9.3.8 Paquete javax.swing
9.3.9 Paquete java.net
9.3.10 Paquete java.sql y javax.sql
9.4 Creacin de paquetes compactados en archivos .jar
9.4.1 Ejemplo de creacin de un archivo .jar

10. Los applets


10.1
10.2
10.3
10.4
10.5

Construccin de applets
Ciclo de vida de un applet
El tag Applet en HTML
Paso de parmetros a un applet desde HTML
Ejemplos con el mtodo getParameter()

11. AWT, applets y aplicaciones


11.1 El paquete java.awt
11.2 Componentes
11.2.1 Button
11.2.2 CheckBox
11.2.3 CheckboxGroup - Botones de opcin
11.2.4 Choice
11.2.5 Canvas
11.2.6 TextField
11.2.7 TextArea
11.2.8 List
11.2.9 Dialog
11.2.10 FileDialog
11.2.11 ScroollPane
11.2.12 MenuBar
11.2.12.1 Creando un MenuBar
11.2.12.2 Creando un MenuItem
11.2.12.3 Creando un CheckboxMenuItem
11.3 Contenedores
11.3.1 Ejemplos con contenedores
11.4 Layouts
11.4.1 Ejemplos con layouts
11.5 Eventos
11.5.1 Modelo de delegacin de eventos
11.5.2 Categoras de eventos
11.5.3 Implementando mltiples interfaces
11.5.4 Manejo de eventos usando clases internas
11.5.5 Manejo de eventos usando clases internas annimas
11.6 Uso de AWT con applets
11.6.1 Ejemplo de un graficador de funciones

12. Base de datos con Java


12.1 Puentes o controladores
12.1.1 Puente 1, JDBC-ODBC
12.1.2 Puente 2, Java Nativo
12.1.3 Puente 3, 100% Java / Protocolo nativo
12.1.4 Puente 4, 100% Java / Protocolo independiente
12.1.5 Ejemplo JDBC-ODBC con AWT y Access
12.2 El API JDBC
12.2.1 Funcionamiento de un programa de Java con JDBC
12.2.2 Identificar el origen de datos
12.2.3 Crear un objeto Connection
12.2.4 Crear un objeto Statement
12.2.4.1 Objeto Statement - mtodo executeUpdate()
12.2.4.2 Objeto Statement - mtodo executeQuery()
12.2.5 Liberar objetos ResultSet, Statement y Connection
12.2.6 Uso de un archivo de propiedades
12.2.7 Uso de PreparedStatement

13. Aplicaciones Web con tecnologa Java


13.1 Tcnologas para generar pginas dinmicas
13.1.1 Qu es un Servlet?
13.1.2 Qu es JSP?
13.1.3 JSP o Servlets?
13.1.4 Aplicaciones de bases de datos con JDBC.
13.1.5 Ejemplo JDBC con JSP
13.2 Servidores Web con Soporte para JSP'S
13.2.1 Apache Tomcat.
13.2.1.1 Obtener el Apache-Tomcat (para plataforma Windows ).
13.2.1.2 Instalacin y configuracin de Tomcat
13.2.1.3 Configurar las variables de ambiente para Apache-Tomcat
13.2.1.4 Arrancar el servidor Tomcat 4.1
13.2.1.5 Parar el servidor Tomcat 4.1
12.2.1.6 Arranque automtico del servidor Tomcat ( para Windows )
13.3 La Tecnologa JSP
13.3.1 Arquitectura JSP.
13.3.2 Incorporar contenido Java en una pgina HTML.
13.3.2.1 Declaraciones.
13.3.2.2 Expresiones.
13.3.2.3 Scriptlets.
13.3.3 Directivas.
13.3.3.1 Directiva page.
13.3.3.2 Directiva include.
13.3.4 Objetos implcitos.
13.3.4.1 Objeto page.
13.3.4.2 Objeto config.
13.3.4.3 Objeto request.
13.3.4.4 Objeto sesin.
13.3.4.5 Objeto application.
13.3.5 Uso de JavaBeans con JSP
13.3.5.1 Qu es un JavaBean?
13.3.5.2 Acceder a las propiedades de un JavaBean.

13.3.5.3 Establecer la propiedades de un JavaBean.


13.4 La Tecnologa JDBC
13.4.1 El API JDBC
13.4.2 Tipos de controladores.
13.4.3 Desarrollo de aplicaciones con el API JDBC.
13.4.3.1 Cargar el controlador JDBC.
13.4.3.2 Establecer una conexin.
13.4.3.3 Enviar consultas.
13.4.3.4 Procesar los resultados.
13.4.3.5 Cerrar la Conexin.

14. Utileras de Java.


14.1 La clase Vector y la interfaz Enumeration.
14.2 La clase Stack.

Apndices

o
o
o
o
o
o
o
o
o
o
o
o
o
o

Apndice A. Base de Datos MySQL


Uso de un JDBC - caso concreto MySQL.
Cambio de contrasea.
Arrancando el servidor de MySQL
Usando MySQL con comandos en lnea.
Creacin de bases de datos en MySQL
El comando CREATE
Uso de una base de datos
El comando DROP
Salir del monitor de mysql
Creacin de Bases de Datos utilizando el comando mysqladmin.
Borrar bases de datos utilizando el comando mysqladmin
Creacin de Tablas
Poblando la tabla
Creando una consulta con SELECT

1. Introduccin a Java
El lenguaje de programacin Java es un poderoso y completo lenguaje de programacin
orientado a objetos desarrollado a principios de los aos 90 en Estados Unidos por Sun Soft Inc.,
una subsidiaria de la empresa fabricante de equipo de cmputo denominada Sun Microsystems,
Inc.
Los diseadores de Java tuvieron en mente crear " un lenguaje de programacin sencillo,
orientado a objetos, distribuido, interpretado, robusto, seguro, de arquitectura neutral, porttil,
de gran rendimiento, multitarea y dinmico ".
Java es un conjunto de objetos y herramientas que se utilizan con una sintaxis muy similar a la
del lenguaje C y C++ y que permiten utilizar los mismos cdigos fuente de programacin
distribuyndolos a travs de las redes de cmputo, operando de forma tal que son neutrales o
independientes a las diferentes arquitecturas de computadoras gracias a la implementacin del
concepto de mquina virtual, y que hay una para cada plataformas y sistemas
1.1 Historia de Java
En enero de 1991 la empresa Sun Microsystems comenz un proyecto con el nombre de Green.
El prposito del proyecto Green era descubrir un modo de controlar consolas de televisin, esas
cajas para acceder a la televisin por cable. Como el hardware de los dispositivos para el
consumidor siempre estaba cambiando, James Gosling, el "padre" de Java, pens que C++ no
era lo ms apropiado para dicho trabajo. Como resultado, se cre el lenguaje llamado Oak en
honor a un roble que se vea desde la ventana de su oficina. Este lenguaje era menos suceptible
a errores y no bloqueaba todo el sistema. Se ejecutaba inicialmente en un dispositivo de
tecnologa Hammer llamado *7 (star 7). Haciendo piruetas por toda la pantalla tctil estaba ese
pequeo personaje digital llamado Duke, un asistente que poda aparecer y realizar varias tareas
y que ms tarde se convertira en la mascota de Java.
Oak se us para solicitar un proyecto sobre un sistema operativo para consolas de televisn. La
solicitud no prosper y Sun rechaz una oferta de compra de Trip Hawkins ( que era el jefe
oficial ejecutivo de Gamemaker / 3DO), de modo que Sun tena ese desecho y no saba que
hacer con l. Por suerte, la revolucin de Internet haba comenzado con el lanzamiento de
Mosaic, el predecesor del navegador Web Netscape Navigator. En 1994 se le busca una nueva
utilidad a Oak para la Web y se crea el navegador llamado WebRunner ( anteriormente
renombrado HotJava) para exhibir la reciente tecnologa de lo que terminara convirtindose en
Java.
Por cierto , Oak se le cambio el nombre a Java , porque ya exista un lenguaje de programacin
denominado Oak, entonces , en una junta de emergencia donde se tenia que decidir un nuevo
nombre, y en esa junta estaban tomando caf - en algunas partes de EUA se denomina Java a
un caf de buena calidad - , entonces James Gosling y sus colegas decidieron darle ese nombre.
Para hacer pblico el lenguaje, en la conferencia SunWorld, John Gage de Sun y Marc Andreesen
de Nescape presentaron Java al mundo. Nestcape se comprometi a incorporar Java en la
siguiente versin de su navegador y al final del ao empresas como IBM, Oracle, Borland, Adobe,
Macromedia, Lotus, Spyglass e Intuit haban incorporando Java a sus productos. Incluso
Microsoft autoriz Java, comprometindose a incorporar Java a sus productos, sistemas
operativos y herramientas de desarrollo.
La versin original de Java era tan pequea que caba en un disquete. El intrprete del ncleo
tena casi 100 Kb. La biblioteca matemtica sumaba otros 20 Kb. El cdigo para la integracin
con bibliotecas C eran otros 50 Kb. La mayora de las bibliotecas de clase caban en 375 Kb,
dejando slo las bibliotecas de grficos especficas de plataforma que variaban en tamao. En
conjunto Java solamente tena alrrededor de 1 Mb de ROM y 1 Mb de RAM.

1.2 Examinando la Tecnologa de Java


De acuerdo con los objetivos del diseo de los creadores de Java este cumple con ser " un
lenguaje de programacin sencillo, orientado a objetos, distribuido, interpretado, robusto,
seguro, de arquitectura neutral, porttil, de gran rendimiento, multitarea y dinmico ".
De acuerdo a stos objetivos, podemos ver lo que tenan en mente sus creadores, y que en la
actualidad pueden an aplicarse.

1.2.1 Simple
Java es simple porque elimina la complejidad de los lenguajes de programacin como el C y el
C++.
Java incorpora nuevas caractersticas como un recolector automtico de elementos no
utilizados y elimina aspectos confusos y poco utilizados del C++ como la sobrecarga de
operadores. Tambin por supuesto, elimina el manejo difcil y complejo de los apuntadores y su
aritmtica de apuntadores.
Incorpora un conjunto de caractersticas ya utilizadas en la historia de los lenguajes de
programacin como son:

Las clases que vienen de C++ y SmallTalk pero limitadas a herencia simple.

Las interfaces que proceden de Objetive-C y proporcionan a Java herencia mltiple de


interfaces.

Los paquetes de clases viene de Modula

La concurrencia y la multitarea que estaban ya en varios lenguajes, Java lo incorpora.

El control de excepciones del Modula-3

Vnculos dinmicos y la recogida automtica de elementos no utilizados proviene del Lisp

1.2.2 Orientado a Objetos


Java es un lenguaje Orientado a Objetos porque ste paradigma de la programacin es una
forma de desarrollar software describiendo los problemas mediante el uso de elementos u
objetos de el espacio del problema y no mediante un conjunto de pasos secuenciales que se
ejecutan en la computadora. Un buen diseo Orientado a Objetos produce componentes
reutilizables , extensibles y sostenibles.
Estos componentes de software son lo bastante flexibles para controlar los cambios que se
puedan producir en el ambiente a lo largo del tiempo, porque su trabajo principal es el de
intercambiar mensajes entre s.
Los API Core de Java son una coleccin de stos componentes , previamente creados,
denominados bibliotecas de clases. El programador no necesita crear todo de nuevo,
simplemente utiliza stas bibliotecas estndar que han ido evolucionando a lo largo del tiempo,
obteniendo mas componentes con una nueva versin o liberacin de Java.

1.2.3 Distribuido
Java es distribuido porque adems de que puede acceder a objetos distribuidos en distintas
computadoras u equipos mediante protocolos estndar basados en TCP/IP como HTTP, con las
ltimas versiones de Java, se pueden invocar mtodos en un equipo remoto tan fcil e
invisiblemente como podra hacerse en su mismo equipo o espacio de ejecucin mediante
protocolos comunes como CORBA (que es una arquitectura intermediaria para solicitar objetos
comunes) y RMI (que son invocaciones a mtodos remotos), adems de los recin incorporados
servicios Web.

Para cada protocolo de comunicacin, Java se encarga de toda la conversin y transporte de


manera automtica.
1.2.4 Interpretado
Java es un lenguaje interpretado, porque sus cdigos de programas fuente en lugar de ser
compilados y traducidos en ejecutables nativos, son traducidos en cdigos de bytes (byte code)
no asociados a una plataforma especfica.
Este byte code es transferido a cualquier plataforma que tenga Java Runtime Environment (JRE),
y que consiste en una Mquina Virtual de Java (JVM) y de ste modo pueden ejecutarse sin
volver a compilarlos (Compile una vez y Ejectelo n veces).
Puede pensarse que Java es lento, sin embargo los cdigos neutrales de bytes contienen
informacin adicional que puede utilizarse para optimizar la ejecucin en tiempo de ejecucin,
segn decisiones que no pueden realizarse en tiempo de compilacin

1.2.5 Robusto
La robustez es la fiabilidad de un programa. Java es fiable o robusto porque incorpora las
siguientes caractersticas:
Es un lenguaje "tipeado" o basado en tipos. El compilador y cargador de clases aseguran la
correccin de todas las llamadas de mtodo, lo que evita las diferencias implcitas entre tipos y
las incompatibilidades entre versiones.
No tiene apuntadores o punteros. En Java hay referencias en lugar de apuntadores, y no se
pueden mover una referencia para manipular directamente espacios de memoria. Esto evita que
la memoria se corrompe accidentalmente , como por ejemplo pasarse el final de una pila, etc.
Java tiene un colector automtico de basura (garbage collector). Los programadores pueden
olvidarse de liberar memoria y con Java ya no tienen que preocuparse por decidir las partes de
memoria que deben liberarse ya que el colector lo hace automticamente.
En Java se fomenta el uso de interfaces en lugar de clases. Las interfaces definen un conjunto de
comportamientos (mtodos). En lugar de pasar clases, se pasan interfaces, ocultando as las
implementaciones. Si la implementacin cambia como sucede a menudo, y no se tiene la nueva
clase que implementa la vieja interfaz, todo lo dems funcionar perfectamente.

1.2.6 Seguro
El sistema de Java tiene ciertas polticas que evitan se puedan codificar virus con este lenguaje.
Existen muchas restricciones, especialmente para los applets, que limitan lo que se puede y no
puede hacer con los recursos crticos de una computadora y poner los sistemas en riesgo.
Java no permite el manejo de apuntadores, y evita que un programa malicioso corrompa los
espacios de memoria.
En cuanto a la ejecucin de programas Java integra funciones de seguridad: el verificador de
cdigo de bit, el cargador de clases y el gestor de seguridad. Esto garantiza que el cdigo no
seguro realice operaciones seguras, como leer el disco duro. Otro aspecto de la seguridad
recientemente incorporado a Java tiene que ver con la autentificacin, autorizacin y encriptacin
para proteger la privacidad y asegurar la integridad de los datos.

1.2.7 De arquitectura neutral


Para establecer Java como parte integral de la Word Wide Web, el compilador Java compila su
cdigo a un archivo objeto de formato independiente de la arquitectura de la mquina en que se
ejecutar. Cualquier mquina que tenga el sistema de ejecucin (JRE) puede ejecutar ese cdigo
objeto, sin importar en modo alguno la mquina en que ha sido generado. Actualmente existen
sistemas run-time para Solaris 2.x, SunOs 4.1.x, Windows 95, Windows NT, Linux, Irix, Aix, Mac,
Apple y ya hay grupos de desarrollo trabajando en la portabilidad a otras plataformas.
Si una compaa desarrolla nuevo hardware, no tiene que desechar sus inversiones en software,
sino que slo debe colocar un JRE en la nueva plataforma. Tambin si una empresa desarrolla
hardware completamente nuevo o un nuevo sistema operativo, no tienen que comenzar desde
cero sin ningn software para el producto, con tan solo agregar el JRE, a la plataforma recin
diseada puede ejecutar todos los programas de Java existentes.
1.2.8 Porttil
Como el cdigo compilado de Java (conocido como byte code) o que es un cdigo de bytes de
plataforma neutral, es interpretado, y un programa compilado de Java puede ser utilizado por
cualquier computadora que tenga implementado el interprete de Java ( JRE ). Esto ltimo hace
honor a la promesa de sus desarrolladores sintetizado en las frases " Escribir una vez, Ejecutarse
en cualquier sitio" (EE).
De esta manera, es posible confiarse en que todas las implementaciones numricas en tamao ,
orden de byte y manipulacin son generales o neutrales, y estas estn definidas en la
documentacin de Java en ( http://java.sun.com/docs/books/jls/ ) Language Specification.

1.2.9 Alto rendimiento


Puede suponerse que un cdigo interpretado y de alto rendimiento es una contradiccin. No
obstante, los cdigos de bytes de la plataforma neutral realmente pueden convertirse en tiempo
de ejecucin en cdigo de mquina especfico de la CPU, ejecutndose casi tan rpidamente ( es
posible que mas ) como cdigo compilado nativo de C y C++.
En adicin a esto hay dos herramientas de traduccin incluidas en Java que lo hacen
automticamente: La herramienta de 1ra. generacin recibe el nombre de compilador justo a
tiempo ( just in time ) (JIT). La otra. herramienta de 2da. generacin de Sun se denomina
HotSpot y el compilador JIT hacen lo mismo: Traducir en tiempo de ejecucin al conjunto de
instrucciones nativas. Sin embargo , HotSpot tambin supervisa el cdigo mientras se ejecuta y
optimiza la velocidad en los bloques ms frecuentemente ejecutados, en lugar de en todo el
cdigo.
1.2.10 Multitarea
Java es un lenguaje que soporta multiples threads ( hilos , procesos, tareas ) , esto es, Java es
un lenguaje que puede ejecutar diferentes lneas de cdigo al mismo tiempo.
Los programas multitarea comparten memoria y deben tener comunicacin entre los
subprocesos. Java tiene bibliotecas estndar con muchos recursos para ayudar al programador
en este proceso de comunicacin , asegurando la seguridad de los subprocesos.
1.2.11 Lenguaje Dinmico
Java es un lenguaje dinmico porque continuamente esta evolucionando, esto es, sus bibliotecas
de clases e interfaces estn cambiando, y mejorando continuamente .

10

Podra pensarse que los programas que hacen uso de ellas ya no funcionaran, pero no es as.
Los primeros cdigos de bytes de plataforma neutral seguirn funcionando despus de que
aparezcan nuevas bibliotecas, ya sea porque Sun presente una nueva versin de Java o porque
alguna otra compaa cree alguna biblioteca.
Mientras las partes de la biblioteca empleadas no desaparezcan, los programas seguirn
funcionando, incluso aunque se agreguen nuevos elementos a las bibliotecas. Adems gracias a
la preferencia de Java por las interfaces sobre las clases, como se mencion en la caracterstica
de robustez.
2. Comenzar con Java 2 SDK
Objetivo: El participante obtendr el software gratuito (freeware) Java 2 SDK, SE del sitio
de Sunsoft , transferir los archivos necesarios, los instalar y comprobar su instalacin
ejecutando un pequeo programa de Java. Conocer que en el lenguaje de programacin
con Java existen varios tipos de programas, su estructura y su creacin con las herramientas
SDK.
2.1 Obtener J2SE 1.4
Cmo obtener el Java SDK (SoftwareDevelopment Kit ) de la distribucin J2SE (
Java 2 Standar Edition)?
Aqu vamos a ver como podemos obtener el software de las herramientas de desarrollo de Java,
siguiendo unos pasos sencillos. La versin 1.4.X_XX de SDK (Kit de Desarrollo de Java) esta
disponible actualmente para las siguientes plataformas:

Windows
Linux
Solaris

Descargue el SDK para stas plataformas del sitio Web de Sun, en la siguiente direccin
http://java.sun.com
En esta otra direccin podrs bajarte la ltima versin del SDK:
http://java.sun.com/j2se/1.4.1/download.html
Elegir la versin ms actual del SDK 1.4.X_XX. Peridicamente, Sun publica reparaciones de
fallas que agregan un nuevo dgito al nmero, como cuando a Java 1.1 le sigue 1.1.1, 1.1.2,
1.2.0, 1.3.0, 1.4.0, 1.4.1_01, etctera. Obtener la versin ms reciente del SDK 1.4.1 disponible
para su plataforma.
2.2 Los requerimientos mnimos del J2SE1.4.1
Un microprocesador de 166 Mhz o mas rpido con por lo menos 32 megabytes de memoria RAM
que es requerida para ejecutar las aplicaciones basadas en grficos. Cuarenta y ocho megabytes
de RAM para ejecutar los applets dentro de un navegador usando el producto plug-in de Java.
Ejecutarlo con menos memoria puede causar swapping de disco lo cual afecta severamente el
desempeo. Programas muy grandes pueden requerir mas RAM para un desempeo adecuado.
Se recomienda tener 120 megabytes de espacio libre en disco antes de intentar instalar el
software de Java 2 SDK.
El SDK es un conjunto de herramientas y utileras que en resumen son:

javac El compilador Java por excelencia, un compilador de lnea de comandos, que te


permitir crear tus programas y applets en Java.

appletviewer Un visualizador de Applets para no tener que cargarlos en un navegador.

11

java El intrprete que te permitir ejecutar tus aplicaciones creadas en Java.


javadoc El documentador de Java
jdb El depurador de Java
javap Un descompilador que te permite ver el contenido de las clases compiladas.

2.2 Los requerimientos mnimos del J2SE1.4.1


Un microprocesador de 166 Mhz o mas rpido con por lo menos 32 megabytes de memoria RAM
que es requerida para ejecutar las aplicaciones basadas en grficos. Cuarenta y ocho megabytes
de RAM para ejecutar los applets dentro de un navegador usando el producto plug-in de Java.
Ejecutarlo con menos memoria puede causar swapping de disco lo cual afecta severamente el
desempeo. Programas muy grandes pueden requerir ms RAM para un desempeo adecuado.
Se recomienda tener 120 megabytes de espacio libre en disco antes de intentar instalar el
software de Java 2 SDK
El SDK es un conjunto de herramientas y utileras que en resumen son:

javac El compilador Java por excelencia, un compilador de lnea de comandos, que te


permitir crear tus programas y applets en Java.

appletviewer Un visualizador de Applets para no tener que cargarlos en un navegador.

java El intrprete que te permitir ejecutar tus aplicaciones creadas en Java.

javadoc El documentador de Java

jdb El depurador de Java

javap Un descompilador que te permite ver el contenido de las clases compiladas.

2.3 Instalacin de J2SE1.4.1


En las plataformas de Microsoft Windows 98 (1rao 2da edicin), NT 4.0 ( con Service Pack 5 o
posterior), ME, XP, y 2000 ( conService Pack 2 o posterior), para ejecutarse en un hardware de
Intel ocompatible.
Asegurarsede que en su sistema no haya otras herramientas de desarrollo de JavaInstaladas.

ParaInstalar el Java 2 SDK en Windows haga doble clic en el archivo de instalacino usar el
comando Start | Run (Inicio | Ejecutar) del men de inicio de Windowspara encontrar y ejecutar
el archivo. Esimportante que instale todo el SDK ,tanto programas como documentacin desdela

12

carpeta ( directorio ) raz , C:\ u otra unidad como la D:\ o laE:\ . Al terminar lainstalacin el
rbol de carpetas y subcarpetas se ver similar a lo siguiente(ver figura 1)
Enel cuadro de dilogo que le pregunta si desea instalar el SDK, SE 1.4.1_02, sedespliega el
Asistente de configuracindel SDK (ver figura 2) .
Elasistente instalar tres componentes del SDK:
Archivos de programa Son losprogramas ejecutables necesarios para crear, compilar y verificar
el funcionamiento de sus proyectos deJava.
Archivosde biblioteca y encabezados Archivos usados nicamente por los programadoresque
hacen llamadas a cdigo nativo desde programas de Java.
Archivos de demostracin Son programasde Java 2, con versiones que puedeejecutar y
archivos fuente que puede examinar para aprender ms acerca dellenguaje.
Bibliotecas de clases o API's (Application Program Interface) .Que son las librerias de clases
llamadas paquetes creadas por losdesarrolladores del software de Java de la empresa Sun
Despusde haber instalado SDK, notar que hay varios archivos instalados en elsubdirectorio
\J2SDK141\lib la mayora conextensin.jar. Aunqueson archivos .jar, no debe descomprimirlos.
El SDK puede leer los archivos .jar en su formato de archivo eneste directorio.

Tu puedes escoger la unidad destino donde seva a instalar el software de Java 2 SDK SE
dndole clic al botn Browse... Eneste caso se seleccion la unidad E: y tambin puedes
cambiarle el nombre a lacarpeta destino, en lugar de poner el nombre que propone el instalador
que es; j2sdk1.4.1_02 le puedes poner otro, por ejemplo yo le puse j2sdk141 y es poreso que
en la figura 1 el rbol de carpetas y subcarpetas de la unidad E: muestra que el directorio para la
variable de ambienteJAVA_HOMEes E:\J2SDK141

13

2.4Configuracin de las variables de ambiente para el J2SE.


Son dos variables de ambiente del sistemaoperativo Windows que tienen que ser configuradas,
estas sonPATHyCLASSPATH.
Configuracin de la variablede ambientePATH.
La variable de ambientePATHindica al sistema operativo donde se ubican o seencuentran los
programas ejecutables del kit de herramientas del Java 2 SDK , enla documentacin indica que
debe apuntar a la carpetabin, quees donde se alojan los archivos ejecutables, as por ejemplo si
instalaste elJava en el disco duro E: se tiene que poner:
SET PATH = E:\J2SDK141\bin
Entonces el sistema operativo sabr donde buscar esosarchivos.
Es recomendable establecer otra variable deambiente conocida como JAVA_HOME que apunta a
donde instalaste el Java ,as:
JAVA_HOME = E:\J2SDK141
Entonces puedes establecer tu variable de ambiente PATH ,as:
SET PATH =%JAVA_HOME%\bin
lo cual resulta mas prctico a la largacuando instalas mas software que trabaje con Java como el
servidor de servlets yJSP Tomcat de Apache.
Configuracin de la variable de ambienteCLASSPATH
La variableCLASSPATHindicaal compilador, e interprete de Java y a otras aplicaciones que
utilicen lasAPI's de Java donde ubicarlas o encontrarlas para cargarlas a Memoria yutilizarlas. En
la versin Java 2 SDK 1.4.1 las API's estn en la carpetaliben formato.jar(Java Archive) y son
losarchivos tools.jar y dt.jar, entonces hay que configurar la variableCLASSPATHpara que
apunte a esos archivos porque ah estn lasclases compactadas de las API's, no basta que
apunten a la carpeta, tienen queapuntar a los archivos as:
SET CLASSPATH=.;E:\J2SDK141\lib\tools.jar;E:\J2SDK141\lib\dt.jar
o si ya creaste la variableJAVA_HOME para apuntar a E:\J2SDK141 se puede hacer lo siguiente:
SET CASSPATH=.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
la parte de la ruta de configuracin delCLASSPATH .; (punto y punto y coma) es necesaria
paraapuntar a la carpeta o directorio actual de trabajo con el fin de que podamoscompilar y
ejecutar nuestros programas de Java en la carpeta donde estemosubicados en ese momento y
tome las clases generadas en esa carpeta.
Nota:
Para establecer las variables de ambientePATH y CLASSPATH en sistemas Windows 98 y
Windows 2000 hay que editar elarchivo autoexec.bat con un editor de texto como el block de

14

notas, y modificarlas variables PATH y CLASSPATH como se explico antes y hay que inicializar
denuevo el sistema para que el sistema operativo de los valores nuevos a dichasvariables.
Para establecer las variables de ambiente PATH YCLASSPATH Microsoft Windows NT, 2000, y
XP
Hay que seguir los pasos siguientes (En windows XP puedevariar un poco pero son en esencia los
mismos pasos) :
Inicio->Configuracin ->Panel deControl ->Sistema ->Ventana de "Propiedades del Sistema";
ficha opestaa "Avanzado"; botn "Variables de entorno" ->Ventana de "Variables deentorno".
En la ventana Variables de entorno seencuentran las variables de usuario en la parte superior,
pulsando el botn"Nueva" aparece un cuadro de dialogo donde se debe introducir elNombre de
lavariabley elValor de la Variable

2.5Pruebade la instalacin.
Losusuarios de Windows pueden verificar su instalacin del SDK al usar el comandode MS-DOS
en la mayora de los sistemas. El indicador de MS-DOS tambin se le conoce como el indicador
de comandosdebido a que lo puede usar para escribir comandos que ejecuta el sistemaoperativo.
Escribalo siguiente en un indicador de comandos para verificar que su sistema puedaencontrar la
versin correcta del SDK en l:
Javaversion
B) Si est usando elSDK 1.4.1_02, en respuesta ud. debera ver el siguiente mensaje:

Suprimera aplicacin de Java


Las aplicaciones de Java son programasindependientes que no requieren unnavegador Web
para correr. Son msparecidos a los programas que ud. suele usar en su computadora (los
ejecutalocalmente con su ratn o escribiendo el nombre en la lnea de comandos)
A)Escriba el programa. Puede utilizar elblock de notas de Windows o cualquier editor de texto
que ud.conozca.
class Hola {
public static void main(String[] arguments) {
System.out.println("Holabienvenido a tu curso bsico de Java");

15

B)Cree una carpeta que se llame C:\j21curso. En ella guarde el archivo delprograma con el
nombre deHola.java. Es importante que el programa se llameexactamente igual al nombre de
la clase para que pueda compilarse, de locontrario habr un error. Cuando guardeel archivo
utilice comillas antes y despus del nombre para evitar que elprograma guarde el archivo con
su extensin .TXT, tal y como se ve en la (figura 4 ).

Compilaciny ejecucin del programa en Windows.


Cambiarel directorio actual alJ21cursocon la ventana de una sesin de MS-DOS con elcomando:
cd\j21curso
Siest en la carpeta correcta, puede compilar Hola.java escribiendo lo siguiente en el indicador
delnea de comandos:
Javac Hola.java
La( figura 5 ) muestra los comandos de MS-DOS que se usaron para cambiarse a
lacarpeta\j21curso,listar los archivos de las carpetas y compilarHola.java

Siel compilador del SDK no despliega ningn mensaje de error quiere decir que secompilo con
xito. Esto quiere decirque se crear un archivoHola.classen el mismo directorio que
contieneHola.java.

16

Estearchivo .class es el cdigo de bytes ( byte code ) que puede ser ejecutado por la
mquinavirtual
C)Una vez que tenga un archivo .class, lo puede ejecutar mediante el intrprete decdigo de
bytes. EjecuteHola.classescribiendo lo suguiente:
JavaHola
La( figura 6) muestra la salida apropiada de la aplicacinHola junto con los comandos MS-DOS
que seutilizaron para llegar a ese punto.

Findel ejercicio.
2.6 Tipos de programas en Java
En Java se tienen varios tipos deprogramas que se caracterizan por la forma y lugar en que se
ejecutan. Hastaahora se distinguen:
a)

aplicaciones deconsola

b)

applets

c)

servlets

d)

beans

Lasaplicaciones de consolallevan en la clase un mtodo que es esttico llamadomain(), en


lossucesivos captulos de este documento se muestran varios ejemplos.
Losappletsson programasque se ejecutan dentro de un navegador de Internet (como Netscape
o InternetExplorer). La ejecucin de estos inicia en el mtodoinit(), luego enstart()opaint()y
termina con el mtododestroy(). Encaso de faltar alguno de estos se pasa al siguiente.
Losservletsson programasque se ejecutan en un servidor y entregan resultados a un programa
cliente(cliente/servidor se explica mas adelante en uno de los captulos de estedocumento). Los
mtodos que se ejecutan soninit()primero y luegodoGet()odoPost()oaction()dependiendo del
que seencuentre sobreescrito en ese momento.
Losbeansse utilizan en losllamadosJSP(Java Server Pages) para brindarles funcionalidad con el
usode objetos. Estos no tienen un punto de inicio de ejecucin como los anterioressino que
cualquier mtodo se puede llamar en cualquier momento dentro de unJSP.

17

2.7 Estructura de un programa


Fecha de ltima actualizacin o modificacin de sta pgina: Jueves, 11 Marzo 2004 03:45:00
a.m. -0600
2.7 Estructura de un programa
La mayora de los programas en Java son de tipo aplicaciones de consola, y bsicamente el
programa ms sencillo en Java puede ser algo como lo siguiente:
class HagoNada { }
pero se recomienda la siguiente estructura, veamos un ejemplo:
/**
* Proposito de este programa es proponerte una
Comentarios

* estructura para un programa en Java.

javadoc

* @author Oscar Alejandro Gonzlez Bustamante


* @version 1.0
*/

paquete al que
pertenece esta

package utilerias.deoscar;

clase
Nombre de la

public class Taxista {

clase
/*

Esta clase define un Taxista y asigna un taxi

Comentarios
*/

// Coloca el nombre de la empresa aqu


Private static String nombreEmpresa = "Taxis del Noreste";
Atributos

// Nombre del taxista


private String Nombre;
// Carro asignado al taxista
private Carro miTaxi;
// Constructor por default para el Taxista
public Taxista() {
Nombre = null;
miTaxi = null;
}
// Constructor para inicializar a Taxista

Constructores

public Taxista(String elNombre, String noSerie) {


Nombre = elNombre;
miTaxi = new Carro(noSerie);
}

18

// Establece el nombre del Taxista


public void setNombre(String elNombre) {
Nombre = elNombre;
}
// Obtiene el nombre del Taxista
public static String getNombre() {
return Nombre;
}

Mtodos accesorios y
Mtodos mutadores
o modificadores
( interface pblica )

// Obtiene el nombre de la empresa


public static string getEmpresa() {
return nombreEmpresa;
}
Private void darDestino() {
}

mtodos de
implementacin

private void vueltaDerecha() {


}

privada

private void vueltaIzquierda() {


}

fin de la clase

} // fin de la clase Taxista

El programador es libre de poner todos los miembros de la clase ( atributos, constructores,


mtodos de interface pblica y de implementacin privada ) donde guste siempre y cuando estn
dentro de la definicin de clase ( dentro de los parntesis de mbito de la clase ), Java no le
amarra las manos, pero conviene tener un orden, y el ejemplo anterior se propone uno.
2.8 Como se creanaplicaciones Java con SDK
Primeramentenecesita un editor ( Block de notas, Edit, vi, Gel, TextEdit, Med, etc,. ) paragenerar
un archivo con extensin.javael cual tenga el cdigo fuente enlenguaje Java. Despus puede
generar la documentacin conjavadoc.exeopasar a compilar el programa para generar el(los)
archivo(s) .class tambin conocidos como unidades de compilacin ( por cada definicin de clase
segenera una unidad de compilacin, esto es, se genera un archivo con extensin.class) .
Luego puede incluirarchivos de cabecera de C/C++ si as lo requiere su aplicacin
conjavah.exe. Ahora ya puede ejecutar su aplicacin con el interpretejava.exede Java y
visualizar sus resultados por algn dispositivo desalida como la pantalla. Finalmente puede
depurar su programa conjdb.exe, si hay bugs en su aplicacin y puede volver otra vez al
editorde texto, y realizar de nuevo todos los pasos mencionados.
En la siguiente figura se indica esquemticamentelas etapas que un programador tiene que
realizar para crear aplicaciones Javacon SDK.

19

Figura. Como se crean aplicaciones Java con SDK ( SofwareDevelpment Kit )


2.9 Como se crean applets Java conSDK
Al igual que lasaplicaciones, con los applets , primeramente necesita un editor ( Block denotas,
Edit, vi, Gel, TextEdit, Med, etc,. ) para generar un archivo conextensin.javael cual tenga el
cdigo fuente en lenguaje Java. Despuspuede generar la documentacin conjavadoc.exeo
pasar a compilar elprograma para generar el(los) archivo(s) .class tambin conocidos
comounidades de compilacin ( por cada definicin de clase se genera una unidad
decompilacin, esto es, se genera un archivo con extensin .class) .
Luego puede incluirarchivos de cabecera de C/C++ si as lo requiere su aplicacin
conjavah.exe.
Ahora paraejecutar su applet lo puede hacer con el interprete de applets appletviewer.exede
Java el cual utiliza como argumento el archivo conextensin.htmlo.htmly visualizar sus
resultados por lapantalla, tambin puede utilizar algn navegador o browser como
InternetExplorer o Netscape para visualizar su applet en el rea de despliegue delnavegador.
Finalmente puede depurar su programa conjdb.exe, si haybugs en su aplicacin y puede volver
otra vez al editor de texto, y realizar denuevo todos los pasos mencionados.
En la siguientefigura se indica esquemticamente las etapas que un programador tiene
querealizar para crear aplicaciones Java con SDK.

20

Figura. Cmo secran applets Java con SDK ( Software Development Kit )

3. Elementos Bsicos del Lenguaje


En esta parte veremos la sintaxis de los elementos bsicos del lenguaje Java y que usados para
describir los elementos que constituyen programas de Java vlidos. Si el lector ya tiene
experiencia con lenguajes como C, C++ , C# se percatar que la sintaxis es bastante similar en
Java, y las diferencias se percibirn de acuerdo al lenguaje del que se proceda. Para entender la
sintaxis de un lenguaje conviene empezar por lo bsico y avanzar desde ah, estos elementos
son: los comentarios, palabras reservadas, variables, tipos de datos, literales, instrucciones,
expresiones, operadores y modificadores.
3.1 Comentarios
Los comentarios son informacin que no tienen ningn efecto con la lgica de un programa y
cuyo propsito es la de documentar el cdigo del programador. Un programador documenta sus
clases, mtodos, variables, etc. porque no solo el compilador es el nico en leer el cdigo, sino
tambin otros programadores, o l mismo despus de algn tiempo en el que podra olvidar para
que o porque puso tal o cual instruccin. En Java hay tres tipos de comentarios:
Los de una sola lnea al estilo del C++, que comienzan con doble diagonal // y terminan al final
de la lnea, ejemplo:
// Esto es un comentario que inicia con doble diagonal y termina aqu

21

Los de varias lneas al estilo del lenguaje C, los cuales estn entre diagonal y asterisco /* y
asterisco seguido de diagonal, */ . Todo lo que este dentro es considerado un comentario.
ejemplo:
/* Esto es un conjunto de
datos que informa al programador
para que puso tal o cual cosa */
En Java pueden anidarse estos comentarios /* */ pero el primer */ finalizar ambos
comentarios, lo que har que el resto del comentario que quede fuera sea tratado como cdigo
por el compilador.

3.2 Comentarios de javadoc


El tercer tipo de comentarios es el que comienza con /** y termina con */ y son conocidos
como comentarios javadoc, llamados as por la herramienta SDK. Este funciona como el
comentario /* */ y se utiliza para documentar elementos como clases, mtodos y variables.
Este tipo de comentario tiene etiquetas conocidas como @etiquetas las cuales se pueden colocar
dentro del comentario , y que son utilizadas por la herramienta javadoc al generar las pginas
HTML. La siguiente tabla muestra algunas de ellas
Etiqueta

Descripcin

@autor nombre

Especifica el nombre del autor o creador


del elemento.

@deprecated texto

Sirve para especificar un elemento que ya


no se usa, y el texto describe lo que se
debe hacer cuando sea posible.

@exception
texto de la
@throws texto de la excepcin

excepcin

Especifica que un mtodo arroja una


excepcin.

{@link nombre de la etiqueta}

Sirve para insertar un vnculo a otra


pgina javadoc. Esta diseado para estar
relacionada con otra descripcin.

@param nombre del texto

Es para describir un parmetro de un


mtodo.

@return texto

Se usa para describir el valor devuelto


por un mtodo.

@see referencia

Sirve para crear una referencia cruzada


con otro paquete, clase, mtodo u otro
documento.

@since texto

Es para especificar el momento en que se


aadi algo.

@serial
texto
@serialField texto con nombre de tipo
@serialData texto

Sirve para documentar la naturaleza


serializable de una clase.

@version texto

Es para documentar la versin de un


elemento.

22

3.2.1 Un ejemplo de comentarios javadoc


El siguiente programa muestra una clase particular llamada Dato con comentarios javadoc
creados en los lugares adecuados solo para ejemplificar esta herramienta del SDK.
Para generar la documentacin hay que ejecutar la herramienta javadoc sobre el archivo fuente
con el siguiente comando:
javadoc Dato.java
Esto generar la documentacin HTML para la clase , como se indica a continuacin:
Loading source file Dato.java...
Constructing Javadoc information...
Standard Doclet version 1.4.2_03
Generating constant-values.html...
Building tree for all the packages and classes...
Building index for all the packages and classes...
Generating overview-tree.html...
Generating index-all.html...
Generating deprecated-list.html...
Building index for all classes...
Generating allclasses-frame.html...
Generating allclasses-noframe.html...
Generating index.html...
Generating packages.html...
Generating Dato.html...
Dato.java:52: warning - @param argument "escribe" is not a parameter name.
Generating package-list...
Generating help-doc.html...
Generating stylesheet.css...
1 warning
Se generar un archivo HTML para cada clase, junto con varios archivos de ndice que , y son
muy tiles cuando se generan mltiples clases juntas. Para ver el resultado hay que abrir el
archivo Dato.html y se obtendrn los comentarios estilo javadoc de este archivo HTML.
Ver a continuacin el cdigo de Dato.java y la figura del ejemplo de documentacin de clase
generada con javadoc:

Si quieres obtener el cdigo clic con el botn derecho aqu Dato.java


Si quieres ver el resultado de ejecutar ste programa dale clic aqu Dato.html
/**
* El componente <code> Dato </code> es solo un ejemplo.
* Solo sirve para ensearte el javadoc.* <p>
* @version 2.0
* @author Oscar Alejandro Gonzlez Bustamante
*/
public class Dato {
/**
* Un tipo de Dato especfico
*/
public static final int TIPO_DATO = 0;
/**

23

* Otro tipo de dato especfico


*/
public static final int OTRO_TIPO_DATO = 1;
/**
* El tipo de dato actual
*/
private int tipo;
/**
* Crea un Dato
*/
public Dato() {
tipo = TIPO_DATO;
}
/**
* devuelve el tipo de dato actual
*
* @return tipo de dato actual
* @deprecated Como la versin 1.9, use {@link #getDato() getDato()} en
* su lugar
*/
public int data() {
return getDato();
}
/**
* Devuelve el tipo de dato actual
*
* @return tipo de dato actual
* @since V1.9
*/
public int getDato() {
return tipo;
}
/**
* Cambia el tipo de dato actual
*
* @param escribe el nuevo tipo de dato
* @throws IllegalArgumentException Cuando el tipo no es vlido
*/
public void setDato( int nuevoValor ) {
if ( ( nuevoValor != TIPO_DATO ) &&
( nuevoValor != OTRO_TIPO_DATO ) ) {
throw new IllegalArgumentException("Tipo malo");
}
tipo = nuevoValor;
}
/**
* Mtodo marcador de posicin para ver etiquetas
* @see Dato#TIPO_DATO
* @see Dato#getDato()
* @see #getDato()
* @see "Mi libro"
* @see <a href="http://www.cic.ipn.mx/ogonzalez">Web de Oscar</a>
*/
public void myVoid() {
}
}

Salida del programa Dato.java al utilizr la herramienta javadoc

24

Figura: Ejemplo de documentacin de clase generada con la herramienta javadoc


3.3 Palabras reservadas
Java al igual que cualquier otro lenguaje de programacin tiene su conjunto de palabras
reservadas. Las palabras reservadas no puede ser empleadas como identificadores de clases,
interfaces, variables, mtodos, constantes, etc. ya que como su nombre lo dice, son palabras
reservadas para el lenguaje de programacin. La siguiente tabla es un resumen las palabras
reservadas de Java.
abstract
boolean
break
byte
case
catch
char
class
const *
continue
default
do

double
else
extends
final
finally
float
for
goto *
if
implements
import
instanceof

int
interface
long
native
new
null
package
private
protected
public
return
short

static
super
switch
synchronized
this
throw
throws
trasient *
try
void
volatile
while

* indica que la palabra reservada no es actualmente utilizada.

3.4 Tipos de variables en Java


Tipos de Variables en Java

Variables de Instancia.
Variables de una clase.

25

Variables locales a mtodos.

La declaracin de variables en Java se hace de forma similar al C. En adelante, un identificador


ser el nombre de una variable. As declararemos.

Tipo identificador [,identificador];


donde tipo va a ser uno de los 8 tipos de datos (primitivos) de JAVA. Estos son:
Nombre tipo
byte
short
int
long
float
double
char
boolean

Clase
entero
entero
entero
entero
real
real
caracter
booleano

Tamao
8-bit
16-biy
32-bit
64-bit
32-bit
64-bit
16-bit (Cdigo Unicode)
1-bit

Java define adems otros tipos que no estn en la anterior clasificacin, estos tipos son
instancias de alguna clase en particular, ya sea de una clase que haya creado el programador o
una clase ya existente dentro de las bibliotecas API de Java.
El mbito de los valores de las variables de instancia se limita como su nombre lo indica a la
instancia misma.
En las variables de clase sus valores son para todas las instancias de la clase misma, esto es, su
valor es compartido por todas las instancias de la clase y su almacenamiento debe ser esttico y
se especifica con la palabra reservada static , si ud. programador de C , son parecidas a las
variables globales.
Por ultimo las variables locales a mtodos sus valores se circunscriben al mbito del mtodo al
que pertenecen.
El siguiente ejemplo muestra la diferencia entre las variables de clase, de instancia y locales
mtodos:
Si quieres obtener el cdigo clic con el botn derecho aqu Variables.zip
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.

/**
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha: 2 marzo 2004
* Archivo: Variables.java
* Clase Variables: su propsito es ensearte
* el uso de las variables en Java
*/

19.

public class Variables {


static int clase;
int instancia;
int metodoVar ( ) {
int local = 6;
return local;
}

26

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.

31.

/**
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha: 2 marzo 2004
* Archivo: UsaVariables.java
* Clase UsoVariables: su propsito es ensearte
* el uso de las variables en Java
*/
class UsaVariables {
Variables x = new Variables();
Variables y = new Variables();
public static void main ( String args[] ) {
UsaVariables u = new UsaVariables();
escribeVar( u.x ,"x" ); escribeVar( u.y , "y" );
u.y.clase = 123;
u.x.instancia = 321; u.y.instancia = 567;
escribeVar( u.x ,"x" ); escribeVar( u.y , "y" );
System.out.println("Fin del programa");
}
static void escribeVar(Variables ejem, String id) {
System.out.print("Valor de las variables\n" +
id + ".clase = " + ejem.clase + "\n" +
id + ".instancia = " + ejem.instancia + "\n" +
id + ".local = " + ejem.metodoVar() + "\n" +
"=============================\n");
}
}

La salida del ejecutar el programa: java UsaVariables


Valor de las variables
x.clase = 0
x.instancia = 0
x.local = 6
=============================
Valor de las variables
y.clase = 0
y.instancia = 0
y.local = 6
=============================
Valor de las variables
x.clase = 123
x.instancia = 321
x.local = 6
=============================
Valor de las variables
y.clase = 123
y.instancia = 567
y.local = 6
=============================
Fin del programa
Finished executing

27

Podemos ver que en el listado del programa Variables.java tenemos definida en la lnea 12 una
variable de clase ( observe el uso de la palabra reservada static ) , en la lnea 13 una de
instancia y una local al mtodo en la lnea 16. Todas son de tipo int .

El siguiente listado del programa UsaVariables.java, esta compuesta de dos variables de


instancia x , y de la clase Variables. Para poderlas utilizar necesitamos crear una variable u
de instancia de la misma clase UsaVariables en la lnea 16. Al mandar a imprimir sus valores
en la lnea 17, mediante la invocacin del mtodo escribeVar( Variables ejem, String id ) el
cual recibe la variable y su identificador en sus parmetros el resultado es:
Valor de las variables
x.clase = 0
x.instancia = 0
x.local = 6
=============================
Valor de las variables
y.clase = 0
y.instancia = 0
y.local = 6
debido a que el interprete de Java inicializa las variables de tipo int con 0, excepto para la local
que se inicializa con un valor de 6 en la lnea 16.
Luego se le asigna en la lnea 18, un nuevo valor ( 123 ) a la variable de clase, esto tiene como
efecto la modificacin del valor para todas las instancias ( en este caso x, y ) de la clase
Variables.
18.

u.y.clase = 123;

En la lnea 19, se modifican los valores de las variables de instancia para x ( 321 ) y para y ( 567
), lo cual solo afecta respectivamente a esas variables de instancia
19.

u.x.instancia = 321; u.y.instancia = 567;

Luego en la lnea 20, al volver a invocar al mtodo escribeVar() la salida ejemplifica la afectacin
de los valores de las variables tanto de clase , ambas con valor de 123 y las de instancia y con
123 y x con 321.
=============================
Valor de las variables
x.clase = 123
x.instancia = 321
x.local = 6
=============================
Valor de las variables
y.clase = 123
y.instancia = 567
y.local = 6
=============================
Fin del programa
La variable local sigue con su valor de 6 porque no se ve afectada con los cambios efectuados
debido a que su mbito esta dentro del mtodo al que pertenece.
3.5 Tipos de datos primitivos

28

Los tipos primitivos tienen un tratamiento especial porque son usados frecuentemente adems
porque la razn es que crear un objeto con new especialmente uno chico como una simple
variable no es muy eficiente porque new aloja objetos en el heap.
Para stos tipos Java hace lo mismo que C y C++ en lugar de crear la variable usando new una
variable automtica es creada la cual no es una referencia. La variable aloja el valor por si
mismo y lo coloca en el stack que es mucho ms eficiente.
Java determina el tamao de cada tipo primitivo. Estos tamaos no cambian de una arquitectura
de mquina a otra como en la mayora de los lenguajes. Esto es la razn por la cual los
programas en Java son muy portables. La siguiente tabla muestra esos tamaos que no
cambian:
Tipo
Tamao/Formato
(Nmeros enteros)
byte
8-bit complemento a 2
short
16-bit complemento a 2
int
32-bit complemento a 2
long
64-bit complemento a 2
(Nmeros reales)
float
32-bit IEEE 754
double 64-bit IEEE 754
(otros tipos)
char
16-bit Caracter
boolean true o false

Descripcin
Entero de un Byte
Entero corto
Entero
Entero largo
Coma flotante de precisin simple
Coma flotante de precisin doble
Un slo carcter
Un valor booleano (verdadero o falso)

La mayora de los tipos primitivos tienen clases Wrapper. Significa que un objeto no primitivo
en el heap puede ser creado para representar uno primitivo en el heap. Ejemplo:
char
c
Character C = new Character(c);

x;

// o tambin puede ser:


Character C = new Character(x);
3.5.1 Clases wrapper
En java tenemos para cada tipo primitivo de datos su correspondiente clase Wrapper o
envoltorio.
Cada una de estas clases wrapper contiene tiles mtodos y constantes muy
utilizados en conversin de tipos, y para el manejo de sistemas bases de nmeros, hexadecimal
,octal, binario, etc. La siguiente figura muestra algunos mtodos tiles involucrados en esas
conversiones.

29

En la siguiente tabla se muestra un resumen de los mtodos disponibles en las clases wraper
para las conversiones de tipo:
Conversiones
Operacin

Sintaxis

bolean to String

String s = theBoolean ? true: false;


String s = + TheBoolean;
String s = Byte.toString(theByte);

byte, short, char,


int to String

byte, short, char,

String s = Short.toString(theShort);
String s = Integer.toString(theNumber);
String s = Integer.toString(theNumber, base);

int to String

long to String

float to String

double to String
String to boolean
String to byte
String to short
String to int

String s = Integer.toBinaryString(theNumber);
String s = Intefer.toOctalString(theNumber);
String s = Integer.toHexString(theNumber);
String s = String.valueOf(theNumber), Strin s = ""+
theNumber;
String s = Long.toString(theLong);
String s = Long.toString(theLong , base);
String s = Long.toBinaryString(theLong);
String s = Long.toOctalString(theLong);
String s = Long.toHexString(theLong);
String s = String.valueOf(theLong);
String s = "" + theLong.
String s = Float.toString(theFloat);
String s = String.valueOf(theFloat);
String s = * theFloat;
String s = Double.toString(theDouble):
String s = "" + TheDouble.
booelan b= Boolean.getBoolean(theString);
byte b = Byte.parseByte(theString);
byte b = Byte.parseByte(theString , base);
short s = Short.parseShort(theString);
short s = Short.parseShort(theString , base);
int = Integer.parseInt(theString);

30

String to float

int = Integer.parseInt(theString , base);


long ! = Long.parseLong(theString);
long ! = Long.parseLong(theString , base);
char c= (char)integer.parseInt(theString);
char c = (char)integer.parseInt(theString , base);
float f= Float.parseFloat(theString);

String to double

double d = Double.parseDouble(theString)

String to long
String to char

A continuacin presentamos algunos ejemplos de conversin entre tipos y de manejo de bases


numricas.
En el este ejemplo se aplican mtodos de la clase Integer como toBinaryString(),
toOctalString(), toHexString(), etc., para hacer conversiones de bases numricas:
Si quieres obtener el cdigo
de
el botn derecho aqu TestInteger.zip

los

siguientes

programas

solo

haz

cliccon

/**
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha: 3 marzo 2004
* Archivo: TextRadix.java
* Clase TextRadix: su propsito es ensearte
* el uso de las clases wrapper en Java, en particular
* el uso de los mtodos de la clase Integer para
* la conversin entre bases numricas.
*/
public class TestRadix
{ public static void main(String[] args)
{ int n = 59;
System.out.println("Decimal:\t" + Integer.toString(n));
System.out.println("Binary: \t" + Integer.toBinaryString(n));
System.out.println("Octal: \t" + Integer.toOctalString(n));
System.out.println("Hexadecimal:\t" + Integer.toHexString(n));
System.out.println("Ternary:\t" + Integer.toString(n,3));
System.out.println("Dodecimal:\t" + Integer.toString(n,12));
System.out.println("Bigesimal:\t" + Integer.toString(n,20));
System.out.println("Character.MIN_RADIX = "
+ Character.MIN_RADIX);
System.out.println("Character.MAX_RADIX = "
+ Character.MAX_RADIX);
n = Integer.parseInt("d7b",16);
System.out.println("d7b (base 16) = " + n);
}
}
/* La salida es:
java TestRadix
Decimal: 59
Binary:
111011
Octal:
73
Hexadecimal:
3b
Ternary: 2012
Dodecimal:
4b

31

Bigesimal: 2j
Character.MIN_RADIX = 2
Character.MAX_RADIX = 36
d7b (base 16) = 3451
*/
En este segundo ejemplo se muestra el uso de los mtodos de la clase Integer como
toString(), parseInt(), decode(), etc., para conversin entre tipo primitivo int , y entre
objetos de la clase String e Integer.
public class TestInteger
{ public static void main(String[] args)
{ int n = 66;
System.out.println("int n = " + n);
Integer x = new Integer(n); // convierte int a Integer
System.out.println("Integer x = " + x);
String s = x.toString(); // convierte Integer a String
System.out.println("String s = " + s);
n = Integer.parseInt(s); // convierte String a int
System.out.println("int n = " + n);
s = Integer.toString(n); // convierte int a String
System.out.println("String s = " + s);
x = Integer.decode(s); // convierte String a Integer
System.out.println("Integer x = " + x);
n = x.intValue(); // convierte Integer a int
System.out.println("int n = " + n);
System.out.println("Integer.MIN_VALUE = "
+ Integer.MIN_VALUE);
System.out.println("Integer.MAX_VALUE = "
+ Integer.MAX_VALUE);
}
}
/* La salida es:
java TestInteger
int n = 66
Integer x = 66
String s = 66
int n = 66
String s = 66
Integer x = 66
int n = 66
Integer.MIN_VALUE = -2147483648
Integer.MAX_VALUE = 2147483647
*/

3.6 Literales
En Java hay una forma de especificar un valor determinado a una variable o constante, mediante
una literal, que es una expresin constante utilizada para expresar un valor. Cada tipo de dato
tiene su propio formato para especificar una literal, como se describe en la siguiente tabla:
Notaciones literales
Tipo

Formato

32

int

Decimal dgitos 0-9 ejemplo: (1234)


Octal cero (0) seguido de los dgitos 0-7 ejemplo: (01234)
Hexadecimal 0x o 0X seguido de los dgitos 0-9, A-F ejemplo: (0x1234)

long

Aade l o L al final del trmino literal int ejemplo: 0xDECADAL

float

Aade f o F al final del trmino literal double y sustituye a d/D en caso de existir por
ejemplo: 3.14f , 3.14E+15F

double

Notacin cientfica como en 1.345e+10, donde el exponente puede expresarse con una e o
una E; puede encontrarse una d o D al final del elemento literal double

char

Un nico caracter o secuencia de escape entre comillas sencillas, por ejemplo: 'X', 'r'.

String

Varios caracteres o secuencias de escape entre comillas dobles. .

boolean

verdadero, falso

Null

nulo

3.7 Secuencias de escape de caracter


Son caracteres que pueden utilizarse en los flujos o en los mtodos de System.out.print(), o
System.out.println() para control de la salida que el programador desea, y siempre tienen como
prefijo la diagonal invertida o back slash. La siguiente tabla presenta un resumen de estos
caracteres:
Escape

Significado

\n

nueva lnea

\t

tabulador

\b

espacio en blanco

\r

retorno de carro

\f

formfeed

\\

back slash, para comentarios

\'

comilla simple

\"

comillas

\ddd

nmero en octal (ejemplo: \231 )

\xdd

nmero en hexadecimal (ejemplo: \x12 )

\udddd

caracter UNICODE (ejemplo: \u1914 )

33

3.8 Inicializacin de variables


Cuando datos de tipo primitivo son miembros de una clase, se garantiza que por omisin toman
estos valores de inicializacin

Cuando las variables son referencias a un objeto y no son instanciadas, se garantiza que su valor
tendr un valor constante Null ( nulo ).
Veamos el siguiente ejemplo:
Si quieres obtener el cdigo clic con el botn derecho aqu IniciaVariables.zip
/**
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha: 2 marzo 2004
* Archivo: Miembros.java
* Clase Miembros: su propsito es ensearte
* el uso de las variables en Java, en particular
* con que valores son inicializadas por el
* compilador de Java. En esta clase se definen las
* variables que van a ser utilizadas por el programa
* IniciaVariables.java
*/
class Miembros {
boolean b;
char c;
byte bt;
short sh;
int i;
long l;
float f;
double d;
String s;
}
/**
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha: 2 marzo 2004
* Archivo: IniciaVariables.java
* Clase IniciaVariables: su propsito es ensearte

34

* el uso de las variables en Java, en particular


* con que valores son inicializadas por el
* compilador de Java
*/
public class IniciaVariables {
public static void main( String args[] ) {
Miembros campo = new Miembros();
System.out.print("b= " + campo.b + "\n" +
"c= " + campo.c + "\n" +
"bt= " + campo.bt + "\n" +
"sh= " + campo.sh + "\n" +
"i= " + campo.i + "\n" +
"l= " + campo.l + "\n" +
"f= " + campo.f + "\n" +
"d= " + campo.d + "\n" +
"s= " + campo.s + "\n" +
"Fin del programa");
}
}

La salida del programa al correrlo con la instruccin; java IniciaVariables es:


java IniciaVariables
b= false
c=
bt= 0
sh= 0
i= 0
l= 0
f= 0.0
d= 0.0
s= null
Fin del programa

Se observa que las variables primitivas y las referencias a objetos tienen los valores iniciales
garantizados mencionados anteriormente.

3.9 Sentencias y expresiones


Las sentencias y expresiones en Java son delimitadas por punto y coma ( ; ) al final de las lneas
del cdigo ya que por lo general, las sentencias estn escritas en una sola lnea como:
final String CIC = new String ("Centro de Investigacin en Computacin");
Pero el compilador de Java no se preocupa donde el programador coloca espacios en blanco (
tabuladores, espacios, retornos de carro ) en su cdigo fuente, as que las sentencia anterior es
equivalente a lo siguiente:

35

final

String

CIC

=
new

String ("Centro de Investigacin en Computacin");

Todo depende del estilo del programador y el compilador lo dejar pasar y tratar la(s) lnea(s)
como una sola sentencia.

3.10 Operadores y operandos


Java tiene una gran variedad de operadores, y la mayora le vienen de lenguajes como el C y
C++, estos se pueden clasificar en:

Operadores aritmticos

Operadores relacionales

Operadores lgicos

Operadores de bits

Operadores de asignacin

Un operador es generalmente una relacin que hay entre uno , dos o ms operandos.
Un operando es una expresin, una variable, una constante, una literal, o un mtodo que
devuelva algn valor. Con los operadores y operandos formamos expresiones, y una expresin
es una frmula construida con combinaciones de constantes, variables, operadores, operandos
y nombres de mtodos .
Cada expresin al evaluarse toma un valor que se determina tomando en cuenta los tipos de las
variables y constantes implicadas adems de la ejecucin de las operaciones indicadas por los
operadores

3.10.1 Jerarqua de operadores


El orden general de evaluacin de los operadores de una expresin va de izquierda a derecha,
con la excepcin de las asignaciones que lo hacen de derecha a izquierda.
Podemos seguir las siguientes tres reglas de evaluacin de expresiones:
(Regla 1) En todas las expresiones se evalan primero las expresiones de los parntesis ms
anidados (interiores unos a otros); y stos modifican la prioridad segn la cantidad de stos, los
cuales tienen que estar balanceados ( el mismo nmero de parntesis que abren debe ser igual
al nmero de los parntesis que cierran).
(Regla 2) Todas las expresiones se evalan tomando en cuenta la jerarqua de los operadores.
(Regla 3) Todas las expresiones se evalan de izquierda a derecha.
La tabla que se muestra abajo, da el orden de precedencia del operador en Java segn el nivel
que indica la primera columna de la izquierda. Los operadores agrupados en bloques comparten
la misma jerarqua. Los operadores que se muestran a en lo alto de la tabla tienen mayor
precedencia que los del fondo y, por tanto, sern evaluados antes que los de precedencia ms
baja.
Tipo
de
Nivel Operador
Descripcin
Ejemplo
operador
1
[]
Subndice de array
a[i]
Sufijo
Utilizado para acceder a mtodos
.
a.b
y variables
(parntesis) Utilizado para agrupar expresiones

(a+b)

36

expr++

Pos-incremento

a++

expr--

Pos-decremento

a--

++expr

Pre-incremento

++a

--expr

Pre-decremento

--a

+expr

Unitario mas

+a

-expr

Negacin

-a

Cortesa

~a

NOT

!a

new

Creacin

(parn)exp
Casta
r
4

8
9
10
11

new Clasname()

Creacin

(Classname)a

Forma

Multiplicacin

a*b

Divisin

a/b

Modulo

a%b

Adicin

a+b

Substraccin

a-b

<<

Desplazamiento a la izquierda

a<<b

>>

Desplazamiento a la derecha
Desplazamiento con relleno de
ceros a la derecha

a>>b

<<<

Unitario

Multiplicador

Aditivo

Desplazamiento

a<<<b

<

Menor que

a<b

>

Mayor que

a>b

<=

Menor o igual que

a<=b

>=

Mayor o igual que

a>=b

Comprueba si una variable


es una instancia de la clase
instanceof especificada
o cualquier subclase de aquella
clase

instanceof
Classname

==

Igual

a==b

!=

No igual

a!=b

&

AND bit a bit

a&b

XOR exclusivo bit a bit

a^b

OR inclusivo bit a bit

a|b

Relacional

Igualdad
AND bit a bit
XOR exclusivo bit
a bit
OR inclusivo bit a
bit

12

&&

AND lgico

a&&b

AND lgico

13

||

OR lgico

a||b

OR lgico

?:

Forma taquigrfica de una


sentencia if

a?b:c

Condicional

Asignacin simple

a=b

Asignacin

14
15

*=

Multiplicar y asignar

a*=b

37

/=

Dividir y asignar

a/=b

%=

Mdulo y asignar

a%=b

+=

Sumar y asignar

a+=b

-=

Substraer y asignar

a-=b

&=

AND y asignar

a&=b

|=

OR y asignar

a|=b

^=

XOR y asignar

a^=b

<<=

Desplazar a la izquierda y asignar

a<<=b

>>=

Desplazar a la derecha y asignar

a>>=b

>>>=

Desplazar a la derecha rellenando


con ceros y asignar

a>>>=b

Tabla de jerarqua de operadores en Java.

3.10.2 Operadores aritmticos


El resultado de utilizar stos operadores es generalmente un valor de tipo real o entero y los operadores
son:
Operador
Uso
Descripcin
+
op1 + op2
Suma op1 y op2
op1 op2
Resta op2 de op1
*
op1 * op2
Multiplica op1 y op2
/
op1 / op2
Divide op1 por op2
%
op1 % op2
El resto de dividir op1 por op2
*
+ op
Indica un valor positivo
- op
La negacin aritmtica de op
++
op ++
Incrementa op en 1: evala el valor
antes de incrementar
++
++op
Incrementa op en 1: evala el valor
despus de decrementar
-op-Decrementa op en 1: evala el valor
antes de decrementar
---op
Decrementa op en 1: evala el valor
despus de decrementar
Tabla de operadores aritmticos en Java
El siguiente ejemplo hace uso de los operadores aritmticos, y crea la clase
OpAritmeticos en el paquete operadores con package operadores. Luego para
utilizar la clase utilizamos la sentencia import operadores.OpAritmeticos y por
supuesto tienes que configurar tu variable de ambiente classpath , o agregar la ruta
de clases en el entorno de desarrollo IDE que este utilizando, veamos:
Si quieres el cdigo descrgalo dando clic con el botn derecho

EjemplosOperadores.zip

/**
* Programa de Java que te ensea a utilizar los operadores
* aritmticos. Observa que la clase pertence al paquete
* operadores.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0

38

* Archivo: OpAritmeticos.java
*/
package operadores;
public class OpAritmeticos {
double x,y;
public OpAritmeticos (double x, double y) {
this.x = x;
this.y = y;
}
public String opera1() {
String s = " x + y =" + (x + y) + "\n";
s += " x - y =" + (x - y) + "\n";
s += " x * y =" + (x * y) + "\n";
s += " x / y =" + (x / y) + "\n";
s += " +x =" + (+x) + "\n";
s += " -x =" + (-x) + "\n";
return s;
} // fin de opera1()
public void opera2() {
double x1, x2;
x1 = x;
x2 = x;
System.out.println("Valores iniciales de x1 y x2 son:\n" +
"x1 = "+ x1 + " x2 = " + x2);
System.out.println("Operadores aritmeticos de preincremento y posincremento
\n\n");
for ( int i=1; i <= 10; i++ )
System.out.println(" i = " + i +
" ++x1 = " + (++x1) +
" x2++ = " + (x2++) );
}// fin de opera2()
public void opera3() {
double y1, y2;
y1 = y;
y2 = y;
System.out.println("Valores iniciales de y1 y y2 son:\n" +
"y1 = "+ y1 + " y2 = " + y2);
System.out.println("Operadores aritmeticos de predecremento y posdecremento
\n\n");
for ( int i=1; i <= 10; i++ )
System.out.println(" i = " + i +
" --y1 = " + (--y1) +
" y2-- = " + (y2--) );
} // fin de opera3()
} // fin de la clase OpAritmeticos

/**
* Programa de Java que te ensea a utilizar los operadores
* aritmticos. Observa que la clase pertence al paquete
* estandar, y hace uso de la clase OpAritmeticos que se
* encuentra en la clase operadores.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0

39

* Archivo: UsaOperadoresAritmeticos.java
*/
import operadores.OpAritmeticos;
class UsaOperadoresAritmeticos {
OpAritmeticos op = new OpAritmeticos( 10 , 20);
public static void main ( String[] args ) {
UsaOperadores usa = new UsaOperadores();
System.out.println(" Ejemplo de operadores \n" +
" Operadores arimeticos \n" +
usa.op.opera1() );
usa.op.opera2();
usa.op.opera3();
System.out.println("\n\n Fin del programa ");
} // fin del main()
}// fin de la clase UsaOperadoresAritmeticos

La salida del programa al ejecutarlo con el comando java UsaOperadoresAritmeticos es:


Ejemplo de operadores
Operadores arimeticos
x + y =30.0
x - y =-10.0
x * y =200.0
x / y =0.5
+x =10.0
-x =-10.0
Valores iniciales de x1 y x2 son:
x1 = 10.0 x2 = 10.0
Operadores aritmeticos de preincremento y posincremento
i = 1 ++x1 = 11.0 x2++ = 10.0
i = 2 ++x1 = 12.0 x2++ = 11.0
i = 3 ++x1 = 13.0 x2++ = 12.0
i = 4 ++x1 = 14.0 x2++ = 13.0
i = 5 ++x1 = 15.0 x2++ = 14.0
i = 6 ++x1 = 16.0 x2++ = 15.0
i = 7 ++x1 = 17.0 x2++ = 16.0
i = 8 ++x1 = 18.0 x2++ = 17.0
i = 9 ++x1 = 19.0 x2++ = 18.0
i = 10 ++x1 = 20.0 x2++ = 19.0
Valores iniciales de y1 y y2 son:
y1 = 20.0 y2 = 20.0
Operadores aritmeticos de predecremento y posdecremento
i
i
i
i
i
i
i
i
i
i

=
=
=
=
=
=
=
=
=
=

1 --y1 = 19.0 y2-- = 20.0


2 --y1 = 18.0 y2-- = 19.0
3 --y1 = 17.0 y2-- = 18.0
4 --y1 = 16.0 y2-- = 17.0
5 --y1 = 15.0 y2-- = 16.0
6 --y1 = 14.0 y2-- = 15.0
7 --y1 = 13.0 y2-- = 14.0
8 --y1 = 12.0 y2-- = 13.0
9 --y1 = 11.0 y2-- = 12.0
10 --y1 = 10.0 y2-- = 11.0

Fin del programa

40

3.10.3 Operadores relacionales


El resultado de emplear estos operadores es un valor de tipo lgico; true o false, que son
literales constantes para los tipos de datos boolean.
Operador
>
>=
<
<=
==
!=

Uso
op1 > op2
op1 >= op2
op1 < op2
op1 <= op2
op1 == op2
op1 != op2

Devuelve verdadero si
op1 es mayor que op2
op1 es mayor o igual op2
op1 es menor que op2
op1 es menor o igual que op2
op1 y op2 son iguales
op1 y op2 no son iguales

Tabla de operadores relacionales de Java


3.10.4 Operadores booleanos

Al igual que los operadores relacionales, el resultado de emplear estos operadores es un valor de
tipo lgico; true o false, que son literales constantes para los tipos de datos boolean, y es por
esto que tambin se le conocen como operadores lgicos.
Operador
&&
||
!

Uso
op1 && op2
op1 op2
op

Devuelve verdadero si
op1 y op2 son ambos verdaderos
op1 o op2 son true
op es falso

Tabla de operadores booleanos o lgicos en Java


3.10.5 Operadores de manipulacin de bits
Estos operadores de manipulacin de bits tambin conocidos como operadores bitwise realizan
operaciones de manejo de bits a bajo nivel, esto es, nos permiten hacer corrimientos de bits a la
izquierda o la derecha, tambin nos permiten hacer operaciones and, or, xor y complemento.
Son bastantemente utilizados cuando se desea encriptar y desencriptar informacin, o cuando la
rapidez de alguna operacin as lo requiera.
Operador
>>

Uso
op1 >> op2

<<

op1 << op2

>>>

op1 >>> op2

&
|
^
~

op1 & op2


op1 op2
op1 ^ op2
~ op

Descripcin
Desplaza bits de op1
segn op2
Desplaza bits de op1
segn op2
Desplaza bits de op1
segn op2 (sin signo)
And a nivel de bits
Or a nivel de bits
Xor a nivel de bits
Complemento a nivel de

a la derecha
a la izquierda
a la derecha

bits

Tabla de operadores de manipulacin de bits en Java

41

3.10.6 Operadores de cadena


En Java hay un operador de concatenacin (unin) ( + ) que es el nico que se puede aplicar a
las cadenas y se utiliza para concatenar o para unir cadenas; El operador de cadena tiene una
prioridad igual a la del operador de suma aritmtica y asociatividad a la izquierda, y es el nico operador
sobrecargado que tiene Java ( recuerde que Java no tiene sobrecarga de operadores como C++por razones
de simplicidad , pero sus creadores hicieron una excepcin a la regla , ya que la unin es muy til ).
Ejemplo:
String s = "hola" + " " + "buenos das";
Da como resultado "hola buenos das". En una expresin, si solo uno de los operandos es una
cadena, el otro se convertir al tipo cadena automticamente:
Ejemplo:
String s;
s= "6 * 7 = " + ( 6 * 7 );
Da como resultado "6 * 7 = 42" . Si el operando que no es una cadena es un objeto, Java
utilizar el mtodo toString() para obtener una cadena equivalente. El mtodo toString()
pertenece a todas las clases porque el encargado de su implementacin es la clase Objet. El
comportamiento predeterminado de toString() es devolver el nombre de la clase del objeto
junto con un smbolo @ y el cdigo hash del objeto. El cdigo hash es un nmero que se
calcula a travs del mtodo hashCode(), y tambin ste mtodo est definido en la clase
Object.
3.10.7 Operadores de asignacin

La asignacin es una operacin que tiene como efecto dar valores a una variable:
V=E
Donde V denota una variable y E una expresin, y se lee V se hace E, o hacer V igual a E o a V se le asigna
E. Hay que recordar que esto no es una igualdad relacional, ya que el operador de asignacin ( = ) no
tiene nada que ver con el operador ( == ). Es posible en Java al igual que en C y C++ las hacer las
"combinaciones taquigrficas" para realizar una operacin como por ejemplo la suma y la asignacin con
un solo operador ( += ). La siguiente tabla muestra estas combinaciones:
Operador
+=
-=
*=
/=
%=
&=
|=
^=
<<=
>>=
>>>=

Uso
op1 += op2
op1 -= op2
op1 *= op2
op1 /= op2
op1 %= op2
op1 &= op2
op1 = op2
op1 ^= op2
op1 <<= op2
op1 >>= op2
op1 >>>= op2

Descripcin
op1 = op1 + op2
op1 = op1 op2
op1 = op1 * op2
op1 = op1 / op2
op1 = op1 % op2
op1 = op1 & op2
op1 = op1 op2
op1 = op1 ^ op2
op1 = op1 << op2
op1 = op1 >> op2
op1 = op1 >>> op2

42

Tabla de operadores de asignacin de Java

3.10.8 Operadores especiales

Hay algunos operadores especiales que son utilizados para convertir, crear o comprobar.
Para convertir tipos de datos
Hay que recordar que Java es un lenguaje fuertemente tipeado (no se pueden operar datos de
distinto tipo). En caso de operaciones donde as se requiera, existe la posibilidad de realizar una
conversin explcita de tipo (cast de C). De esta forma se convierte el contenido de una variable
(de un determinado tipo) al tipo que se exprese entre parntesis. Un ejemplo podra ser:
int a; long b; a = (int) b;
En las operaciones de asignacin cuando queremos hacer alguna conversin de tipo hay que
hacerlo de manera explcita, no funciona como en lenguaje C que hay conversiones implcitas.
Para crear objetos
La asignacin de objetos incluye el operador new, el cual es usado para invocar al constructor
de la clase del objeto que se quiere instanciar, ejemplo:
int num = 123;
Long unodostres = new Long ( num );
Para comprobar
El operador instanceof se utiliza para probar la clase de un objeto, ejemplo;
boolean burro;
Persona p;
Estudiante pepito; // Estudiante es una subclase de Persona
p = new Persona();
pepito = new Estudiante();
burro = p instanceof Persona; // p ser true
burro = p instanceof String;

// p ser false

burro = pepito instanceof Persona; // pepito ser true porque pepito


// es una subclase de Persona
3.10.9 Modificadores
Los modificadores en el lenguaje de programacin Java se usan para modificar la durabilidad,
accesibilidad o comportamiento de una clase, variable o mtodo. La tabla muestra la
aplicabilidad de cada modificador a clases, mtodos y variables.
Almacenamiento y duracin de los modificadores.
En las siguientes secciones describiremos el almacenamiento y la duracin de los siguientes
modificadores: abstract, static, synchronized, native, volatile, trasient y final.
Aplicacin de modificadores a clases, mtodos y variables
Modificador

Clases

Clases
de
miembro

Mtodo de
miembro

Variables de
miembro

Variables
locales

43

abstract

final

native

private

protected

public

static

strictfp

synchronized

transient

volatile

3.10.9.1 Modificadores de almacenamiento

El modificador abstract
Cuando se aplica a una clase, el modificador abstract indica que la clase no se ha implementado
por completo y no se debe instanciar, esto es, puede haber un mtodo implementado y otros
no. Si se pone abstract a la declaracin de mtodo de un miembro, indicar que este se
implementar dentro de una subclase ( si no lo hace el compilador de Java se lo recordar ).
Como un mtodo abstracto no tiene ninguna implementacin, no se podr instanciar la clase,
por lo que se tendr que declarar esa clase como abstracta. Por defecto, las interfaces son
abstract.
El modificador static
Generalmente, cada instancia de una clase tiene su propia copia de cualquier variable de los
miembros. Tambin se puede designar una de esas variables a la propia clase,
independientemente de los objetos que posea. A este tipo de variables se las conoce como
miembros estticos y su declaracin se efectuar con el modificador static. Este tipo de
variables se suelen utilizar para registrar informacin sobre los distintas instancias de una clase.
La clase que se muestra a continuacin registra el nmero de instancias que utiliza de una
misma clase a travs de una variable esttica llamada cuentaInstancias;
public class MiClass {
pulic static int cuentaInstancias;
public MiClass ( ) {
// cada vez que se invoca al constructor,
// se aumenta una unidad al contador
cuentaInstancias++;
}
static {
cuentaInstancias = 0;
}
}

44

Obsrvese que para iniciar la variable esttica se ha utilizado un iniciador esttico. Los mtodos
tambin se pueden declarar como estticos. Por ejemplo, cuentaReset() es un mtodo esttico
que puede reiniciar la variable cuentaInstancias de MiClass.
public class Miclass {
public static int cuentaInstancias;
public MiClass ( ) {
// cada vez que se invoca al constructor,
// se aumenta una unidad al contador
cuentaInstancias++;
}
public static void cuentaReset( ) {
cuentaInstancias = 0;
}
static {
instanceCount = 0;
}
}
Al mtodo cuentaReset() se le puede invocar a travs de la clase MiClass o de uno de sus
instancias o ejemplares:
m = new MiClass ( ); // cuentaInstancia ser igual a 1 despus de la llamada
// del constructor
n = new MiClass ( ); // cuentaInstancia ser igual a 2 despus de la llamada
// del constructor
System.out.println(""+ MiClass.cuentaInstancias + " instancias han sido creadas);
m.cuentaReset ();
//reinicia el contador
MiClass.cuentaReset( ); // otra forma de reiniciar el contador
La clase System, que se encuentra dentro del paquete java.lang de la interfaz API, define sus
propios mtodos pblicos y variables como static. El acceso a la variables y funciones se
efecta a travs de la propia clase System. De hecho, su constructor es privado por lo que no
se podr crear ningn objeto System con el cdigo usual.
System MiSystem = new System( ); // esto es illegal
En vez de eso, para acceder a las variables y funciones de la clase System, se utiliza la propia
clase.
Recuerde uno de los ejemplos anteriores donde imprimamos informacin en la consola utilizando
el siguiente cdigo:
System.out.printin("Hola bienvenido a tu curso bsico de Java");
La variable out es esttica del tipo PrintStream. Se define en la propia interfaz de la siguiente
manera:
public final static PrintStream out;
Como la clase System define sus propias funciones como static, podemos llamar al mtodo
currentTimeMillis() para obtener el tiempo actual a travs de la siguiente expresin:
long timeNow = System.currentTimeMillis();

45

El mtodo currentTimeMillis() se define dentro de la clase System de esta forma:


public static native long currentTimeMillis()
El modificador synchronized
Una funcin de un miembro sincronizado slo permite que se utilice un thread para ejecutar la
funcin. De esta forma se evita que dos thread puedan interferirse mutuamente.
Por ejemplo, supongamos que tenemos dos threads, Uno y Dos, que se utilizan para actualizar el
balance de un banco. Supongamos que una cuenta tiene $100. Ahora, de forma simultnea,
Uno trata de depositar $50 en la cuenta, mientras que Dos depositar $75. Ambos thread
tratarn de obtener un extracto inicial de la cuenta. Ambos ven que el saldo es de 100$. Cada
uno de ellos, por separado, tratar de depositar su dinero y de hacer un balance de la nueva
cantidad. Si Uno termina el ltimo, el saldo de la cuenta ser de 150$. Si lo hace Dos, ser de
$175. Obviamente, ninguno de estos saldos es el correcto. La cuenta debera tener realmente
225$ (100 + 50$ + 75). El problema es que ambos utilizan el mismo cdigo a la vez (solicitar y
actualizar el balance). Este problema es el que se evita con la sincronizacin.
Por defecto, los mtodos de sincronizacin no son estticos, pero se pueden declarar como tales.
El modificador synchronized no se aplica a las clases o a las variables de los miembros, pero se
puede aplicar a bloques de cdigo.
El modificador native
Los mtodos nativos se implementan en otros lenguajes de programacin como C, de modo que
carecen de bloque de cdigo. La mayora de las clases que se encuentran dentro de la API Core
son nativas porque han de acceder al sistema operativo (a unas rutinas especficas, como
aquellas que permiten dibujar algo en la pantalla). El modificador native se aplica solamente a
mtodos.
public static native double sin (double x);
Esta declaracin llama a una funcin que se encuentra en la biblioteca de cdigo nativo para que
calcule el seno del ngulo x. En una plataforma Internet x86, el cdigo nativo debera llamar a la
funcin seno del procesador o del coprocesador. En otras plataformas, la funcin nativa puede
encargarse de hacer los clculos. Esta funcin tambin se podr declarar con los modificadores
static y public.
El modificador volatile
Una variable voltil es aquella cuyo valor puede cambiar de forma independiente al programa
Java. Generalmente, este tipo de variables representa una entrada procedente del mundo
exterior, como por ejemplo la hora. Tambin se utilizan para mostrar variables a las que pueden
modificar los thread de ejecucin. La palabra clave volatile evitar que el compilador registre
sus cambios. Se supondr que su valor cambia frecuentemente. El uso de este modificador es
bastante raro. Puede parecer necesario, pero carece de compatibilidad en la implantacin
subyacente. En otras palabras, no se preocupe por l.
El modificador transient
El modificador transient se utiliza junto con la serializacin para suministrar objetos
persistentes. Estos objetos se pueden guardar en el disco y recuperar en cualquier mquina. El
modificador transient indica que no se guarde la variable.

46

El modificador final
La mayora de los lenguajes de programacin tienen una forma de declarar una variable como
constantes (es decir, que no cambia), y es algo que tambin se cumple en Java. La palabra
reservada final indica que la variable local o del miembro no se puede modificar. Se suele
utilizar con las constantes simblicas. Puede hacer referencia a una constante por su nombre y
definir ese nombre en una nica localizacin de su cdigo. Si posteriormente necesita modificar
el valor en su cdigo, slo debe realizar el cambio en el punto donde defini la variable final.
Si se declara una variable como final, se tendr que reiniciar al mismo tiempo:
final int MAXIMO = 223;
o inicializarla con una asignacin que nunca cambiar:
final int MAXIMO;
MAXIMO = 223;
Por ejemplo, con variables de instancia, puede inicializar variables de instancia finales en cada
constructor.
Las funciones y clases de un miembro tambin se pueden declarar como finales. Un mtodo de
miembro final no se podr anular y una clase final no podr ser una subclase.
El modificador Strictfp
El modificador Strictfp se usa con clases y con mtodos. Si especificamos una clase como
Strictfp, indicar que todos los mtodos son Strictfp, donde "fp" significa punto flotante. Si
especificamos que un mtodo es Strictfp, todas las expresiones de ese mtodo deben seguir la
especificacin de punto flotante IEEE 754. Cuando un mtodo no es estricto, el sistema de
tiempo de ejecucin puede ser ms agresivo optimizando las operaciones de punto flotante,
buscando velocidad por encima de la predicibilidad.

3.10.9.2 Modificadores de accesibilidad


Java tiene modificadores que se utilizan para diferenciar la accesibilidad de las clases y la de sus
miembros a otras clases, estos son private, protected y public. El delimitador por omisin es
el conocido como acceso de paquete o acceso por default , veamos:
private: Restringe el acceso
a los miembros de su clase de
tal forma que ninguna otra
pueda llamar a sus mtodos o
acceder directamente a sus
variables. Este modificador
protege a nivel de clase, pero
no a nivel de instancia. Todas
las instancias de una clase
pueden acceder a todas las
variables privadas en todas las
instancias, no solo en su
propia instancia.

Acceso

Cuando

por

no

se

omisin:

especifica

47

ningn modificador se dice


que se tiene un acceso por
default, esto es, un miembro
con acceso por defecto
proporciona a otras clases
dentro del mismo paquete,
acceso a miembros de clase.

protected: Un miembro con el modificador protected se parece al acceso por omisin, pero
otorga cierto acceso privilegiado a las subclases de otros paquetes. Frecuentemente los
mtodos se crean para utilizarse dentro de la propia clase ( y no para su utilizacin general ).
Si se declaran como protected las podremos utilizar dentro de la clase y todas sus subclases.

public: El modificador public no restringe el acceso. Cualquier parte del cdigo puede
acceder a clases, mtodos y variables de miembros.

En la figura hay dos barras para cada modificador. La barra superior representa la capacidad
de heredar una variable o mtodo miembro. La segunda barra muestra la accesibilidad de un
miembro, as por ejemplo las variables y mtodos declarados protected tienen las siguientes
caractersticas:

Las subclases las heredarn, independientemente de que se encuentren en el mismo


paquete o no. Esto permite a una subclase acceder a esos miembros solamente en instancias
de la subclase.

Cualquier clase del mismo paquete podr acceder a ellas, pero en caso contrario no
sern accesibles.

Las siguientes tablas resumen los modificadores que pueden aparecer en las declaraciones de
clases, campos, variables locales, constructores y mtodos.

Modificadores de clase
Modificador

Significado

public

Es accesible a todas las otras clases, ya sea


directamente o por herencia. Son accesibles por todas
las clases que estn en su mismo paquete y por todas
aquellas clases que la importen (import)

abstract

La clase no pueden ser instanciada, su utilidad para la


herencia.

final

No puede declarar subclases, esto es, ninguna otra


clase puede heredar de sta. En la jerarqua de clases
stas se encontrarn en la parte inferior de la jerarqua.

Significa que todos los mtodos que acceden a esta


clase lo hacen de forma sincronizada, o sea, que slo
synchronizable podrn entrar de uno en uno dejando en exclusin
mutua uno de los mtodos para que operen con la
clase.

48

Modificadores de constructores
Modificador

Significado

public

Es accesible a todas las otras clases

protected

Es accesible solo dentro de su propia clase y subclases

private

Es accesible solo dentro de su propia clase

Modificadores de campo (de variables miembros de una clase )


Modificador

Significado

public

Es una variable pblica. Esta puede ser accesible en el paquete


donde fue declarada, o en cualquier otro paquete. (ver ejemplo:
publico.zip )

protected

Es una variable protegida. Es accesible solo por aquellos mtodos


que se encuentren en el mismo paquete o bien por las subclases
que hereden de la clase en donde se encuentra declarada. (ver
ejemplo: protegido.zip )

private

Es una variable privada. Solo los mtodos de clase donde sta


definida pueden acceder a ella. (ver ejemplo: Beta050802.java )

static

Es una variable esttica. Ser una variable permanente.


Solamente un valor del campo existe para todas las instancias de
la clase (variable de clase). Por lo tanto slo hay una variable con
ese nombre para todas las instancias del objeto. La variable ser
instanciada en tiempo de compilacin. (ver ejemplo:
Ejemplo1Arr.java )

transient

Es una variable declarada transitoria y no forma parte del estado


permanente o estado persistente de un objeto.

volatile

Es una variable que se modifica en forma asincrnica, o sea se


recarga y almacena en memoria cada vez que se recarga. Puede
ser modificado por hilos asincrnicos

final

Es una variable final. Por lo tanto solo podr tener un valor y ste
no lo podr cambiar o no podr modificarse. Este modificador se
utiliza para especificar una constante.
Las constantes se
especifican, por lo general, como finales, estticas y pblicas.

friendly

Es el acceso por omisin o acceso de paquete. (ver ejemplo:


friendly.zip)

private
protected

Es una variable privada y protegida. Mezcla de las dos cosas, por


tanto, cuando declaramos una variable de este tipo dentro de una
clase slo podrn acceder a ella los mtodos de las subclases que
la deriven y no podrn acceder a ella otras clases del mismo
paquete.

Modificadores de variables locales (dentro de los mtodos)


Modificador

Significado

final

Debe ser inicializado y no puede ser cambiado

49

Modificadores de campo (de variables miembros de una clase )


Modificador

Significado

public

Es una variable pblica. Esta puede ser accesible en el


paquete donde fue declarada, o en cualquier otro paquete.
(ver ejemplo: publico.zip )

protected

Es una variable protegida. Es accesible solo por aquellos


mtodos que se encuentren en el mismo paquete o bien por
las subclases que hereden de la clase en donde se encuentra
declarada. (ver ejemplo: protegido.zip )

private

Es una variable privada. Solo los mtodos de clase donde


sta definida pueden acceder a ella. (ver ejemplo:
Beta050802.java )

static

Es una variable esttica. Ser una variable permanente.


Solamente un valor de el campo existe para todas las
instancias de la clase (variable de clase). Por lo tanto slo
hay una variable con ese nombre para todas las instancias
del objeto. La variable ser instanciada en tiempo de
compilacin. (ver ejemplo: Ejemplo1Arr.java )
Es una variable declarada transitoria y no
forma parte del estado permanente o
estado persistente de un objeto.

transient

volatile

Es una variable que se modifica en forma asincrnica, o sea


se recarga y almacena en memoria cada vez que se recarga.
Puede ser modificado por hilos asincrnicos

final

Es una variable final. Por lo tanto solo podr tener un valor


y ste no lo podr cambiar o no podr modificarse. Este
modificador se utiliza para especificar una constante. Las
constantes se especifican, por lo general, como finales,
estticas y pblicas.

friendly

Es el acceso por omisin o acceso de paquete. (ver ejemplo:


friendly.zip)

private protected

Es una variable privada y protegida. Mezcla de


cosas, por tanto, cuando declaramos una variable
tipo dentro de una clase slo podrn acceder a
mtodos de las subclases que la deriven y no
acceder a ella otras clases del mismo paquete.

las dos
de este
ella los
podrn

4. Control de Flujo con


Al igual que otros lenguajes, Java tiene sentencias de control de flujo y su sintaxis es muy similar al
del lenguaje C. Por lo tanto estas sentencias de flujo siguen el teorema de la programacin
estructurada, conocido tambin como el teorema de Bhm y Jacopini que dice:
Un programa propio puede ser escrito utilizando nicamente tres tipos de estructuras de control de
secuencia:

Secuencial
Selectiva
Repetitiva

Hay que recordar que un programa propio es aquel que cumple las propiedades de tener un solo

50

punto de entrada y uno de salida, donde toda sentencia (instruccin) del algoritmo es accesible, esto
es, existe al menos un camino que va desde el inicio hasta el fin del algoritmo, se puede seguir y pasa
a travs de dicha sentencia y no tiene ciclos o bucles infinitos
4.1 Flujo secuencial
La estructura secuencial es trivial, esto es, una concatenacin de instrucciones o sentencias de
principio a fin

4.1.1 Ejemplos flujo secuencial

Ejemplo de estructura secuencial.


Problema 1.0
Haga el programa en java tal, que dados los valores de a = 5.6 , b = 7.0 , y c = 3.0 (lados de
un trangulo) calcule p y su rea S.

p = (a + b + c)/2 ,

Diagrama de flujo de Solucin del problema 1.0.

51

Cdigo de una posible solucin al ejemplo 1.0


Si quieres obtener elcdigo clic con el botn derecho aqu AreaTriangulo.zip
//import java.io.DataInputStream;
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Fecha: 15 mayo 2000
// Problema 1.0
class AreaTriangulo{
static double lee_doble(String msj) {
DataInputStream stream = new DataInputStream(System.in);
String
strng;
double aux;
// type to read a line from the keyboard.
try {
System.out.print(msj);
strng = stream.readLine();
} catch ( java.io.IOException e ) { strng = "0.0"; }
// Try to convert this value into a double data type.
try {
aux = Double.valueOf(strng).doubleValue();
} catch ( java.lang.NumberFormatException e) { aux = 0.0; }
}

return aux;

52

public static void main (String args[] ) {


double
a,b,c;
double
s,p;
System.out.println("Calcular Area de un triangulo");
a = lee_doble("Dame lado a: ");
b = lee_doble("Dame lado b: ");
c = lee_doble("Dame lado c: ");
System.out.println("a= "+ a + " b = " + b + " c= " + c);
p = ( a + b + c ) / 2.0;
System.out.println("p= " + p);
s = Math.sqrt( p*(p-a) * (p-b) * (p-c) );
System.out.println("Area = " + s );

System.out.println("fin del programa");

4.2 Selectiva simple


Hay de tres variantes de la estructura de control de flujo selectiva; la estructura selectiva simple, la
doble y la mltiple.
Estructura de control de flujo selectiva simple

4.2.1 La sentencia if
El siguiente diagrama nos da la sintaxis de la instruccin if, de decisin simple, entre parntesis se
pone la expresin la cual debe dar un valor booleano true o false , ( en Java la expresin debe dar
un valor de verdad false o true, no es como en lenguaje C que la expresin puede dar cero y se toma
como falso y un valor diferente de cero como verdadero ), si es true la expresin es verdadera,
entonces se realiza el conjunto de sentencias, pero si es false se transfiere el control de flujo
despus de la llave que cierra el mbito del bloque if.

53

4.2.2 Ejemplos seleccin simple


Problema 2.0
Construya un algoritmo con diagrama de flujo y en pseudocdigo tal que, dados los valores enteros P
y Q, determine si los mismos satisfacen la siguiente expresin:

En caso afirmativo debe imprimir los valores P y Q.


Diagrama de solucin del Problema 2.0

54

Cdigo de una posible solucin al ejemplo 2.0


Si quieres obtener elcdigo clic con el botn derecho aqu ExpresionBooleana.zip
import java.io.DataInputStream;
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Fecha: 15 mayo 2000
// Problema 2.0
class ExpresionBooleana {
double

p,q;

static double lee_doble(String msj) {


DataInputStream stream = new DataInputStream(System.in);
String
strng;
double aux;
// type to read a line from the keyboard.
try {
System.out.print(msj);
strng = stream.readLine();
} catch ( java.io.IOException e ) { strng = "0.0"; }
// Try to convert this value into a double data type.
try {
aux = Double.valueOf(strng).doubleValue();
} catch ( java.lang.NumberFormatException e) { aux =
0.0; }
}

return aux;

boolean expresionbooleana( ExpresionBooleana x )


{
return ( ( Math.pow(x.p, 3) + Math.pow(x.q, 4) - 2 *
Math.pow(x.p, 2) ) < 680 );
}
public static void main (String args[] ) {
ExpresionBooleana e = new ExpresionBooleana ();
e.p = lee_doble("Dame P: ");
e.q = lee_doble("Dame Q: ");
if ( e.expresionbooleana(e) )
System.out.println("Los valores de P y Q \n " +
"que satisfacen son : \n" +
"P=" +e.p + "\tQ=" +e.q );
}

System.out.println("fin del programa");

55

}
4.3 Selectiva doble
A continuacin vamos a analizar la estructura selectiva doble o tambin conocida como if - else .
Veamos el siguiente figura:

4.3.1 La sentencia if-else


El siguiente diagrama nos da la sintaxis de la instruccin if-else, de decisin doble , entre parntesis
se pone la expresin la cual debe dar un valor booleano true o false . Si es true la expresin es
verdadera, entonces se realiza el primer conjunto de sentencias, pero si es false se transfiere el
control de flujo al segundo bloque de sentencias correspondente al else.

56

4.3.2 Ejemplos seleccin doble


Problema 3.0
Haga el programa en java tal, que dada la calificacin de un alumno en un curso de computacin que
consiste en el promedio de tres exmenes de la siguiente forma: CAL = (EX1 + EX2 + EX3) / 3.0
; escriba aprobado si su calificacin es mayor que 7.5 y reprobado en caso contrario. Las
calificaciones deben ser ledas para calcular la variable CAL.
Diagrama de flujo de Solucin del problema 3.0.

Cdigo de una posible solucin al ejemplo 3.0


Si quieres obtener elcdigo clic con el botn derecho aqu Examen.zip
import java.io.DataInputStream;
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Fecha: 15 mayo 2000
// Problema 3.0
class Examen {
double

ex1,ex2,ex3;

static double lee_doble(String msj) {


DataInputStream stream = new DataInputStream(System.in);
String
strng;
double aux;

57

// type to read a line from the keyboard.


try {
System.out.print(msj);
strng = stream.readLine();
} catch ( java.io.IOException e ) { strng = "0.0"; }
// Try to convert this value into a double data type.
try {
aux = Double.valueOf(strng).doubleValue();
} catch ( java.lang.NumberFormatException e) { aux = 0.0; }
}

return aux;

double promedio( Examen x )


{
return (x.ex1 + x.ex2 + x.ex3 ) / 3.0;
}
public static void main (String args[] ) {
Examen e = new Examen();
e.ex1 = lee_doble("Dame calif. examen 1: ");
e.ex2 = lee_doble("Dame calif. examen 2: ");
e.ex3 = lee_doble("Dame calif. examen 3: ");
System.out.println("Calif. examen 1= " + e.ex1 );
System.out.println("Calif. examen 2= " + e.ex2 );
System.out.println("Calif. examen 3= " + e.ex3 );
System.out.println("Promedio = " + e.promedio(e) );
if ( e.promedio(e) >= 7.5 )
System.out.println("A P R O B A D O ");
else
System.out.println("R E P R O B A D O ");

System.out.println("fin del programa");

4.4 Selectiva mltiple


La ltima variante de la estructura de control de flujo selectiva; la estructura selectiva mltiple ,
utilizada para mltiples alternativas. Como veremos se utiliza el if else-if ... else-if else y el switch
- case. Como veremos, utilizamos el if mltiple cuando los valores que toma una variable que se
quiere determinar en la expresin booleana son continuos, y en el caso del switch - case cuando los
valores de expresin booleana son discretos.
4.4.1 La sentencia if else-if ... else-if else
El siguiente diagrama nos da la sintaxis de la instruccin if else-if ... else-if else, de decisin
mltiple. ( tambin conocidos como if encadenados ).
Entre parntesis se pone la expresin1 la cual debe dar un valor booleano true o false ,

si es

58

true la expresin1 es verdadera, entonces se realiza el primer conjunto de sentencias, pero si es


false se transfiere el control de flujo al primer else-if para evaluar la expresin2. Si esta es true
entonces se ejecutan el segundo conjunto de sentencias , pero si es false entonces se transfiere el
control del flujo al siguiente else-if, y as sucesivamente hasta llegar al ltimo else-if.
En caso de que ninguno de los if y else-if fueran true se ejecutar el ltimo conjunto de sentencias
dentro del bloque else, el cual garantiza que por lo menos algo se har si ninguno fue verdadero.

4.4.2 Ejemplos seleccin mltiple ( if anidados )


Problema 4.0
Haga el diagrama de flujo tal que, dado como dato una temperatura en grados Centgrados,
calcule los grados Fahrenheit y determine el deporte que es apropiado practicar a esa temperatura,
teniendo en cuenta lo siguiente tabla:

59

DEPORTE
Natacin
Tenis
Golf
Esqu
Marcha

TEMPERATURA en grados Fahrenheit


> 85
70 < TEMP <= 85
32 < TEMP <= 70
10 < TEMP <= 32
<= 10

Diagrama de flujo de Solucin del problema 4.0.

Cdigo de una posible solucin al ejemplo 4.0


Si quieres obtener elcdigo clic con el botn derecho aqu Deporte.zip
import java.io.DataInputStream;
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Fecha: 15 mayo 2000
// Problema 4.0
class Deporte {
double

c,f;

static double lee_doble(String msj) {


DataInputStream stream = new DataInputStream(System.in);
String
strng;
double aux;

60

// type to read a line from the keyboard.


try {
System.out.print(msj);
strng = stream.readLine();
} catch ( java.io.IOException e ) { strng = "0.0"; }
// Try to convert this value into a double data type.
try {
aux = Double.valueOf(strng).doubleValue();
} catch ( java.lang.NumberFormatException e) { aux = 0.0; }
return aux;
}
static double ctofarenheit(double c )
{
return (9/5)*c + 32 ;
}
static String deporteapracticar( Deporte depo)
{
if ( depo.f > 85 )
return "Practica Natacion";
else
if ( depo.f <= 85 && depo.f > 70 )
return "Practica Tenis";
else
if ( depo.f <= 70 && depo.f > 32 )
return "Practica Golf";
else
if ( depo.f <= 32 && depo.f > 10 )
return "Practica Esqui";
else
if ( depo.f <= 10 )
return "Practica Marcha";
return " **Fuera de Rango ** ";
}
public static void main (String args[] ) {
Deporte sport = new Deporte();
System.out.println("De la temperatura en grados centigrados" );
sport.c = lee_doble("Dame los grados centigrados C: ");
sport.f = ctofarenheit( sport.c );
System.out.println("Grados Centigrados= " + sport.c );
System.out.println("Grados Farenheit = " + sport.f );
System.out.println("Deporte a practicar : " + deporteapracticar( sport ) );

System.out.println("fin del programa");

La salida del programa al ejecutarlo con el comando java Deporte es:

61

De la temperatura en grados centigrados


Dame los grados centigrados C: Grados Centigrados= 23.0
Grados Farenheit = 55.0
Deporte a practicar : Practica Golf
fin del programa

4.5.1 La sentencia while


El siguiente diagrama nos muestra la sintaxis del ciclo repetitivo while, el cual funciona as:
primeramente se evala la expresin, si es true se ejecuta el bloque o conjunto de sentencias hasta
que de lo contrario si la expresin es false se transfiere el control despus de la llave que cierra el
bloque de instrucciones. Debido a que la evaluacin de la instruccin se hace al principio, el conjunto
o bloque de sentencias puede no ejecutarse ni una sola vez.

4.5.2 Ejemplos de ciclo while


Haga el programa en Java que calcule e imprima la suma de los primeros N nmeros enteros
positivos pero con el ciclo while .

Diagrama de flujo de Solucin del problema 5.0. (con ciclo while)

62

Cdigo de una posible solucin al ejemplo 5.0 (con ciclo while)


Si quieres obtener elcdigo clic con el botn derecho aqu SigmaWhile.zip
import java.io.DataInputStream;
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Fecha: 15 mayo 2000
// Problema 5.0
class Sigma {
static long

n;

static double lee_doble(String msj) {


DataInputStream stream = new DataInputStream(System.in);
String
strng;
double aux;
// type to read a line from the keyboard.
try {
System.out.print(msj);
strng = stream.readLine();
} catch ( java.io.IOException e ) { strng = "0.0"; }
// Try to convert this value into a double data type.
try {
aux = Double.valueOf(strng).doubleValue();
} catch ( java.lang.NumberFormatException e) { aux = 0.0; }
return aux;
}

63

static long sumatoria( long limite )


{
long i,sum = 0l;
i = 1;
while ( i <= limite )
sum += i++;
return sum;
}
public static void main (String args[] ) {
System.out.println("Programa que calcula e imprime la suma de");
System.out.println("los primeros N nmeros enteros positivos" );
System.out.println("con el ciclo while ");
Sigma.n = (long) lee_doble("Dame N: ");
System.out.println("------RESULTADOS---------");
System.out.println("N = " + Sigma.n );
System.out.println("la suma es:" + Sigma.sumatoria( Sigma.n ) );
}
}

La salida del programa al ejecutarlo con el comando java SigmaWhile es:


Programa que calcula e imprime la suma de
los primeros N nmeros enteros positivos
con el ciclo while
Dame N: ------RESULTADOS--------N = 100
la suma es:5050
Finished executing
4.6 Ciclo do-while
La estructura de control de flujo do-while (Repetir-hasta) es otra de las estructuras de repeticin
que se usan frecuentemente.

4.6.2 Ejemplos ciclo do-while


Haga el programa en Java que calcule e imprima la suma de los primeros N nmeros enteros
positivos, pero con el ciclo do-while .
Diagrama de flujo de Solucin del problema 5.0. (con ciclo do-while)

64

Cdigo de una posible solucin al ejemplo 5.0 (con ciclo while)


Si quieres obtener elcdigo clic con el botn derecho aqu SigmaDoWhile.zip
import java.io.DataInputStream;
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Fecha: 15 mayo 2000
// Problema 5.0
class Sigma {
static long

n;

static double lee_doble(String msj) {


DataInputStream stream = new DataInputStream(System.in);
String
strng;
double aux;
// type to read a line from the keyboard.
try {
System.out.print(msj);
strng = stream.readLine();
} catch ( java.io.IOException e ) { strng = "0.0"; }
// Try to convert this value into a double data type.
try {
aux = Double.valueOf(strng).doubleValue();
} catch ( java.lang.NumberFormatException e) { aux = 0.0; }
return aux;
}
static long sumatoria( long limite )
{

65

long i,sum = 0l;


i = 1;
do {
sum += i++;
} while ( i <= limite );
return sum;
}
public static void main (String args[] ) {
System.out.println("Programa que calcula e imprime la suma de");
System.out.println("los primeros N nmeros enteros positivos" );
System.out.println("con el ciclo do-while ");
Sigma.n = (long) lee_doble("Dame N: ");
System.out.println("------RESULTADOS---------");
System.out.println("N = " + Sigma.n );
System.out.println("la suma es:" + Sigma.sumatoria( Sigma.n ) );
}
}

La salida del programa al ejecutarlo con el comando java SigmaDoWhile es:


Programa que calcula e imprime la suma de
los primeros N nmeros enteros positivos
con el ciclo do-while
Dame N: ------RESULTADOS--------N = 100
la suma es:5050
Finished executing

4.7 Ciclo for


Estructura de control de flujo for ( Para ) es ampliamente utilizada como estructura de control de flujo
de ciclo cuando sabemos de antemano cuantas ciclos o iteraciones queremos.

4.7.1 La sentencia for


En el siguiente diagrama se muestra la sintaxis del ciclo repetitivo for, el cual funciona as:
primeramente se ejecuta la expresin1 ( que es la parte de inicializacin de las variables contador
del ciclo o donde se asignan valores iniciales a los contadores ), despus se evala pro primera vez la

66

expresin2 que es booleana y si da true entonces se ejecuta el bloque de sentencias, pero si da


false entonces se finaliza el ciclo transfirindose el control de flujo despus de la llave que cierra el
bloque.
Se preguntar Cundo se evala la expresion3 ? , esta se evala primeramente en la segunda
pasada o en la segunda iteracin, y posteriormente se pasa a evaluar de nuevo la expresin2,
despus se vuelve a hacer la prueba lgica de la expresin2 y as sucesivamente hasta que la
expresin2 sea false. Observe en el diagrama que la expresin1 solo se evala una vez ( en la
inicializacin ).

Puede omitirse una , dos o las tres expresiones, y las variables contador de la expresin1 pueden
ser reales, esto es, de tipo float o double, y no solamente int, byte, char, long, etc,. As segn
sea el caso , los siguientes fragmentos de cdigo son equivalentes:
// caso 1
//caso
2 // caso 3
long i, sum = 0l;
long i= 1 , sum = 0l;
for( i=1 ; i <= limite ; long i = 1 , sum = 0l;
for( ; i <= limite ; i++ )
for( ; i <= limite ; )
i++ )
sum += i;
sum += i++;
sum += i;
// caso 4
long i = 1 , sum = 0l;
for( ; ; ) {
if ( i <= limite ) break;
sum += i++;
}
En los 4 casos el resultado es el mismo, pero es en el caso 4 es donde se omiten las tres expresiones
del for y en este la condicin lgica es un if con un break , el break como veremos es una
instruccin de control de flujo de Java el cual se utiliza para el rompimiento del control del flujo y
puede utilizarse en todos los ciclos y en los if y switch.
4.7.2 Ejemplos ciclo for
Haga el programa en Java que calcule e imprima la suma de los primeros N nmeros enteros
positivos pero con el ciclo for .
Diagrama de flujo de Solucin del problema 5.0. (con ciclo for)

67

Cdigo de una posible solucin al ejemplo 5.0 (con ciclo for)


Si quieres obtener elcdigo clic con el botn derecho aqu SigmaFor.zip

import java.io.DataInputStream;
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Fecha: 15 mayo 2000
// Problema 5.0
class SigmaFor {
static long

n;

static double lee_doble(String msj) {


DataInputStream stream = new DataInputStream(System.in);
String
strng;
double aux;
// type to read a line from the keyboard.
try {
System.out.print(msj);
strng = stream.readLine();
} catch ( java.io.IOException e ) { strng = "0.0"; }

68

// Try to convert this value into a double data type.


try {
aux = Double.valueOf(strng).doubleValue();
} catch ( java.lang.NumberFormatException e) { aux = 0.0; }
return aux;
}

static long sumatoria( long limite )


{
long i,sum=0l;
for(i=1; i<=limite; i++)
sum += i;
return sum;
}
public static void main (String args[] ) {
System.out.println("Programa que calcula e imprime la suma de");
System.out.println("los primeros N nmeros enteros positivos" );
Sigma.n = (long) lee_doble("Dame N: ");
System.out.println("------RESULTADOS---------");
System.out.println("N = " + Sigma.n );
System.out.println("la suma es:" + Sigma.sumatoria( Sigma.n ) );
}
}

La salida del programa al ejecutar el comando java SigmaFor es:


Programa que calcula e imprime la suma de
los primeros N nmeros enteros positivos
con el ciclo repetitivo for.
Dame N: ------RESULTADOS--------N = 100
la suma es:5050
Finished executing
4.8 Sentencia switch
La estructura de control de flujo selectiva mltiple, para el caso de varias alternativas ; Como vimos a
veces se utiliza el if else-if ... else-if else y el switch-case. Aqu veremos, que se utiliza el
switch-case cuando la expresin que se quiere determinar arroja valores que son discretos para
cada caso que se quiera evaluar.

69

4.8.1 La sentencia switch


En el siguiente diagrama se muestra la sintaxis de la sentencia switch y como podemos ver
primeramente se evala la expresin expr que esta dentro del parntesis; despus dependiendo de
el valor si es el caso de que valga c1 entonces se efecta el bloque del primer conjunto de sentencias
hasta su rompimiento con la instruccin break la cual transfiere el control del flujo hasta despus de
la ltima llave que cierra la sentencia switch.
El uso de break es importante porque si se omite se pasa a hacer el segundo , tercero, etc., bloques
de instrucciones.
Dependiendo del valor de expr, si es c2, ejecutara el segundo bloque de sentencias, si el valor de
expr fuera c3 ejecutara el tercer bloque de sentencias y as sucesivamente hasta los cn valores
posibles de expr.

70

4.8.2 La sentencia switch con default


En el siguiente diagrama se muestra la sintaxis de la sentencia switch-default y como podemos es
una variante de la sentencia switch. La diferencia estriba en el uso de una alternativa que se puede
dar por omisin.
El uso de default es importante porque si expr no coincide con ninguno de los valores c1, ni c2, ... ,
cn entonces se ejecutan las sentencias del bloque default hasta el break que trasfiere el control de
flujo despus de la llave que cierra de la sentencia switch.

71

4.8.3 Ejemplos sentencia switch


Se desea escribir un programa para estadstica que permita obtener la media aritmtica, varianza, la
desviacin tpica y mediana de una muestra de poblacin de acuerdo con las siguientes condiciones:

El programa debe manejar un men interactivo que tengan opciones para introducir datos
del teclado, introducir datos leyndolos de un archivo, ver datos por pantalla, guardar los datos y
resultados en un archivo, y en dicho men debe haber una opcin para salir y otra para continuar
A continuacin veremos una posible solucin al programa que simula un men de opciones para un
programa estadstico:
Cdigo de ejemplo de un men usando la estructura de control de flujo de seleccin mltiple switch.
Si quieres obtener elcdigo clic con el botn derecho aqu MisMenus.zip
import utilerias.Escri;
import java.io.*;
/**
* Programa de java que utiliza un men iteractivo
* implementado con la instruccin switch para un
* programa de estadistica que utilizar arreglos.

72

* y usa el paquete utilerias.Escri que tiene mtodos tiles


* para escribir por pantalla
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: MisMenus.java
* paquete utilizado : utilerias.Escri
* Fecha : 13/10/2003
*/
public class MisMenus {
static String mimenu = new String( "BIENVENIDOS A MI MENU ESTADISTICO \n\n" +
"( 1 ) <==== Leer datos por Teclado \n" +
"( 2 ) <==== Leer datos por Archivo \n" +
"( 3 ) <==== Hacer los calculos estadisticos \n" +
"( 4 ) <==== Despliega por pantalla resultados \n" +
"( 5 ) <==== Manda resultados a Archivo \n" +
"( 0 ) <==== Salir \n" );
static double lee_doble(String msj) {
DataInputStream stream = new DataInputStream(System.in);
String
strng;
double aux;
// type to read a line from the keyboard.
try {
System.out.print(msj);
strng = stream.readLine();
} catch ( java.io.IOException e ) { strng = "0.0"; }
// Try to convert this value into a double data type.
try {
aux = Double.valueOf(strng).doubleValue();
} catch ( java.lang.NumberFormatException e) { aux = 0.0; }
return aux;
}
static int escribemenu() {
int opcion;
do {
Escri.benl( mimenu );
opcion = (int) lee_doble("Cual es tu opcin ");
if ( opcion < 0 || opcion > 5 )
Escri.benl(" No seas tonto(a) \n" +
"selecciona solo el [1,2,3,4,5,0] nada mas");
} while ( opcion < 0 || opcion > 5 );
return opcion ;
} // fin de escribemenu()
public static void main ( String[] args ) {
while ( true ) {
switch ( escribemenu() ) {
case 1 : Escri.benl("voy a leer datos por teclado"); break;
case 2 : Escri.benl("voy a leer datos por archivo"); break;
case 3 : Escri.benl("voy a hacer los calculos estadisticos"); break;
case 4 : Escri.benl("voy a desplegar por pantalla los resultados"); break;
case 5 : Escri.benl("voy a mandar resultados a una archivo"); break;
case 0 : Escri.benl("ya me voy, gracias por usar el programa Estadistico");

73

System.exit(1);
break;
default : Escri.benl(" selecciona solo el 1,2,3,4,5,0 nada mas");
break;
} // fin del switch
} // fin del while
} // fin del main()
} // fin de la clase MisMenus

Para este programa se utilizan los mtodos be y benl de la clase Escri y estn dentro de un
paquete de clases llamado utilerias y el cdigo esta a continuacin:

package utilerias;
/** Programa de java que utiliza metodos estticos
* utiles para escribir por pantalla
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Escri.java
* paquete: utilerias
* Fecha : 10/10/2003
*/
/** clase Escri
* es una clase utilitaria para escribir mensajes por la consola
* puede ser utilizada para cualquier aplicacin de consola
* con import utilerias.Escri;
* @see <A href="http://www.cic.ipn.mx/ute/ogonzalez/Cursos/javabas/index.htm>
* p&aacute;gina del curso de Java de Oscarin </A>
*
*/
public class Escri {
/** mtodo esttico de clase be()
* firma: public static void be( String msj )
* propsito: Escribir la cadena msj con el mtodo print()
* @param msj es el mensaje que se va a escribir por pantalla
* @return void
*/
public static void be (String msj) {
System.out.print(msj);
}
/** mtodo esttico de clase benl()
* firma: public static void benl ( String msj )
* prosito: Escibir la cadena msj con el mtodo println()
* @param msj es el mensaje o a escribir por pantalla
* @return void
*/
public static void benl (String msj){
System.out.println(msj);
}
} // Fin de Escri

74

La salida del programa al correrlo con el comando java MisMenus es la siguiente:

5. Trabajo con clases y objetos


En este seccin vamos a discutir conceptos estrechamente relacionados con
el paradigma de la programacin orientada a objetos ( POO ).
Primeramente discutiremos los conceptos de clase y objeto, ya que al hablar
de objeto, tenemos que hablar de clase o viceversa.
Luego discutiremos otros conceptos que ataen a las relaciones entre clases
y objetos como son la herencia, encapsulamiento, composicin, el
polimorfismo, etc. Finalmente veremos lo que son las interfaces y como se
puede emplear para la implementacin de herencia mltiple que no existe
en Java pero que con las interfaces podemos hacer que los objetos sean de
diversos tipos como sucede con la herencia mltiple.

5.1 Definicin de clase

Clase : Es una descripcin de atributos y comportamientos de un conjunto de objetos similares. Los

objetos de una clase o tipo determinado comparten los mismos comportamientos y atributos. Las
clases actan en forma muy parecida a una plantilla o molde para galletas en el sentido de que una
clase se utiliza para crear o instanciar objetos

75


Los atributos son caractersticas externas y visibles de una clase. El color de los ojos y del
cabello de una persona, son ejemplos de atributos.

Un comportamiento es la accin que realiza un objeto cuando se le pasa un mensaje o en


respuesta a un cambio de estado; es algo que realiza un objeto.

Un objeto puede ejercer el comportamiento de otro objeto ejecutando una operacin sobre
este ltimo. Los trminos llamada a mtodo, llamada a funcin o paso de mensaje se utilizan en
lugar de realizar una operacin, cada una de estas acciones activa el comportamiento de un objeto

La sintaxis de una simple definicin o declaracin de clase es:

[ modificadores ] class nombre-clase [extends claseSuperior ]


[implements interfaz1, interfaz2, ...interfazn ]
{
}

cuerpo

Donde:

modificadores es opcional y puede ser uno ms de las siguientes tres palabras reservadas:
{ public, abstract, final, synchronizable }
class es una palabra reservada que se utiliza para definir o declarar una clase

nombre-clase es cualquier identificador vlido


extends es una palabra reservada que indica si la clase tiene herencia o es subclase o extensin
de una claseSuperior o superclase

claseSuperior es un identificador o nombre de la superclase de la que hereda atributos y


comportamientos
implements es una palabra reservada que indica si la clase implementa una o varias interfaces

cuerpo es una secuencia de declaraciones de variables, constantes , constructores y mtodos


5.2 Creacin de objetos
Objeto. Un objeto es una cosa, generalmente extrada del vocabulario del espacio del problema o

76

del espacio de la solucin .


Todo objeto tiene:

a otros

Identidad (puede nombrarse o distinguirse de alguna manera de otros objetos )


Estado ( generalmente hay algunos datos asociados a l)
Comportamiento ( se pueden hacer cosas al objeto, y l puede a su vez puede hacer cosas
objetos)

Creacin de Objetos. Todo en Java se trata como un objeto. Se puede manipular objetos a travs
de handles (referencias, identificadores)
El handle o referencia no necesariamente est conectado a un objeto. Ejemplo:
String s;
Solo es creado la referencia pero hay que inicializarlo:
String s = Curso de Java;
Para conectar un handle o referencia a un objeto se usa la palabra llave new que es un operador de
Java y significa mas o menos lo siguiente creame un nuevo objeto de ste tipo o, " crame una
nueva instancia o ejemplar de ste tipo" Ejemplo:
String s = new String(Curso de Java);
El caso de objetos de la clase String es especial, porque puede crearse o instanciarse un objeto de
esta clase sin el operador new, porque es una clase muy utilizada.
El efecto de crear un objeto con el operador new se traduce en la asignacin de memoria para ese
objeto en el heap de la RAM y como veremos mas adelante, en la invocacin o llamada al constructor
de la clase a la que pertenece el objeto.
5.2.1 Colector de basura
El recolector de basura ( garbage collecter ), es un proceso o hilo que corre en paralelo a la
ejecucin de un programa en Java el cual limpia todas las referencias de los objetos que ya no son
utilizados por el programa.
El concepto de tiempo de vida que una variable ocupa memoria es importante en la programacin, y
cuestiones como; Cunto tiempo durar una variable? y Cundo debe destruirse dicha variable?
que produce mucha confusin y errores en la programacin, Java simplifica ste trabajo por usted,
gracias al recolector de basura
Como Java es un lenguaje de programacin simple, el garbage collecter garantiza que ya nunca
tendr que preocuparse en destruir un objeto , y es por esto que en Java no existen mtodos
destructores como ocurre en C++.
El colector de basura reclama la memoria de todos los objetos que ya no van a ser usados, esto e, el
colector de basura solo libera memoria reservada con el operador new y no libera la "memoria
especial" que puede reservar un objeto. Veremos en la seccin siguiente que para liberar la
"memoria especial" Java provee un mtodo llamado finalize() que se puede definir para una clase.
5.2.2 El mtodo finalice()

77

Supongamos que un objeto aloja memoria "especial" sin usar el operador new. El colector de basura
solo sabe como liberar memoria alojada con new, as que no sabe como liberar esa memoria
"especial". Para solucionar esto Java provee el mtodo finalize() que puede ser definido en la clase.
En C++ a diferencia de Java, los objetos siempre son destruidos, en un programa libre de errores.
Pero en Java los objetos no siempre son limpiados con el colector de baura, ya que :

La recoleccin de basura no es destruccin


Entonces esto significa que si alguna actividad debe ser ejecutada antes de que ya no sea mas
necesario el objeto, esa actividad debe ser ejecutada en el mtodo finalize().
Como funciona el mtodo finalize() ? . Cuando el colector de basura esta listo para liberar la
memoria usada por el objeto, este primeramente llama al mtodo finalize(), y solo en el siguiente
paso de la recoleccin de basura este reclamar la memoria del objeto. As que puede optar por
redefinir o sobreescribir al mtodo finalize(), el cual le da la habilidad de ejecutar algunas
operaciones importantes de limpieza en tiempo de la recoleccin de basura.
Para darle funcionalidad a nuestra clase debemos hacer uso de a sobreescritura de ste mtodo. Se
hara:
protected void finalize() {
sentencia_1;
sentencia_2;
...
sentencia_n;
}
dentro de este mtodo, podemos llamar al mtodo finalize() de la superclase:
super.finalize();
El uso del finalizador es til, como mas adelante se vera, para ir optimizando la memoria ocupada,
con el fin de no agotarla. Por ejemplo, supongamos que programa usted algo en lenguaje C o C++
como alojar memoria mediante un mecanismo diferente ( p.ej. apuntadores ) a lo que normalmente
puede hacerse en Java.
Esto puede suceder a travs de los mtodos nativos, los cuales permiten invocar o ejecutar cdigo de
otro lenguaje que no sea Java.
Dentro de este cdigo de C que no es de Java, el operador de C malloc() u otras funciones de
esta familia pueden reservar memoria, y tambin debe ser liberada con funciones como free() para
evitar la perdida de memoria.
Como la funcin free() es una funcin de C/C++ esta debe ser
entonces invocada dentro del mtodo nativo pero este debe ser invocado a su vez dentro del mtodo
finalize().
Como ha de suponer, el mtodo finalize() rara vez es utilizado, pero Java lo tiene para stos casos
especiales.
5.3 Variables y mtodos
Variables
Las variables son elementos en los programas que cambian su valor en el transcurso de ejecucin del
programa. Las variables guardan valores de cierto tipo que pueden ser valores de tipo primitivos u

78

objetos. En Java podemos clasificar las variables en:

clase.

utilizan

Instancias de variables. Son miembros de la clase y se crean al instanciar un objeto de la


Variables de una clase. Son miembros de la clase y son algo similar a variables globales,
el modificador static.
Variables locales a mtodos. Su mbito es dentro del mtodo.

La declaracin de variables en Java se hace de forma similar al C / C++. En adelante, un


identificador ser el nombre de una variable.
La sintaxis de una simple declaracin de una variable es:

[ modificadores ]

nombre-del-tipo nombre-de-variable;

Donde:

modificadores es opcional y puede ser uno ms de las siguientes siete palabras llave:
{ static, final, transient, volatile, public , protected, private }
Cabe sealar que el nico modificador que puede ponrsele a una variable local a un mtodo es el
modificador final.

nombre-del-tipo es uno de los ocho siguientes palabras llave ( pero tambin pueden ser el nombre
de una clase p.ej. String, Alumno, Date, etc. ):
{ boolean, byte, char, short, int, long, float, double }

nombre-de-variable

es cualquier identificador vlido.

Mtodos
Los mtodos son algo parecido a las funciones del lenguaje C /C++, pero en Java no se permiten
colocar mtodos fuera de la definicin de clase . Con los mtodos implementamos el comportamiento
de los objetos. Hay varios tipos de mtodos:
Mtodos de instancia. Son miembros de la clase y son mtodos que pueden ser utilizados cuando
se crea un objeto de la clase a la que pertenecen, esto es, cuando se crea una instancia de la clase.
Mtodos de clase. Son miembros de la clase y son mtodos que pueden ser invocados sin
necesitar crear una instancia de la clase, y los identificamos fcilmente porque tienen el modificador.
Mtodos constructores. Como veremos ms adelante, son mtodos con el nombre de la clase y
que son invocados al instanciar un objeto o crear un ejemplar de la clase al que pertenecen con el
operador new.
La sintxis de una simple declaracin de un mtodo es:

tipo-de-retorno nombre-mtodo (lista-de-parmetros) [ throws


[modificadores]
claseExcepcion1,.., claseExcepcionN ]
{

cuerpo

79

Donde:

modificadores es opcional y puede ser uno ms de las siguientes ocho palabras llave:
{ static, abstract, final, native, synchronized, public , protected, private }

tipo-de-retorno es cualquier nombre de clase o una de los siguientes nueve palabras reservadas:
{ void, boolean, byte, char, short, int, long, float, double }

nombre-mtodo

es cualquier identificador vlido

lista-de-parmetros es una secuencia de declaraciones de parmetros


[ throws claseExcepcion1,.., claseExcepcionN ] es una lista de posibles excepciones que en un
momento dado el cdigo del mtodo puede lanzar.
cuerpo es una secuencia de declaraciones de variables e instrucciones que
son ejecutadas por el mtodo cuando se le invoca.

Ejemplo:
public static void main(String args[]) throws IOException
{
/* aqu van las sentencias del cuerpo */
}
Vamos a aprovechar el ejemplo para definir un concepto importante conocido como firma del mtodo.
Firma de un mtodo: Es la definicin del mtodo, excluyendo el cuerpo, es algo parecido al
concepto de funcin prototipo del lenguaje C. En el ejemplo anterior, la firma del mtodo es:
public static void main(String args[]) throws IOException

El concepto es importante, porque la documentacin de las API's de Java vemos listadas, cientos de
miles de firmas de mtodos y las clases a los que pertenecen.
5.4 Mtodos
5.4 Mtodos sobrecargados
Cuando tenemos necesidad de que un mtodo en una clase tenga el mismo comportamiento para
distintos tipos de datos para sus argumentos , y no queremos cambiar el nombre del mtodo,
utilizamos la propiedad de sobrecarga de mtodos, ver siguiente ejemplo
Ejemplo 1. Sobrecarga de mtodos privados de una clase que obtienen el cubo de un nmero de
formas diferentes
1.
2.

/** Programa de java que ejemplifica el uso


* de las clases con mtodos sobrecargados

80

3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.

40.

* para asi demostrar esta propiedad.


* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha : 02/07/2002
*/
class Sobrecarga {
private double x;
private double cubo(double y )
{
return y * y * y ;
}
private double cubo(Sobrecarga z )
{
return Math.pow(z.x , 3);
}
private double cubo (double base , double potencia )
{
return Math.exp(potencia * Math.log(base));
}
public static void main (String argumentos[] ) {
Sobrecarga s = new Sobrecarga();
s.x = 10.0;
System.out.println("\n\t 10 al cubo es: "+ s.cubo(10) +
"\n\t 10 al cubo es: "+ s.cubo(s) +
"\n\t 10 al cubo es: "+ s.cubo(10,3) +
"\n Fin del programa");
}
}// fin de Sobrecarga

La salida del programa al ejecutar el comando java Sobrecarga es:


Sobrecarga java.lang.StringBuffer
10 al cubo es: 1000.0
10 al cubo es: 1000.0
10 al cubo es: 1000.0000000000007
Fin del programa
Anlisis del programa. Vemos que la clase Sobrecarga tiene tres mtodos con el mismo nombre;
cubo, pero cada uno con tres firmas diferentes, esto es, se distinguen uno del otro de el tipo de
parmetros que recibe cada uno:
private double cubo(double y )
private double cubo(Sobrecarga z )
private double cubo (double base , double potencia )
En los tres casos todos son private double cubo pero cambian en cuanto a la lista de parmetros,
ya que uno recibe un double y, otro recibe una referencia a Sobrecarga z , y el ltimo dos
parmetros doble base, doble potencia. En las lneas 34 a la 36 del cdigo se muestra como se

81

con dos argumentos de tipo double s.cubo( 10, 3 ). Por ltimo en la salida de la invocacin del
tercer mtodo da "10 al cubo es: 1000.0000000000007", la razn es el error de precisin que tienen
los mtodos Math.exp() y Math.log(), que se debe tomar en cuenta cuando hagamos programas
de alta presicin. La siguiente figura muestra el diagrama de UML con JBuilder 9. versin de prueba:

5.6 Implementando la herencia


En esta seccin veremos como la relacin entre clases llamada herencia, o relacin is-a ( es-un ), es
una estrategia de la POO para la reutilizacin de cdigo y para la especializacin y extensin de
cdigo existente en algo nuevo y mejor.
De hecho todas las clases en Java heredan de la clase Object todos sus mtodos y atributos de
manera implcita, pero el programador puede crear sus clases e implementar la herencia de manera
explicita con la palabra reservada extends y as construr un sub - rbol dentro de la jerarqua de
clases que tiene Java.
La herencia define la nueva clase, la hija, en funcin de una clase anterior, la madre. Esta relacin
mardre-hija es la ms sencilla de la herencia. De hecho, todas las jerarquas de herencia empiezan
con una madre y una hija.
La clase hija es la que recibe la herencia, tambin se conoce como subclase.
La clase madre es de la cual hereda directamente la hija, tambin se conoce como superclase.
En la figura abajo se muestra una relacin madre-hija.
clases hijas Choiceformat y DecimalFormat.

NumberFormat es la madre de las dos

82

5.6.1 Qu es la herencia?
Ahora que hemos visto algunas definiciones ms, podemos refinar la definicin de herencia.
La herencia es un mecanismo que permite establecer relaciones "es- un" entre clases. Estas
relaciones dan a la subclase la facultad de heredar los atributos y comportamientos de la superclase.
Con la herencia la nueva clase hija hereda de la clase madre , todos los mtodos y atributos que se
encuentran en la interfaz de la clase madre y aparecern automticamente en la interfaz de la hija.
Como se ha visto, para que la jerarqua de herencia tenga sentido, se debe tener la facultad de hacer
con la hija todo lo que pueda hacer con la madre. Esto es lo que realmente certifica la prueba "es un"
. La hija slo tiene permitido aumentar y agregar funcionalidad, pero nunca se le permite eliminarla.
Si se encuentra en la situacin de que una hija requiere eliminar funcionalidad, esto es una clara
seal de que la hija debe aparecer antes que la madreen la jerarqua de herencia.
Al igual que con las madres e hijas reales, las clases hijas y las clases madres deben parecerse. En
vez de compartir genes, las clases comparten informacin de tipos.
Algunos lenguajes permiten que una clase tenga ms de una madre. Esto se conoce como herencia
mltiple. Algunos lenguajes limitan a la hija a tener slo una madre.
Otros lenguajes, como Java, permiten slo una madre para la implementacin, pero proporcionan un
mecanismo para heredar mltiples interfaces (pero no la implementacin, slo las firmas de los
mtodos). y esto lo veremos mas tarde en este captulo.

Al igual que las hijas de carne y hueso, las clases hijas pueden agregar nuevos compartimientos y
atributos. Por ejemplo, una hija de carne y hueso puede aprender a pilotear una avin an cuando la
madre nunca lo haya hecho. De la misma manera, una hija podra redefinir un comportamiento
heredado.
Cuando se desee incorporar un nuevo comportamiento a una clase, puede hacerse agregndole un

mtodo o redefiniendo uno existente.

En el siguiente ejemplo, tenemos el cdigo de una clase base llamada Persona , vea tambin los
diagramas.

83

Si quieres obtener el cdigo clic con el botn derecho aqu CicIpn.zip


/**
* Programa de java que te ensea la implementacin de la herencia
* y que tiene variables protegidas. Tambin tiene mtodos accesores
* para obtener los valores de las variables protegidas.
* @autor Oscar A. Gonzlez Bustamante
* @version 2.0
* Fecha : 27/06/2002
* Archivo: Persona.java
* La clase Persona va a ser la clase base o superclase
* del ejemplo
*/
class Persona {
protected String nombre;
protected String sexo;
protected int edad;
Persona() {
System.out.println("constructor Persona()");
}
Persona (String nombre, String sexo, int edad) {
this.nombre = nombre;
this.sexo = sexo;
this.edad = edad;
System.out.println("constructor Persona(String nombre, String sexo, int edad)");
}
String getNombre() { return nombre; }
String getSexo() { return sexo; }
int getEdad() { return edad; }
} // fin de Persona

Ahora suponga que tiene un alumno entonces usted aprovecha el cdigo de la clase existente
Persona para reutilizar los mtodos y atributos de la misma, para crear una nueva clase derivada
llamada Alumno despus de todo un alumno es un tipo de persona por extensin, veamos el
siguiente cdigo.

84

/**
* Programa que ejemplifica la implementacin de la herencia
* Tambien se utilizan mtodos accesores
* para poder obtener los valores de atributos privados de la
* clase desde su interface publica.
* Tambin observa el uso de la palabra reservada super
* para invocar al constructor de la superclase
* @autor Oscar A. Gonzlez Bustamante
* @version 2.0
* Fecha : 27/06/2002
* Archivo: Alumno.java
* La clase Alumno es la clase derivada de la superclase Persona o
* tambin es la suclase o la extensin de la superclase Persona
*/
class Alumno extends Persona {
protected String NoBoleta;
private double exa1, exa2, exa3 , cal;
Alumno() {
System.out.println("constructor Alumno()");
}
Alumno(String nombre, String sexo, int edad) {
super(nombre,sexo,edad);
System.out.println("constructor Alumno(String nombre, String sexo, int edad)");
}
/* mtodo que establece valores para las variables privadas */
public void setExamen(double examen, int noexa) {
if ( noexa == 1 ) exa1 = examen;
if ( noexa == 2) exa2 = examen;
if ( noexa == 3 ) exa3 = examen;
}
public double getCalif(int noexa) {
if ( noexa == 1 ) return exa1;
else
if ( noexa == 2) return exa2;
else
if ( noexa == 3 ) return exa3;
else return -1;
}
public double getMedia() {
cal = (exa1 + exa2 + exa3) / 3.0;
return cal;
}
} // fin de Alumno

85

Aqu, Alumno basa su definicin en la clase Persona existente, y para lograr esto se utiliza la
palabra reservada extends que indica que la clase Alumno es una extensin de la superclase
Persona.
Debido a que Alumno hereda de Persona, getNombre(), getSexo(), getEdad(), nombre, sexo
y edad pasan a formar parte de la definicin de Alumno.
Observe que en uno de los constructores de la clase Alumno se utiliza la palabra reservada super()
la cual invoca primeramente al constructor de la superclase y le enva los argumentos nombre, sexo y
edad para la construccin de un objeto de la clase Persona regresando posteriormente el control a
la instruccin que sigue de super() en el constructor de la clase Alumno.
super(nombre,sexo,edad);
De esta manera se garantiza que antes de crear un objeto de la clase Alumno, se crea ste primero
como una persona porque un alumno "es una" persona.
La relacin de herencia is-a (es-un).
Por lo anterior la herencia es tambin conocida como una relacin entre clases conocida como is-a (

es-un ), ya que la subclase es un subtipo de la superclase.

Ahora una clase llamada CicIpn utiliza las dos clases existentes para crear o instanciar un objeto de
la clase Alumno y as, aprovechar los cdigos de ambas clases, lograndose uno de los objetivos de
la POO que es la reutilizacin de cdigo existente.
Veamos el siguiente cdigo de la clase CicIpn que utiliza la clase Alumno en su mtodo main().
/**
* Programa de java que ejemplifica el uso de la herencia
* Tambien se utilizan mtodos accesorios y mutadores
* para poder accesar y establecer a los atributos privados
* de una clase desde su interface publica.
* @autor Oscar A. Gonzlez Bustamante
* @version 2.0
* Fecha : 19/03/2004
* Archivo: CicIpn.java
* Este programa utiliza las clases Persona y Alumno
* mediante la herencia.

86

*/
public class CicIpn {
public static void main( String args[] ) {
Alumno p = new Alumno("Juana Figueroa","femenino",30);
p.setExamen(8.0, 1);
p.setExamen(10.0, 2);
p.setExamen(9.0 ,3);
System.out.println("Materia: Mtodos Matemticos" +
"\n\t Nombre Alumno(a):" + p.getNombre() +
"\n\t Sexo = " + p.getSexo() +
"\n\t Edad = " + p.getEdad() +
"\n\t EXA1= " + p.getCalif(1) +
"\n\t EXA2= " + p.getCalif(2) +
"\n\t EXA3= " + p.getCalif(3) +
"\n\t CALIFICACION= " + p.getMedia() +
"\n Fin del programa ");
}
} // fin de CicIpn

La salida del programa al ejecutarlo con el comando java CicIpn es:


constructor Persona(String nombre, String sexo, int edad)
constructor Alumno(String nombre, String sexo, int edad)
Materia: Mtodos Matemticos
Nombre Alumno(a):Juana Figueroa
Sexo = femenino
Edad = 30
EXA1= 8.0
EXA2= 10.0
EXA3= 9.0
CALIFICACION= 9.0
Fin del programa

87

5.6.2 Mecnica de la herencia


En Java cuando una clase hereda de otra su implementacin, comportamientos y atributos, esto
significa que todos los mtodos y atributos disponibles en la interfaz de la madre aparecern en la
interfaz de la hija.
Una clase elaborada a travs de la herencia puede tener tres tipos importantes
de mtodos y atributos.

Redefinidos: la nueva clase hereda el mtodo o el atributo de la madre, pero proporciona


una nueva definicin. ( El concepto redefinidos tambin se le conoce como sobreescritos o
sobrepuestos, veremos esto con mas detalle en la siguiente seccin ).

Nuevos: la nueva clase agrega un mtodo o un atributo completamente nuevo.

Recursivos: la nueva clase simplemente hereda de la madre un mtodo o un atributo.

La mayora de los leguajes orientados a objetos no permiten redefinir un atributo. Sin embargo, en
Java si se permite y aqu se incluye el atributo redefinido para dar una explicacin ms completa.
Primero consideremos el siguiente ejemplo. Despus analizaremos cada tipo de mtodo y atributo.
Si deseas el descargar el cdigo de estos programas dale clic aqu

Coordenadas.zip

/**
* Programa que muestra la herencia.
* Programa modificado del libro:
* Aprendiendo Programacin Orientada a Objetos
* del Autor: Anthony Sintes
* @version 1.0
* @author Oscar Alejandro Gonzlez Bustamante
* Archivo: PuntoXY.java
*/
public class PuntoXY {
private double x;
private double y;
public PuntoXY( double x, double y ) {
setX( x );
setY( y );
}
public double getX ( ) {
return x;
}
public void setX( double x ) {
this.x = x;
}
public double getY( ) {
return y;
}
public void setY( double y ) {
this.y = y;
}
public String toString( ) {
return "Soy un punto bidimensional.\n" +
"Mi coordenada x es: " + getX() + "\n" +
"Mi coordenada y es: " + getY();
}
} // fin de PuntoXY

/**

88

* Programa que muestra la herencia.


* Programa modificado del libro:
* Aprendiendo Programacin Orientada a Objetos
* del Autor: Anthony Sintes
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: PuntoXYZ.java
*/
public class PuntoXYZ extends PuntoXY {
private double z;
public PuntoXYZ( double x, double y, double z ) {
super( x, y ); // inicializa los atributos x, y heredados
// llamando al constructor de la clase madre
setZ( z );
// inicializa z
}
public double getZ( ) {
return z ;
}
public void setZ( double z ) {
this.z = z;
}
public String toString( ) {
return "Soy un punto bidimensional.\n" +
"Mi coordenada x es: " + getX() + "\n" +
"Mi coordenada y es: " + getY() + "\n" +
"Mi coordenada z es: " + getZ();
}
} // fin de PuntoXYZ

En este ejemplo tenemos dos clases que representan puntos geomtricos. Estos puntos podran
utilizarse en una herramienta grfica, un modelador visual o un simulador de vuelos. Los puntos
tienen muchos usos prcticos.
Aqu, PuntoXY contiene coordenadas x e y. La clase define mtodos para obtener y establecer los
puntos, as como para crear una representacin de tipo String de la instancia del punto.
PuntoXYZ hereda de PuntoXY. La clase PuntoXYZ agrega una coordenada z y un mtodo para
recuperar y establecer el valor.
La clase tambin proporciona un mtodo para obtener una
representacin de tipo String de la instancia.
Debido a que PuntoXYZ hereda PuntoXY,
tambin posee los mtodos contenidos en esta ltima.
Este ejemplo demuestra cada tipo de mtodo.
Mtodos y atributos redefinidos.
La herencia permite tomar un mtodo o un atributo existentes y redefinidos. La redefinicin de un
mtodo permite modificar el comportamiento de un objeto en relacin con ese mtodo.
Un mtodo o un atributo redefinidos aparecern tanto en la madre como en la hija.
PuntoXYZ, redefine el mtodo toString() que aparece en PuntoXY.

Por ejemplo,

// de PuntoXY
public String toString( ) {
return "Soy un punto bidimensional.\n" +
"Mi coordenada x es: " + getX() + "\n" +
"Mi coordenada y es: " + getY();
}

89

La clase PuntoXY define un mtodo toString() que identifica la instancia como un punto
bidimensional e imprime su coordenada de dos elementos.
PuntoXYZ redefine el mtodo toString() para identificar la instancia como un punto tridimensional
e imprime su coordenada de 3 elementos.
// de PuntoXYZ
public String toString( ) {
return "Soy un punto bidimensional.\n" +
"Mi coordenada x es: " + getX() + "\n" +
"Mi coordenada y es: " + getY() + "\n" +
"Mi coordenada z es: " + getZ();
}
Consideremos el siguiente mtodo main():
/**
* Programa que muestra la herencia.
* Programa modificado del libro:
* Aprendiendo Programacin Orientada a Objetos
* del Autor: Anthony Sintes
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: Coordenadas.java
*/
public class Coordenadas {
public static void main( String [ ] args ) {
PuntoXY dos = new PuntoXY (10,20);
PuntoXYZ tres = new PuntoXYZ(10,20,30);
System.out.println(dos.toString() );
System.out.println(tres.toString() );
System.out.println("Fin del programa");
}
} // fin de la clase Coordenadas

Al correr este programa con el comando java Coordenadas da la siguiente salida:


Soy un punto bidimensional.
Mi coordenada x es: 10.0
Mi coordenada y es: 20.0
Soy un punto bidimensional.
Mi coordenada x es: 10.0
Mi coordenada y es: 20.0
Mi coordenada z es: 30.0
Fin del programa
Como se puede observar,

PuntoXYZ devuelve su representacin redefinida de String.

Al redefinir un mtodo, la clase hija proporciona su propia implementacin del mtodo. Esta nueva
implementacin ofrecer nuevo comportamiento para el mtodo. Aqu, PuntoXYZ redefine el
comportamiento del mtodo toString() de manera que se traduzca apropiadamente en un String.

Redefinir es el proceso el cual una clase hija toma un mtodo de la clase madre y lo reescribe con el
propsito de cambiar su comportamiento.
Cmo sabe el objeto cual definicin debe utilizar?

90

La respuesta se encuentra en el cdigo orientado a objetos subyacente. La mayora de los sistemas


orientados a objetos buscar primero la definicin en el objeto al que se le pasa el mensaje. Si no hay
una definicin ah, al ejecutarse el programa se recorrer la jerarqua hacia arriba hasta encontrar una
definicin. Es importante saber que sta es la manera en que se manejan los mensajes y la forma en
que funciona el mecanismo de redefinicin. La definicin de la hija ser la que se llame porque es la
primera que se encuentra. El mecanismo es el mismo para los mtodos y atributos recursivos, tema
que se ver ms tarde.
En la siguiente figura se ilustra la propagacin de mensajes entre los objetos punto en el caso de
una llamada a getX(). Una llamada a geX() recorrer la jerarqua hacia arriba hasta encontrar una
definicin del mtodo.

Al considera la redefinicin de un mtodo o atributo, es importante tomar en cuenta que no todos los
mtodos y atributos estn disponibles para que su clase los redefina, menos an para que los utilice.
Las palabras reservadas para controlar el acceso definen quin tiene permitido ver y acceder los
mtodos y atributos. En general, estos niveles de acceso se ubican en tres categoras, como vimos
brevemente en la leccin.

private: nivel que slo permite el acceso a la clase.

protected: nivel que slo permite el acceso a la clase y a las hijas.

public: nivel que permite el acceso general.

Los mtodos y atributos protegidos son aquellos a los cuales se desea que nicamente las subclases
tengan acceso. Estos mtodos no deben hacerse pblicos. Tan slo quienes tengan un conocimiento
amplio de la clase deberan utilizar los mtodos y atributos protegidos.
Cualquier atributo no constante y los mtodos dedicados exclusivamente a la clase deben
establecerse como privados. El acceso privado impide que cualquier otro objeto, excepto el objeto
mismo, llame al mismo. No establezca como protegido solamente para aquellos mtodos que usted
sabe que sern requeridos por alguna subclase. De lo contrario, utilice acceso pblico o privado. Esta
rgida prctica significar que tal vez ms tarde tendr que regresar al cdigo por cambiar el nivel de
acceso al mtodo. No obstante, esto produce un diseo ms seguro que aquel que deja abierto el
acceso a una subclase.
Regresar a cambiar los niveles de acceso podra parecer una mala prctica. Sin embargo, las
jerarquas de herencia no deben ocurrir nunca por accidente. En vez de ello, las jerarquas deben
desarrollarse naturalmente conforme usted programe. No hay porque avergonzarse de reorganizar las
jerarquas con el paso del tiempo. La programacin orientada a objetos real es un proceso iteractivo.

91

Sin embargo, recuerde que una regla de oro es hacer todo privado. Habr casos en los cuales esto no
ser funcional para usted. Todo depende de lo que tenga que programar. Por ejemplo, si usted vende
bibliotecas genricas, de clases sin proporcionar el cdigo fuente, tal vez tenga que establecer todo
como protegido de manera predeterminada tonel propsito de que sus clientes puedan usar la
herencia para extender sus clases.
De hecho, habr ocasiones en que tendr que disear una subclase pensando en la herencia. En tales
casos es conveniente establecer un protocolo de herencia, que es una estructura abstracta visible
solamente a travs de los elementos protegidos de la clase. La clase madre llamar a estos mtodos,
y la clase hija puede redefinirlos para modifica su comportamiento. En la siguiente leccin ver un
ejemplo.
Con estas definiciones y reglas, es sencillo comprender que los mtodos y atributos protegidos y
pblicos son los ms importantes para la herencia.
Mtodos y atributos nuevos
Los mtodos y atributos nuevos son aquellos que aparecen en la clase hija pero no en la clase madre.
La clase hija agrega el mtodo o atributos a su interfaz. En el ejemplo de la clase PuntoXYZ vimos
mtodos nuevos. Esta clase agrega los mtodos getZ() y setZ(). Para incorporar nueva
funcionalidad a la interfaz de su clase hija puede agregar mtodos y atributos nuevos.
Mtodos y atributos recursivos
Los mtodos y atributos recursivos se definen en la clase madre o en cualquier otro antepasado, pero
no en la clase hija. Al acceder al mtodo o al atributo, el mensaje se enva hacia arriba en la jerarqua
hasta que se encuentra una definicin de mtodo. El mecanismo es el mismo que el que vimos en la
seccin sobre los mtodos y atributos redefinidos.
Los mtodos redefinidos tambin podran comportarse de manera recursiva. Aunque un mtodo
redefinido aparecer en la clase hija, la mayora de los lenguajes orientados a objetos proporcionan
un mecanismo que permite a un mtodo redefinido llamado a la versin del mismo que se encuentra
en la clase madre (o en algn antepasado). Esta capacidad da la oportunidad de aprovechar la
versin de la superclase y definir nuevos comportamientos en la versin de la subclase. En Java, la
palabra reservada super permite tener acceso a la implementacin de la clase madre. En la seccin
siguiente tendr oportunidad de utilizar super.
5.6.3 Sobreposicin de mtodos y variables.
La herencia permite tomar un mtodo o una variable y redefinirlos. La redefinicin de un mtodo
permite modificar el comportamiento de un objeto en relacin con ese mtodo. A esta caracterstica
tambin se le conoce como sobreposicin o tambin se le conoce con el trmino de
sobreescritura ( en ingles el termino es conocido como overriding ).
Un mtodo o una variable redefinidos estn tanto en la clase madre como en la clase hija, esto es, en
el caso de los mtodos estos tienen la misma firma y en caso de las variables o atributos tienen la
misma definicin. Cuando esto sucede , se dice que los mtodos y variables redefinidos de la clase
hija ocultan o sobreescriben a los mtodos y variables de la clase madre o superclase.
Cuando se necesita usar los mtodos y variables de la clase madre o de la superclase empleamos la
palabra reservada super siguiendo la siguiente sintaxis:
super.metodo() // para invocar a el mtodo de la superclase
super.variable

// para acceder al valor de la variable de la superclase.

En el siguiente ejemplo tenemos una clase madre o superclase llamada SobreEscritura, con dos
variables miembro de tipo double x = 5.0 y otra double y= 3.0. Tambin esta un mtodo
toString() que es sobreescrito de la clase Object, que nos da una cadena con los valores de los

92

atributos de la clase y un mtodo potencia() que calcula x a la y con Math.pow(x,y).


Si quieres obtener elcdigo clic con el botn derecho aqu OcultoySobreEscribo.zip
/** Programa de Java que te ensea el uso de clases
* con mtodos y variables sobreescritos o
* redefinidos en la subclase. La clase SobreEscritura
* es la superclase de la clase OcultoySobreEscribo.
* @autor Oscar A. Gonzlez Bustamante
* @version 2.0
* Archivo: SobreEscritura.java
*/
class SobreEscritura {
// esta es la clase madre
double x= 5.0;
double y= 3.0;
// convierte a cadena los valores de los atributos
// de los objetos de sta clase
public String toString() {
return " Hola Soy x= " + x +
" Hola Soy y= " + y ;
}
double potencia() {
return Math.pow( x, y );
}
} // fin de la clase SobreEscritura

Ahora veremos que estos mtodos y variables sern sobredefinidos o sobreescritos en la clase hija
OcultoySobreEscribo y que hay una variable booleana llamada oculta que permite controlar la
sobreescritura segn su valor. Vea el cdigo y sus comentarios que explican claramente el programa
con el uso de super.
/** Programa de Java que te ensea el uso de clases
* con mtodos y variables sobreescritos o
* redefinidos en la subclase. La superclase de
* esta clase es SobreEscritura. Se ensea tambin el
* uso de super.variable y super.metodo()
* @autor Oscar A. Gonzlez Bustamante
* @version 2.0
* Archivo: OcultoySobreEscribo.java
*/
public class OcultoySobreEscribo extends SobreEscritura {
// esta es la clase hija
double x= 2.0;
double y= 8.0;
boolean oculta; // esta es una bandera para ocultar
// convierte a cadena los valores de los atributos
// de los objetos de sta clase
public String toString() {
return " Hola Soy x= " + x +
" Hola Soy y= " + y +
" Hola Soy oculta= " + oculta;
}
// se redefine o sobreescribe o se sobrepone
// el mtodo potencia de la clase madre dependiendo
// del valor de la variable booleana oculta
double potencia() {
double valor;
if ( oculta ) valor = Math.pow( x , y ); // oculto o sobreescribo

93

else {
x = super.x; // obtengo valor de x de la superclase
y = super.y; // obtengo valor de y de la superclase
valor = super.potencia(); // invoco la mtodo de la superclase
}
return valor;
}
public static void main( String args[]) {
SobreEscritura w = new SobreEscritura(); // w es un objeto de la clase madre
OcultoySobreEscribo z = new OcultoySobreEscribo(); // z es un objeto de la clase hija
// aqu se ve la ocultacin de la variables x e y ademas del mtodo potencia() de la
// superclase, por los correspondientes sobreescritos de la clase hija
z.oculta = true; // true para trabajar con valores redefinidos en la clase hija
System.out.println( "w: " + w );
System.out.println( "z: " + z );
// escribo valores de atributos del objeto z
System.out.println("x= " + z.x + " a la y= " + z.y + " = " + z.potencia() );
// Para usar los valores de la clase hija cambiamos el valor de oculta a true
z.oculta = false; // false para trabajar con valores de la clase madre
System.out.println( "w: " + w );
System.out.println( "z: " + z );
// escribo valores de atributos del objeto z
System.out.println("x= " + z.x + " a la y= " + z.y + " = " + z.potencia() );
} // fin del main()
} // fin de la clase OcultoySobreEscribo

La salida del programa al ejecutarlo con el comando java OcultoySobreEscribo es:


w: Hola Soy x= 5.0 Hola Soy y= 3.0
z: Hola Soy x= 2.0 Hola Soy y= 8.0 Hola Soy oculta= true
x= 2.0 a la y= 8.0 = 256.0
w: Hola Soy x= 5.0 Hola Soy y= 3.0
z: Hola Soy x= 2.0 Hola Soy y= 8.0 Hola Soy oculta= false
x= 2.0 a la y= 8.0 = 125.0
Finished executing

5.6.4 Upcasting
Uno de los aspectos mas importantes de la herencia es la relacin que se tiene entre la nueva clase
hija y la superclase madre. Esta relacin puede ser resumida diciendo: "La nueva clase hija es un
tipo de la clase madre existente".
El acto de convertir el tipo de un objeto h de una clase hija ( clase derivada o subclase ), referencia
o apuntador en un objeto m del tipo de la clase madre ( superclase o clase base ) es conocido como
upcasting .
Veamos el siguiente ejemplo:
Tenemos una clase llamada Upcasting que crea dos objetos emp1 y emp2 de la clase Empleado
as:

94

Empleado emp1 = new Gerente( "Oscar A. Gonzlez B. " ,


18750.5,
santo,
"Direccin General" );
Empleado emp2 = new Empleado("Ma. de Jess Jazmin",
12000.00,
santo2 );
Para el caso de emp1 se hace conversin del objeto emp1 a una clase superior en jerarqua de
Gerente a su superclase Empleado y esto es posible porque un Gerente "es un" Empleado.
Luego invocamos al mtodo hazAlgo( Empleado e ) el cual recibe como parmetro una referencia
a un objeto de la clase Empleado. Cuando se invoca el mtodo
up.hazAlgo( emp1 ); // cuando se es gerente
up.hazAlgo( emp2 ); // cuando se es empleado
Lo podemos hacer con un objeto emp1 que es un Gerente o con un objeto emp2 que es un
Empleado. Para cuando el argumento es emp1 el " up casting " es automtico gracias a la relacin
de herencia y a esto se conoce como conversin de tipo por argumento, que como veremos mas
adelante es muy til cuando se vea el Polimorfismo. Tambin dentro del mtodo hazAlgo(
Empleado e ) utilizamos el operador instanceof para saber el tipo de objeto que estamos
recibiendo, ya que para el caso de que el objeto e sea de la clase Gerente necesitamos hacer una
conversin explicita pero ahora hacia abajo, esto es, necesitamos hacer un , "down casting " para
poder utilizar el mtodo getDepartamento() , porque este mtodo es un miembro de la subclase
Gerente o de lo contrario el compilador nos enviar un error.
public void hazAlgo( Empleado e ) {
if ( e instanceof Gerente ) {
Gerente g = ( Gerente ) e; // convierto el empleado
// en gerente down Casting
System.out.println(" Este es un jefe de :" +
g.getDepartamento() );
System.out.println(" Los detalles del gerente son : \n" +
e.getDetalles() );
}
else {
System.out.println(" Los detalles del empleado son : \n" +
e.getDetalles() );
}
} // fin de hazAlgo()
Veamos los cdigos fuente del ejemplo:
Si quieres el cdigo solo dale clic aqu

Upcasting.zip

/**
* Programa que muestra que en la herencia
* hay coversin de tipos Casting Objects o
* Upcasting.
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: Upcasting.java
*/
public class Upcasting {
public void hazAlgo( Empleado e ) {

95

if ( e instanceof Gerente ) {
Gerente g = ( Gerente ) e; // convierto el empleado
// en gerente down Casting
System.out.println(" Este es un jefe de :" +
g.getDepartamento() );
System.out.println(" Los detalles del gerente son : \n" +
e.getDetalles() );
}
else {
System.out.println(" Los detalles del empleado son : \n" +
e.getDetalles() );
}
} // fin de hazAlgo()
public static void main( String [] args ) {
Upcasting up = new Upcasting();
java.util.Date santo = new java.util.Date( 1961 - 1900, 01, 13 );
Empleado emp1 = new Gerente( "Oscar A. Gonzlez B. " ,
18750.5,
santo,
"Direccin General" );
up.hazAlgo( emp1 ); // cuando se es gerente
System.out.println("------------------");
java.util.Date santo2 = new java.util.Date( 1976 - 1900, 03, 10 );
Empleado emp2 = new Empleado("Ma. de Jess Jazmin",
12000.00,
santo2 );
up.hazAlgo( emp2 ); // cuando se es empleado
System.out.println( "Fin del programa" );
} // fin del main()
} // fin de la clse Upcasting

Tenemos una clase llamada Empleado con sobrecarga de constructores y uso de la palabra
reservada this para inicializar apropiadamente las variables miembro segn sea el caso invocando a
los constructores de acuerdo al numero y tipo de sus parmetros.
/**
* Programa que muestra que en la herencia
* hay coversin de tipos Casting Objects o
* Upcasting. Tambin utilizamos this para
* invocar a los constructores sobrecargados.
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: Empleado.java
*/
import java.util.Date;
public class Empleado {
public String nombre;
public double salario;
public Date onomastico;
public Empleado() {
nombre = "*** No hay nombre ***";
salario = 0.0;
onomastico = null;
}
public Empleado( String n ) {

96

nombre = n;
}
public Empleado( String n, double s ) {
this( n );
salario = s;
}
public Empleado( String n, double s, Date o ) {
this( n, s );
onomastico = o;
}
public String getDetalles() {
return "Nombre
: " + nombre + "\n" +
"Salario : " + salario + "\n" +
"Onomastico : " + onomastico;
}
} // fin de la clase Empleado

Tenemos una clase llamada Gerente es similar a la clase Empleado ya que utiliza sobrecarga de
constructores y uso de la palabra reservada this para inicializar apropiadamente las variables
miembro segn sea el caso , y adems invocando con la palabra super al miembro de la superclase
ya sea variable o constructor para construir el objeto.
/**
* Programa que muestra que en la herencia
* hay coversin de tipos Casting Objects o
* Upcasting.
* Tamben utilizamos this para
* invocar a los constructores sobrecargados.
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: Gerente.java
*/
import java.util.Date;
public class Gerente extends Empleado {
public String departamento;
public Gerente() {
departamento = "*** No hay departamento ***";
}
public Gerente( String n ) {
super.nombre = n;
}
public Gerente( String n, double s ) {
this ( n );
super.salario = s;
}
public Gerente( String n, double s, Date o ) {
this( n, s );
super.onomastico = o;
}
public Gerente( String n, double s, Date o, String depa ) {
this( n, s, o );
departamento = depa;
}
public String getDetalles() {

97

return super.getDetalles() + "\n" +


"Departamento : " + departamento;

}
public String getDepartamento() {
return departamento;
}
} // fin de la clase Gerente

La salida de programa al ejecutarlo con el comando java Upcasting es el siguiente:


Este es un jefe de :Direccin General
Los detalles del gerente son :
Nombre : Oscar A. Gonzlez B.
Salario : 18750.5
Onomastico : Mon Feb 13 00:00:00 CST 1961
Departamento : Direccin General
-----------------Los detalles del empleado son :
Nombre : Ma. de Jess Jazmin
Salario : 12000.0
Onomastico : Sat Apr 10 00:00:00 CST 1976
Fin del programa
Finished executing

5.6.5 Tipos de herencia


Existen tres propsitos principales para utilizar la herencia.
1.

Para reutilizar la implementacin.

2.

Por diferencia.

3.

Para sustitucin de tipos.

Hay que tener cuidado con estos tipos de herencia ya que algunos tipos son ms recomendables
que otros. En las siguientes secciones exploremos cada uno en detalle.
5.6.5.1 Herencia para reutilizar la implementacin
Se vio en secciones anteriores , que la herencia permite a una clase nueva reutilizar la
implementacin de otra clase. En lugar de cortar y pegar cdigo o de instanciar y usar un
componente por medio de composicin, la herencia hace disponible automticamente el cdigo como
parte de la clase nueva. Y as , la clase nueva tiene la funcionalidad de la clase madre.
Problemas de la herencia de la implementacin
Hasta aqu, la herencia de la implementacin parece adecuada. No obstante, tenga cuidado, pues lo
que en la superficie parece una tcnica til, en la prctica puede ser peligrosa. De hecho, la
herencia de la implementacin es el tipo de herencia ms dbil y por lo general debe evitarse. La
reutilizacin tendra que ser sencilla, pero como ver, el costo es muy alto.
Para entender los inconvenientes, es necesario considerar los tipos. Cuando una clase hereda de otra,
automticamente adopta el tipo de la clase de la cual hered. La herencia del tipo adecuado es un

98

aspecto primordial que siempre se debe considerar la disear las jerarquas de clases. Mas tarde ver
la razn, pero por el momento tmelo como una regla.
Una herencia dbil es el Frankenstein de la programacin. Si usted emplea la herencia con el slo
propsito de reutilizar la implementacin sin tomar en cuenta otros aspectos, con frecuencia acabar
con un monstruo conformado por partes que no tendrn relacin entre s.
5.6.5.2 Herencia por diferencia
En el ejemplo de las clases PuntoXY y PuntoXYZ se utiliz la herencia por diferencia.

La programacin por diferencia de la oportunidad de especificar tan slo en qu difiere una clase hija
de su clase madre.
o visto de otra forma:

Programar por diferencia significa heredar una clase y agregarle solamente el cdigo que la haga
distinta de la clase de la cual se est heredando.
En el caso de la clase PuntoXYZ, vimos que la incorporacin de la coordenada z la hace diferente
de la clase madre. Con el propsito de aceptar la coordenada z . La clase PuntoXYZ agrega dos
mtodos para establecer y recuperar el atributo. Tambin sobreescribimos o redefinimos el mtodo
toString() en PuntoXYZ .
La programacin por diferencia es un concepto muy poderoso, pero permite agregar tan solo el
cdigo necesario para determinar la diferencia entre las clases madre e hijas. Esto permite programar
de manera incremental.
El cdigo ms pequeo es ms manejable y da como resultado un diseo ms sencillo y , en teora,
se escriben menos lneas de cdigo, y se cometen menos errores. As, cuando programa por
diferencia, puede escribir cdigo ms correcto en menos tiempo. Al igual que con la herencia por
implementacin, estos cambios incrementales se pueden realizar sin alterar el cdigo existente.
Mediante la herencia, existen dos formas para programar por diferencia:

Agregando nuevos comportamientos y atributos,

Redefininiendo o sobreescribiendo los comportamientos y atributos necesarios.

Cada uno de estos casos, se conoce como especializacin.


referimos con eso de la especializacin.

Veamos a que exactamente nos

Especializacin
La especializacin es el proceso mediante el cual una clase se define a s misma en trminos de los
aspectos que la hacen diferente de su clase madre. Despus de todo, la definicin de la clase hija slo
incluye los elementos que la hacen diferente de su clase madre.
Una clase hija se especializa respecto de su madre agregando nuevos atributos y mtodos a su
interfaz, as como redefiniendo atributos y mtodos existentes. Al agregar mtodos o redefinir los
existentes, una clase hija puede expresar comportamientos distintos a los de su madre.
No hay que confundir el trmino especializacin. La especializacin slo permite agregar o redefinir
comportamientos y atributos que la hija haya heredado de su madre. La especializacin, a diferencia

de lo que su nombre podra sugerir, no da la capacidad de eliminar de la clase hija los

99

comportamientos y atributos heredados. Una clase no obtiene herencia selectiva.


Lo que hace la implementacin es delimitar lo que puede y no puede ser un punto tridimensional.
Un PuntoXYZ siempre puede ser un PuntoXY. Sin embargo, es incorrecto afirmar que un PuntoXY
siempre puede ser un PuntoXYZ. Ms bien, un PuntoXYZ es una especializacin de un PuntoXY
y ste es una generalizacin de un PuntoXYZ.
En la figura siguiente se muestra la diferencia entre generalizacin y especializacin. En la medida en
que se recorra hacia abajo una jerarqua, estar especializando. Conforme lo haga hacia arriba estar
generalizando.
Entre ms generales, ms clases caern dentro de esta categora, y entre ms
especialice, menos podrn conocer todos los criterios para categorizarce en ese nivel.

Como podemos ver, la especializacin nos restringe la funcionalidad, sino el tipo de categorizacin.
No hay razn par que la especializacin termine con PuntoXYZ. De hecho, no es necesario que
empiece con PuntoXY. La herencia puede ser tan profunda como se requiera.
Se puede utilizar la
herencia para estructurar jerarquas de clases complejas. La explicacin anterior sobre la jerarqua
da lugar a dos nuevos trminos predecesora y descendiente.
Debe procurar conformar jerarquas poco profundas en lugar de muy profundas. Conforme una
jerarqua es ms profunda, es ms difcil darle mantenimiento.
Clase predecesora
Dada una clase hija, una de clase predecesora es aquella que aparece antes que la clase madre en la
jerarqua.
Clase descendiente
Dada una clase, cualquier clase que aparezca despus de ella en la jerarqua es su descendiente.
Digamos que tenemos la jerarqua de clases que se muestra en la siguiente figura Podemos decir
que la clase PuntoX es la madre de PuntoXY y predecesora de PuntoXYZ y PuntoXYZW.
Tambin podemos afirmar que PuntoXY, PuntoXYZ y PuntoXYZW son descendientes de
PuntoX. Todas las clases descendientes comparten los mtodos y atributos de sus clases
predecesoras.

100

Podemos hacer algunas interesantes afirmaciones ms en relacin con la jerarqua de clases. La


clase PuntoX es la raz y PuntoXYZW es una hoja.
Clase raz
La clase raz (tambin conocida comnmente como clase base) es la clase ms alta en la jerarqua de
herencia. En la figura muestra que PuntoX es una clase raz.
Clase hoja
Una clase hoja es la que no tiene hijas. En la figura se muestra que la clase PuntoXYZW es una
clase hoja.
Es importante considerar que las clases descendientes reflejarn los cambios hechos a las clases
predecesoras. Digamos que usted encuentra un error en PuntoXY. Si arregla algo en las ltimas,
todas las clases hacia abajo en la jerarqua, en este caso PuntoXYZ y PuntoXYZW , se beneficiarn
del cambio. Por lo tanto, ya sea que se corrija un error o realice una implementacin ms eficiente,
todas las clases descendientes de la jerarqua se beneficiarn.
Herencia Mltiple
En todos los ejemplos anteriores hemos visto herencia simple. Algunas implementaciones de
herencia permiten que un solo objeto herede directamente de ms de una clase. Este tipo de
herencia se conoce como herencia mltiple. La herencia mltiple es un aspecto de la POO que
causa controversia. Algunos afirman que slo dificulta la comprensin, diseo y mantenimiento del
software. Otros la defienden y aseveran que un lenguaje no est completo sin ella. Hay que
recordar que Java no tiene herencia mltiple, pero en lugar de esto, se puede utilizar la
implementacin de interfaces.

5.6.5.3 Herencia por substitucin de tipos


El ltimo tipo de herencia es la sustitucin de tipos. Esta ltima permite describir relaciones de
sustituibilidad. Ahora mediante un ejemplo veremos mas a fondo lo que se entiende por
sustituibilidad.
Consideremos la clase Linea:
Si quieres el cdigo de este programa solo dale clic aqu

UsaLinea.zip

/**
* Programa que muestra la herencia
* por substitucin de tipos.
* Programa modificado del libro:
* Aprendiendo Programacin Orientada a Objetos
* del Autor: Anthony Sintes
* @version 1.0

101

* @author Oscar Alejandro Gonzalez Bustamante


* Archivo: Linea.java
*/
public class Linea {
private PuntoXY p1;
private PuntoXY p2;
public Linea(PuntoXY p1, PuntoXY p2 ) {
this.p1 = p1;
this.p2 = p2;
}
public PuntoXY getPuntofinal1() {
return p1;
}
public PuntoXY getPunto2() {
return p2;
}
public double getDistancia() {
double x = Math.pow( ( p2.getX() - p1.getX() ), 2 );
double y = Math.pow( ( p2.getY() - p1.getY() ), 2 );
double distancia = Math.sqrt( x + y );
return distancia;
}
public PuntoXY getPuntoCentro() {
double nuevo_x = ( p1.getX() + p2.getX() ) / 2;
double nuevo_y = ( p1.getY() + p2.getY() ) / 2;
return new PuntoXY ( nuevo_x, nuevo_y );
}
} // fin de la clase Linea

la clase Linea toma dos instancias de PuntoXY como argumentos y proporciona algunos mtodos
para recuperar los valores, un mtodo para calcular la distancia entre los puntos y uno para calcular
el punto central.
Una relacin de sustituibilidad significa que es posible pasar cualquier objeto al constructor de Linea
que herede de PuntoXY.
Recuerde que cuando una hija de la madre se dice que la hija "es-una" clase madre.
PuntoXYZ "es-un" PuntoXY es posible pasar un PuntoXYZ al constructor.

As, como

Consideremos el siguiente programa :


/**
* Programa que muestra la herencia
* por substitucin de tipos.
* Programa modificado del libro:
* Aprendiendo Programacin Orientada a Objetos
* del Autor: Anthony Sintes
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: UsaLinea.java
*/
public class UsaLinea {
public static void main( String [ ] args ) {

102

PuntoXYZ p1 = new PuntoXYZ( 12, 12, 2 );


PuntoXY p2 = new PuntoXY( 16, 16 );
Linea lin = new Linea( p1, p2 );
PuntoXY centro = lin.getPuntoCentro();
System.out.println(
"Punto central : ( " + centro.getX() + " , " + centro.getY() + " )");
System.out.println(
"Distancia entre los puntos : " + lin.getDistancia() );
System.out.println("Fin del programa");
} // fin del main()
} // fin de la clase UsaLinea

Como puede observar, el mtodo main() pasa un PuntoXY y un PuntoXYZ


clase Linea.

al constructor de la

La salida del programa al ejecutarlo con el comando java Linea es el siguiente:


Punto central : ( 14.0 , 14.0 )
Distancia entre los puntos : 5.656854249492381
Fin del programa
Trate de imaginar las posibilidades que le ofrecen las relaciones de sustituibilidad. En el ejemplo de
la lnea, podra permitirle pasar rpidamente de una vista tridimensional a una bidimensional en una
interfaz grfica.
La conectabilidad es un concepto poderoso. Como es posible pasar a una hija cualquier mensaje que
se pueda enviar a una madre, se le puede considerar como si fuera sustituible para la madre.
sta
es la razn por la cual no es conveniente eliminar comportamientos al crear una hija. Si se hace
esto ltimo, la conectabilidad fallar.
Por medio de la conectabilidad, es posible agregar nuevos subtipos a un programa en cualquier
momento. Sin un programa est destinado a utilizar una clase predecesora, sabr cmo manejar los
nuevos objetos. El programa no tiene que preocuparse por conocer el tipo exacto del objeto, siempre
y cuando tenga una relacin de sustituibilidad con el tipo que espera poder utilizar.
Tome en cuenta que las relaciones de sustituibilidad slo se pueden dar hacia arriba en la jerarqua
de herencia. Si un objeto est programado para aceptar un tipo determinado de objeto, no se le
puede pasar al padre del objeto esperado. No obstante, se le puede pasar a cualquier descendiente.
Tomemos como ejemplo al constructor Linea:
public Linea( PuntoXY p1, PuntoXY p2 )
Es posible pasarle al constructor un PuntoXY o cualquiera de sus descendientes, pero no se le
puede pasar un PuntoX, porque esta clase aparece antes que PuntoXY en la jerarqua.
Subtipo
Un subtipo es un tipo que extiende a otro tipo mediante herencia.
La conectabilidad incrementa las oportunidades para aprovechar la reutilizacin. Supongamos que
usted escribi un contenedor para objetos PuntoXY . Debido a la conectabilidad, usted puede utilizar
tambin el contenedor para cualquier descendiente de PuntoXY.

103

La conectabilidad es importante porque permite escribir cdigo genrico. En lugar de tener una gran
cantidad de instrucciones case o pruebas if-else para saber qu tipo de punto usa en un momento
determinado el programa, todo lo que se tienen que hacer es programar los objetos para que
manejen objetos de tipo PuntoXY.
Consejos para lograr una herencia eficiente.
La herencia tiene su propio conjunto de reglas de diseo. Aunque poderosa, la herencia en realidad le
da a usted una soga para que se cuelgue usted mismo s la usas de manera inapropiada. Los
siguientes consejos le ayudarn a utilizar la herencia de manera eficiente:

En general, aproveche la herencia para reutilizar la interfaz y para definir relaciones de


sustitucin. Tambin puede utilizarla para extender una implementacin, pero slo s la clase
resultante pasa la prueba Es un.

En general, prefiera la composicin en lugar de la herencia s tan slo va a reutilizar la


implementacin. Utilice la herencia nicamente si puede aplicar la prueba Es un a la jerarqua
resultante. No utilice la herencia para una reutilizacin ambiciosa de la implementacin.

Utilice siempre la regla Es un.

Las jerarquas de herencia apropiadas no surge de manera espontnea. Con frecuencia se


descubren conforme se avanza. Cuando suceda esto, reescriba su cdigo. En otras ocasiones tendr
que disear de antemano sus jerarquas. En cualquier caso, hay algunos principios de diseo que
debe seguir:

Como regla de oro, mantenga relativamente poco profunda sus jerarquas de clases.

Diseo con cuidado las jerarquas de herencia y transfiera los aspectos comunes a las clases
abstractas bsicas. stas permiten definir un mtodo sin necesidad de proporcionar una
implementacin. Debido a que la clase base no especifica una implementacin, no es posible
instanciarla. Sin embargo, el mecanismo de abstraccin obliga a que una clase que hereda
proporcione una implementacin. Las clases abstractas son valiosas para realizar una herencia
planeada. Esto ayuda al desarrollador a saber lo que tienen que implementar estas clases.

Si el lenguaje que utiliza no proporciona un mecanismo de abstraccin, genere mtodos


vacos y aclare que las subclases debern implementar totalmente estos mtodos.

Las clases comparten con frecuencia cdigo comn. No tiene mucho sentido contar con
mltiples copias del cdigo. Lo ms recomendable es aislar el cdigo comn en una sola clase madre.
Sin embargo, no lo coloque demasiado arriba. Colquelo tan slo un nivel antes de aquel en donde
considere que lo necesitar.

Es difcil planear siempre las jerarquas en su totalidad. Los aspectos comunes no surgirn
sino hasta despus de escribir el mismo cdigo unas cuantas veces. Cuando encuentre estos aspectos
comunes no dude en reescribir sus clases. Con frecuencia, este trabajo de reescritura se le conoce
como refactorizacin.

El encapsulamiento es tan importante entre las clases madre e hija como lo es entre las
clases que no tienen relacin. No sea descuidado con el encapsulamiento cuando herede. La prctica
de utilizar una interfaz bien definida es tan vlida entre las clases madre e hija como entre las clases
que no tienen absolutamente ninguna relacin. A continuacin tiene algunos tipos que le ayudarn a
tener cuidado del encapsulamiento cuando herede.

Utilice interfaces bien definidas entre la madre y la hija como lo hara entre clases.

Si agrega mtodos para uso especfico de la subclases, asegrese de establecerlos como


protegidos para que nicamente los vean las subclases. Los mtodos protegidos permiten ofrecer un
poco ms de control a las subclases sin dejar ese control al alcance de todas las clases.

En general, evite dejar la implementacin interna de sus objetos al alcance de las subclases.
Si lo hace, una subclase puede volverse dependiente de la implementacin. Esta relacin puede
acarrear todos los problemas que vimos en la leccin 2.

104

stos son algunos aspectos clave finales para lograr una herencia eficiente:

Nunca pierda de vista que la sustitucin es el objetivo nmero uno. Incluso si un objeto
debiera aparecer intuitivamenteen una jerarqua, esto no significa que deba estar ah. No porque
usted pueda incluirlo o su intuicin le sugiera que lo haga, significa que deba hacerlo.

Programe por diferencia con el propsito de que su cdigo sea manejable.

Prefiera siempre la composicin en lugar de la herencia si su objetivo e reutilizar la


implementacin. Por lo general es ms sencillo modificar las clases implicadas en la composicin.
Cmo satisface la herencia las metas de la OO.
La herencia satisface cada una de las metas de la POO. La herencia ayuda a producir software.
1.

Natural

2.

Confiable

3.

Reutilizable

4.

Mantenible

5.

Extensible

6.

Oportuno

La herencia cumple estas metas de la siguiente manera:

Natural: la herencia permite modelar la realidad de una manera ms natural. A travs de la


herencia es posible formar complejas jerarquas de relaciones entre clases. Como seres humanos
tenemos una tendencia natural a categorizar y agrupar los objetos que nos rodean. La herencia da la
facultad de trasladar esa tendencia a la programacin.

La herencia tambin incluye el deseo del programador de evitar el trabajo repetitivo. No tiene
mucho sentido hacer trabajo redundante.

Confiable: la herencia da como resultado cdigo confiable.

La herencia simplifica el cdigo. Al programar por diferencia, slo es necesario agregar el


cdigo que describe la diferencia entre la madre y la hija. En consecuencia, cada clase puede tener
una huella ms pequea. Cada clase puede ser altamente especializada para lo que hace. Menos
cdigo significa menos errores.

La herencia permite reutilizar cdigo suficientemente probado como base para las clases
nuevas. Siempre es ms recomendable reutilizar cdigo probado que escribir cdigo nuevo.

Por ltimo, el mecanismo de la herencia por s mismo es confiable. El mecanismo est


integrado en el lenguaje, gracias a lo cual no tiene que preocuparse por elaborar su propio
mecanismo y asegurarse de que todos sigan sus reglas.

Sin embargo, la herencia no es perfecta. Al crear subclases, debe estar atento para no
introducir errores sutiles resultado de destruir inadvertidamente dependencias no expuestas. Tenga
mucho cuidado cuando herede.

Reutilizable: la herencia contribuye a la reutilizacin. La naturaleza de la herencia permite


reutilizar las clases antiguas como base de las nuevas.

La herencia tambin permite reutilizar clases de maneras nunca imaginables por quienes las
hayan escrito. Al redefinir y programar por diferencia es posible cambiar el comportamiento de clases
existentes y utilizarlas en nuevas formas.

Mantenible: la herencia contribuye al mantenimiento. La reutilizacin del cdigo probado da


como resultado menos errores en el cdigo nuevo. Cuando se encuentre un error en una clase, todas
las subclases se beneficiarn de la correccin.

En lugar de adentrarse en el cdigo y agregar caractersticas directamente, la herencia


permite tomar el cdigo existente y considerarlo como la base para la construccin de una clase
nueva. Todos los mtodos, atributos e informacin de tipos se vuelve parte de la nueva clase. A

105

diferencia de cortar y pegar, hay una sola copia de cdigo original por mantener. Esto ayuda al
mantenimiento pues reduce la cantidad de cdigo que es necesario mantener.

Si usted tuviera que hacer cambios directamente al cdigo existente, podra daar la clase
base y afectar porciones del sistema que utilizara a esa clase.

Extensible: la herencia hace posible la extensin o especializacin de clases. Usted puede


tomar una clase existente y agregarle nueva funcionalidad en cualquier momento. Tanto la
programacin por diferencia como la herencia por conectabilidad alientan la extensin de clases.

Oportuno: la herencia ayuda a escribir cdigo oportuno. Ya vimos que la simple reutilizacin
puede reducir el tiempo de desarrollo. La programacin por diferencia significa que es necesario
escribir menos cdigo, por lo tanto usted debe terminar ms rpido. La conectabilidad hace posible
agregar caractersticas sin tener que cambiar mucho el cdigo existente.

La herencia tambin facilita las pruebas porque slo es necesario probar la nueva
funcionalidad y cualquier interaccin con la funcionalidad anterior.
5.7 Composicin
Es la relacin entre las clases conocida como Has a ( tiene un ) y se caracteriza en que un
objeto complejo esta construido de otros objetos.
El ejemplo clsico es pensar en un carro que siendo un objeto complejo, porque esta compuesto de
otros objetos igual de complejos como son el motor, las llantas, el chasis, el sistema elctrico, etc..
todos juntos componen un objeto de la clase Carro, as una instancia de la clase Carro tiene un Motor,
tiene unas Ventanas, tiene unas Puertas, etc., vea el ejemplo de cdigo y tambin el diagrama:
Si quieres obtener elcdigo dale clic aqu Carro.zip
/**
* Programa de java que ejemplifica el uso
* de la relacin entre clases conocida como
* has - a ( tiene - un) o composicin.
* Fuente: Tomado de y traducido al espaol del libro de
* Thinking in Java de Bruce Eckel capitulo 6 programa de
* Composicin con objetos pblicos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo:Carro.java
*/
class Motor {
public void arranque() {}
public void reversa() {}
public void alto() {}
}
class Rueda {
public void inflar(int libras) {}
}
class Ventana {
public void cerrarventana() {}
public void abrirventana() {}
}
class Puerta {
public Ventana ventana = new Ventana();
public void abrirpuerta() {}
public void cerrarpuerta() {}

106

}
public class Carro {
public Motor motor = new Motor();
public Rueda[] rueda = new Rueda[4];
public Puerta izquierda = new Puerta(),
derecha = new Puerta(); // 2-puertas
public Carro() {
for(int i = 0; i < 4; i++)
rueda[i] = new Rueda();
}
public static void main(String[] args) {
Carro tsuru = new Carro();
tsuru.izquierda.ventana.cerrarventana();
tsuru.rueda[0].inflar(30);
}
} // fin de la clase Carro

Otro ejemplo de composicin que se propone es el siguiente:


Haga un programa en java tal, que dadas las clases, Persona, Taxista, Transporte, Terrestre, y
Taxi ( ver el siguiente diagrama ). implemente la herencia y composicin.
Tambin mediante
mtodos accesorios y mutadores getNombre(), setNombre(String nom), getHorario(),
setHorario(String hor), y getPlacas(), setPlacas(String pla), se implemente la interface pblica
necesaria para acceder mediante mensajes a las variables de instancia privadas, nombre, horario y
placas de los objetos t1 de la clase Taxista y del objeto aut1 de la clase Taxi respectivamente.

Si quieres obtener elcdigo dale clic aqu RutaTaxis.zip

107

/**
* Programa de java que te ensea a manejar
* la composicin, en particular a invocar
* a los mtodos de los objetos que componen
* la clase RutaTaxi.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo:RutaTaxis.java
*/
class Persona {
protected String nombre;
public String getNombre(){return nombre;}
public void setNombre(String nom) { nombre=nom; }
}
class Taxista extends Persona {
private String horario;
public void setHorario(String hor) { horario=hor; }
public String getHorario() { return horario; }
} // fin de la clase Taxista
class Transporte { }
class Terrestre extends Transporte { }
class Taxi extends Terrestre {
private String placas;
public void setPlacas(String pla) { placas = pla; }
public String getPlacas() { return placas; }
} // fin de la clase Terrestre
class RutaTaxis {
Taxista t1 = new Taxista();
Taxi aut1 = new Taxi();
public static void main(String args[]) {
RutaTaxis rt = new RutaTaxis();
rt.t1.setNombre("Jorge Lopez");
rt.t1.setHorario("de 7 a 16 hrs.");
rt.aut1.setPlacas("000734-AUTW");
System.out.println("\t Ruta de Taxis \n" +
"\n\t Taxista: " + rt.t1.getNombre() +
"\n\t Horario: " + rt.t1.getHorario() +
"\n\t Taxi Placas: " + rt.aut1.getPlacas() +
"\n\t FIN DEL PROGRAMA ");
}
} // fin de la clase RutaTaxis

La salida del programa al ejecutarlo con el comando java RutaTaxis es lo siguiente:


Ruta de Taxis
Taxista: Jorge Lopez
Horario: de 7 a 16 hrs.
Taxi Placas: 000734-AUTW

108

FIN DEL PROGRAMA

5.8 Clases abstractas


Son aquellas clases que son definidas como abstract ya que solo se espera que tenga rasgos
comunes a subclases que se derivarn de ella, y no permite definir instancias de ella. Normalmente
las clases que estn por encima en la jerarqua son ms abstractas que las inferiores que son mas
concretas.
Tambin podemos considerar una clase como abstracta cuando una clase tiene por lo menos un
mtodo declarado pero sin implementacin, a este tipo de mtodos se les denomina mtodos
abstractos.
Al declarar mtodos abstractos, usted obliga a sus clases a especializarse sobre la clase base
proporcionando una implementacin para los mtodos abstractos. A travs de hacer abstracta una
clase base y de crear mtodos abstractos usted planea de antemano lo que las subclases deben
redefinir.
Por ejemplo supongamos que queremos hacer un software de tipo editor grfico interactivo. Nuestro
software tendr como caracterstica principal dibujar figuras geomtricas, borrarlas, calcular sus reas
correspondientes, etc. Podemos partir de una definicin abstracta de figura. Cuando mis alumnos
no entienden que es clase abstracta les pido que pasen al pizarrn a dibujar una figura, unos dibujan
crculos, otros tringulos, otros rectas, polgonos, etc. " todos dibujan figuras concretas diferentes
pero nunca una figura abstracta en si ", esto es, el concepto figura es un concepto abstracto,
entonces partimos de la definicin de una clase abstracta como la que se ve a continuacin:
/**
*Programa de Java que ejemplifica el uso
* de las clases abstractas y los mtodos abstractos
* para delegar a sus clases hijo o subclases la
* implementacin o redefinicin de lo mtodos abstractos
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo : Figura.java
*/
public abstract class Figura{
protected double area;
public abstract void dibuja();
public abstract void borra();
public abstract double getArea();
public abstract String escribeArea();
} // fin de Figura
Con esto podemos planificar la herencia, delegando a los mtodos de las subclases el comportamiento
concreto de cada uno de los mtodos abstractos que tienen que ser redefinidos ( si no son
redefinidos o sobreescritos ) el compilador no lo recordar. En el tema de polimorfismo veremos
como podemos crear esas clases derivadas con el ejemplo las figuras.
5.9 Polimorfismo
El polimorfismo ( poli = muchas , morfismo = formas ) es una de las propiedades importantes de la

109

Programacin Orientada a Objetos. Para entender el polimorfismo debemos entender primeramente


la herencia porque ste concepto esta muy relacionado con el polimorfismo.
El polimorfismo es una de las tcnicas ms importantes que permiten al programador "Separar las
cosas que cambian de las cosas que deben permanecer igual", as se puede reutilizar cdigo existente
para las cosas que quedan sin cambios y crear cdigo nuevo para las cosas que cambian.
5.9.1 Enlazamiento temprano
En el polimorfismo, cuando conectamos una llamada (invocacin) de un mtodo con su cuerpo de
sentencias, esto es denominado ligado. Cuando el ligado es ejecutado antes de que el programa sea
ejecutado, a esto se le conoce como enlazamiento temprano ( early binding ).
Con el polimorfismo es posible que objetos similares respondan a el mismo mensaje de diferentes
maneras. Si ese mensaje o ligado se hace en tiempo de compilacin, entonces estamos hablando de
enlazamiento temprano.
Por ejemplo, se puede tener un sistema con muchas formas. Sin embargo, un circulo, un cuadrado,
y un tringulo se dibujan de diferente forma y tienen diferentes reas. Usando el polimorfismo
usted puede enviar a cada una de las formas el mismo mensaje ( por ejemplo, dibuja ) , y cada
forma es responsable de dibujarse as misma.

El siguiente ejemplo trata de diferentes figuras geomtricas a las cules hay que calcularles su rea,
esto es, tienen que responder al mensaje de calcula tu rea. La clase base o superclase de todas las
figuras es la clase abstracta Figura, la cual determina los atributos y comportamientos que tienen
que redefinir cada una de las clases concretas que hereden de ella.
Si quieres obtener el cdigo clic aqu UsaFiguras.zip
/**
*Programa de Java que ejemplifica el uso
* de las clases abstractas y los mtodos abstractos
* para delegar a sus clases hijo o subclases la
* implementacin del mtodo abstracto y as
* obtener polimorfismo
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo : Figura.java
*/
public abstract class Figura{
protected double area;
public abstract double getArea();
public abstract String escribeArea();
} // fin de Figura

110

concreta tiene que sobreescribir o sobreponer los mtodos abstractos de la clase Figura. Veamos la
clase para el caso de un rectngulo:
/**
* Programa de Java que ejemplifica el uso
* de las clases que heredan mtodos abstractos
* de una clase abstracta llamada Figura para
* as poder implementar polimorfismo con
* enlazamiento temprano para el caso
* de una figura Rectangulo
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Rectangulo.java
*/
public class Rectangulo extends Figura{
double alto;
double ancho;
public Rectangulo(double alto, double ancho) {

this.alto = alto;
this.ancho = ancho;

public double getArea() {

area = alto * ancho;


return (area);

public String escribeArea() {


String mensaje= "El area del rctangulo de alto= " + alto+
"y de ancho= " + ancho + " es : " + getArea();
return mensaje;
}
} // fin de Rectangulo

En el cdigo anterior de la clase Rectangulo, observe que ya estn redefinidos o sobreescritos los
mtodos getArea() y escribeArea() porque as esta especificado en la clase abstracta Figura.
Adems necesitamos dos variables para el alto y ancho del rectngulo y son inicializadas en el
constructor. A continuacin tenemos el cdigo de la clase Crculo la cual tambin redefine los
mtodos que le vienen de su superclase abstracta Figura y agrega la variable para el radio que se
inicializa en el constructor:
/**
* Programa de Java que ejemplifica el uso
* de las clases que heredan mtodos abstractos
* de una clase abstracta llamada Figura para as poder
* implementar polimorfismo con enlazamiento temprano
* ( early binding ) de la figura Circulo
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0

111

* Archivo: Circulo.java
*/
public class Circulo extends Figura{
double radio;
public Circulo (double r) {
radio= r;
}
public double getArea() {
area = 3.14 * (radio * radio );
return (area);
}
public String escribeArea() {
String mensaje= "El area del circulo de radio = " + radio +
" es : " + getArea();
return mensaje;
}
} // fin de Circulo
Por ltimo escribimos el cdigo de una clase que use las figuras y sus clases concretas
correspondientes. Al traducir el cdigo fuente a byte code con el compilador de Java , este ya conoce
los mtodos polimrficos getArea() y escribeArea() y a que clase o tipo de objeto corresponden,
gracias al enlazamiento temprano ( early binding ) , que ocurre en el proceso de compilacin. Al
ejecutar el programa con el intrprete de Java, este sabe que c.getArea() pertenece a un objeto de
la clase Circulo y que r.getArea() pertenece a un objeto de la clase Rectangulo. Veamos el
cdigo siguiente:
/**
* Programa de Java que ejemplifica el uso
* de las clases que heredan mtodos abstractos
* de una clase abstracta para as poder
* implementar polimorfismo con enlazamiento
* temprano ( early binding ).
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: UsaFiguras.java
*/
public class UsaFiguras {
public static void main( String argumentos[] ) {
Circulo c = new Circulo(30);
Rectangulo r = new Rectangulo(30, 40);
System.out.println("Area del circulo de radio= 30 es: " + c.getArea() );
System.out.println("Area del rectangulo de 30x40 es: " + r.getArea() );
System.out.println("Fin del programa");
}
} // fin de UsaFiguras

112

Para compilar y ejecutar ste programa de UsaFiguras, hay que ejecutar los siguientes comandos:
javac Figura.java
javac Rectangulo.java
javac Circulo.java
javac UsaFiguras.java
java UsaFiguras
La salida del programa es:
Area del circulo de radio= 30 es: 2826.0
Area del rectangulo de 30x40 es: 1200.0
Fin del programa
5.9.2 Enlazamiento tardo
En la seccin anterior ya habamos visto que en el polimorfismo, cuando conectamos una llamada
(invocacin) de un mtodo con su cuerpo de sentencias, esto es denominado ligado, y que cuando
el ligado es ejecutado antes de que el programa sea ejecutado, a esto se le conoce como
enlazamiento temprano ( early binding ). Qu ocurre cuando el ligado es en tiempo de
ejecucin ?
Cuando el ligado ocurre en tiempo de ejecucin sobre el tipo del objeto, a esto se le conoce como

enlazamiento tardo. El enlazamiento tardo tambin es denominado enlazamiento dinmico o


enlazamiento en tiempo de ejecucin.

Cuando un lenguaje de programacin implementa el enlazamiento tardo, debe haber algn


mecanismo que determine el tipo del objeto en tiempo de ejecucin para llamar al mtodo
apropiado. Esto significa que el compilador sigue sin saber el tipo del objeto, pero dicho mecanismo
de llamada del mtodo lo resuelve y llama al cuerpo del mtodo correcto.
Una vez que usted esta conciente de que todo ligado o invocacin de mtodos en Java ocurre
polimrficamente va enlazamiento tardo, usted puede escribir su cdigo para llamar a la clase base y
saber que todas las clases derivadas trabajarn correctamente usando el mismo cdigo. O
ponindolo de otra forma, "Usted enva un mensaje a un objeto y deja al objeto que decida la accin
correcta a hacer".
El clsico ejemplo de figuras geomtricas es muy ilustrativo para ejemplificar el polimorfismo con
ligado dinmico. En el ejemplo de figuras tiene una clase base llamada Figura y varios tipos de
clases derivadas: Circulo, Rectangulo, Triangulo, etc.. La razn de usar ste ejemplo es porque
que trabaja bien cuando decimos que un circulo es un tipo de figura, y puede ser entendido. Ver el
diagrama de clases:

113

Con la herencia relacionando las clases podemos hacer upcasting o conversin de la clase de un
objeto a la de su clase base y se realiza con:
Figura f = new Circulo();
Aqu, un objeto Circulo es creado y la referencia resultante es inmediatamente asignada a Figura, lo
cual podra ser un error a primera vista, ( asignacin de un tipo por otro ); no obstante esto esta es
correcto , porque un Circulo es una Figura por herencia. As que el compilador esta de acuerdo con
esto y la sentencia no arroja ninguna clase de error.
Suponga ahora que usted invoca a un mtodo de la clase base ( que han sido sobre escritos en las
clases derivadas.
f.dibuja();
Y de nueva cuenta, usted podra esperar que el mtodo dibuja() de Figura es ejecutado, porque
despus de todo es una f es una referencia a Figura, y se preguntara como podra hacer el
compilador lo correcto, y a pesar de esto, el mtodo correcto Circulo.dibuja() es invocado debido
a el enlazamiento tardo (polimorfismo).
El siguiente programa ejemplifica stos conceptos, al cual le hemos agregado una clase Triangulo
para el caso del trangulo. La clase UsaFigurasDos hace uso de las clases Figura, Rectangulo,
Circulo y Triangulo para invocar o llamar al mtodo escribeArea() de manera polimrfica
mediante el enlazamiento tardo, al invocarlo en el ciclo for en:
// llena el arreglo con figuras
for ( int i=0; i < f.length; i++ )
f[i] = figuraalAzar();
aqu el mtodo figuraalAzar() devuelve un objeto de las clases Rectangulo, Circulo y Triangulo
pero lo hace al azar y en tiempo de ejecucin. Luego al invocar al mtodo escribeArea() en el ciclo
for as:
// Hace llamadas a los metodos polimrficos con
// enlazamiento dinmico o early binding
for ( int i=0; i < f.length; i++ )
System.out.println(f[i].escribeArea());
se consigue escribir el rea de la figura adecuada gracias al enlazamiento que se hace de forma
dinmica o en tiempo de ejecucin y que determina a que clase de objeto estamos haciendo
referencia. veamos todo el cdigo del programa:

114

/**
* Programa de java que ejemplifica el uso
* de las clases que heredan mtodos
* de una clase base para as poder
* implementar polimorfismo y el enlazamiento
* tardio o enlazamiento dinmico
* que ocurre en tiempo de ejecucin.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: UsaFigurasDos.java
*/
class Triangulo extends Figura{
double base;
double altura;
public Triangulo(double base, double altura) {
this.base = base;
this.altura = altura;
}
public double getArea() {
area = (base * altura)/2.0;
return (area);
}
public String escribeArea() {
String mensaje= "Area del Triangulo de base=" + base +
"\n y de altura=" + altura + " es: " + getArea();
return mensaje;
}
} // fin de Triangulo
public class UsaFigurasDos {
public static Figura figuraalAzar() {
switch ( (int) (Math.random() * 3) ) {
case 0 : return new Circulo(30);
case 1 : return new Rectangulo(40,30);
case 2 : return new Triangulo(30, 40 );
default : return null;
}
}
public static void main( String argumentos[] ) {
Figura f[]= new Figura[9];
// llena el arreglo con figuras
for ( int i=0; i < f.length; i++ )
f[i] = figuraalAzar();
// Hace llamadas a los metodos polimrficos con
// enlazamiento dinmico o early binding
for ( int i=0; i < f.length; i++ )
System.out.println(f[i].escribeArea());
System.out.println("Fin del programa");
}

} // fin de UsaFigurasDos

Para correr el programa hay que ejecutar el siguiente comando java UsaFigurasDos y la salida es
la siguiente:

115

Area del Triangulo de base=30.0


y de altura=40.0 es: 600.0
El area del rctangulo de alto= 40.0 y de ancho= 30.0 es : 1200.0
Area del Triangulo de base=30.0
y de altura=40.0 es: 600.0
El area del circulo de radio = 30.0 es : 2826.0
Area del Triangulo de base=30.0
y de altura=40.0 es: 600.0
El area del circulo de radio = 30.0 es : 2826.0
El area del rctangulo de alto= 40.0 y de ancho= 30.0 es : 1200.0
El area del rctangulo de alto= 40.0 y de ancho= 30.0 es : 1200.0
Area del Triangulo de base=30.0
y de altura=40.0 es: 600.0
Fin del programa

5.10 Interfaces
En esta seccin veremos la utilidad de una potente herramienta denominada interface. La palabra
reservada interface toma el concepto de abstract un paso mas adelante. Usted puede pensar que
una interface como un clase abstracta "pura". Una interface solo provee la forma , pero no la
implementacin.
Las interfaces nacen ah donde la jerarqua de clases hasta ahora tratada se queda corta para el
diseo de complejos programas. Entonces entra una nueva jerarqua que es la jerarqua de
interfaces. La idea es algo parecida a la herencia mltiple pero no es tal.
5.10.1 Qu es una interfaz?
La interface en Java es la clase mas abstracta posible. Esta constituida solamente de mtodos
pblicos abstractos ( nombres de mtodos, lista de argumentos y tipos de retorno , pero no cuerpos
de mtodos, y son implicitamente abstract ) y atributos pblicos y finales (que son implicitamente
static y final).
Cuando se dice que una clase implementa una interfaz es porque sta define todos los mtodos
abstractos de la interfaz. Una clase que implementa una interfaz se comporta como si hubiese
extendido una clase abstracta especificada por la interfaz.
La diferencia fundamental entre una clase abstracta y una interfaz es que, aunque ambas especifican
cmo deben comportarse las subclases, la interfaz no puede dar ningn detalle acerca de la
implementacin de los mtodos ni de los atributos. La consecuencia de estas restricciones es que la
existencia de varias interfaces no presenta los mismos problemas potenciales que la herencia
mltiple. De este modo, mientras que en Java una clase puede extender slo a otra clase base, si que
puede implementar a varias interfaces (implementacin de herencia mltiple).
5.10.2 Creacin de una interfaz
Para crear una interface, hay que utilizar la palabra reservada interface en lugar de la palabra
reservada class. Puede agregar la palabra reservada public antes de la palabra interface - pero
solamente si la interface es definida en un archivo de el mismo nombre - o dejarla con el acceso de
paquete, as solo ser utilizable dentro del mismo paquete.
5.10.4 Ejemplo de interfaces mltiples
Veamos el siguiente ejemplo. Se tiene una clase llamada Zoo que en el mtodo main crea una

116

instancia de Zoo invocando al constructor por omisin. El constructor de Zoo escribe el mensaje de
bienvenida con el mtodo esttico be de la clase Escri , y crea una instancia de la clase
Ornitorrinco. La clase Ornitorrico es una extensin de la clase Mamfero y el constructor de
Mamifero enva otro mensaje por pantalla. Tambin la clase Ornitorrinco implementa los mtodos de
las interfaces Animal, Vertebrado, Anfibio y Oviparo, pero observe que la interface Animal es
una extensin de otra interface llamada Vivo, por lo tanto la clase Ornitorrinco tiene que implementar
los mtodos de la interface Animal y los mtodos de la interface Vivo, ya que estn relacionadas con

herencia entre interfaces. Vea el siguiente diagrama:

Siquieres obtener el cdigo clic aqu Zoo.zip


/**
* Programa de java que te ensea el uso
* de interfaces mltiples y de como clases
* concretas las implementan
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Zoo.java
*/
interface Vivo {
String estoyvivo();

117

}
interface Animal extends Vivo {
String soyanimal();
}
interface Vertebrado {
String soyvertebrado();
}
interface Anfibio {
String soyanfibio();
}
interface Oviparo {
String soyoviparo();
}
class Mamifero {
Mamifero () { Escri.be( "Da leche a sus crios \n" ); }
}
class Ornitorrinco extends Mamifero
implements Animal, Vertebrado, Anfibio, Oviparo {
public
public
public
public
public

String
String
String
String
String

estoyvivo() { return "Tiene vida"; }


soyanimal() { return "Es un Animal"; }
soyvertebrado() { return "Tiene vertebras"; }
soyanfibio() { return "Es anfibio, vive en rios y en la tierra"; }
soyoviparo() { return "Pone huevos"; }

}
public class Zoo {
Ornitorrinco ornito;
Zoo() {
Escri.be( "Bienvenidos al Zoologico de Chapultepec \n" +
"Decirme por favor que cosa es aquella que: \n\n" );
ornito = new Ornitorrinco();
Escri.be( ornito.estoyvivo() + "\n" +
ornito.soyanimal() + "\n" +
ornito.soyvertebrado() + "\n" +
ornito.soyanfibio() + "\n" +
ornito.soyoviparo() + "\n\n" );
Escri.be( "Su respuesta: Es un Ornitorrinco !! \n" +
"Gracias por su visita al Zoologico, adios. \n");
}//fin del constructor de zoo
public static void main( String [] args ) {
Zoo z = new Zoo();
}
}//fin de la clase Zoo
// clase utilitaria para escribir en la pantalla
class Escri {
public static void be( String msj ) { System.out.print( msj ) ; }
}// fin de la clase Escri

La salida del programa al ejecutarlo con el comando java Zoo es:

118

Bienvenidos al Zoologico de Chapultepec


Decirme por favor que cosa es aquella que:
Da leche a sus crios
Tiene vida
Es un Animal
Tiene vertebras
Es anfibio, vive en rios y en la tierra
Pone huevos
Su respuesta: Es un Ornitorrinco !!
Gracias por su visita al Zoologico, adios.

5.10.5 Agrupacin de constantes en una interfaz


Debido a que cualquier campo que se ponga dentro de una interface se convierte automticamente
en static y final, la interface es una herramienta apropiada para agrupar valores constantes, de
manera similar al enum en lenguaje C o C++, por ejemplo:
Siquieres obtener el cdigo clic aqu Estados.zip
/**
* Programa de java que ejemplifica el uso
* de la interfaces como una herramienta
* contenedora de constantes static , final
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Estados.java
* Paquete: constantes
*/
package constantes;
public interface Estados {
int
AGUASCALIENTES = 1, BAJA_CALIFORNIA = 2, BAJA_CALIFORNIA_SUR = 3,
CAMPECHE = 4,
COAHUILA = 5, COLIMA = 6, CHIAPAS = 7, CHIHUAHUA = 8, DISTRITO_FEDERAL = 9,
DURANGO = 10, ESTADO_DE_MXICO = 11, GUANAJUATO = 12, GUERRERO = 13,
HIDALGO = 14, JALISCO = 15, MICHOACAN = 16, MORELOS = 17, NAYARIT = 18,
NUEVO_LEON = 19, OAXACA = 20, PUEBLA = 21, QUERETARO = 22, QUINTANA_ROO = 23,
SAN_LUIS_POTOSI = 24, SINALOA = 25, SONORA = 26, TABASCO = 27, TAMAULIPAS = 28,
TLAXCALA = 29, VERACRUZ = 30, YUCATAN = 31, ZACATECAS = 32;
} //fin de la interface Estados
Note el estilo de Java de usar todas las letras en maysculas ( con guiones bajos para separar las
palabras en un solo identificador) para las constantes static y final que tienen que ser inicializadas.
Los campos en la interface son pblicos automticamente , as que no es necesario especificarlo.
Puedes usar las constandes desde un paquete importando constantes.* o constantes.Estados, tal y
como cualquier otro paquete y se pueden referenciar expresiones como Estados.DISTRITO_FEDERAL.

5.10.6 Ejemplo de un sistema robusto de enumeracin


Esta es una forma de enumerar constantes pero si se desea una mayor seguridad para el manejo de
constantes enumeradas se puede crear una clase final para hacer mas robusto el sistema de

119

enumeracin de constantes por ejemplo:


Siquieres obtener el cdigo clic aqu constantes.zip
/**
* Programa de java que ejemplifica el uso
* de la un sistema mas robusto de enumeracin
* contenedora de constantes static , final
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Estado.java
* Paquete: constantes
*/
// Un sistema ms robusto de enumeracin
public final class Estado {
private String nombre;
private Estado(String nom) { nombre = nom; }
public String toString() { return nombre; }
public static final Estado
AGS = new Estado("Aguascalientes"),
BCN = new Estado("Baja California Norte"),
BCS = new Estado("Baja California Sur"),
CAM = new Estado("Campeche"),
COA = new Estado("Coahuila"),
COL = new Estado("Colima"),
CHI = new Estado("Chiapas"),
CHU = new Estado("Chihuahua"),
DFE = new Estado("Distrito Federal"),
DGO = new Estado("Durango"),
EDM = new Estado("Estado de Mxico"),
GTO = new Estado("Guanajuato"),
GUE = new Estado("Guerrero"),
HGO = new Estado("Hidalgo"),
JAL = new Estado("Jalisco"),
MIC = new Estado("Michoacn"),
MOR = new Estado("Morelos"),
NAY = new Estado("Nayarit"),
NUL = new Estado("Nuevo Len"),
OAX = new Estado("Oaxaca"),
PUE = new Estado("Puebla"),
QUE = new Estado("Queretaro"),
QRO = new Estado("Quintana Roo"),
SLP = new Estado("San Luis Potos"),
SIN = new Estado("Sinaloa"),
SON = new Estado("Sonora"),
TAB = new Estado("Tabasco"),
TAM = new Estado("Tamaulipas"),
TLX = new Estado("Tlaxcala"),
VER = new Estado("Veracruz"),
YUC = new Estado("Yucatn"),
ZAC = new Estado("Zacatecas");

120

public static final Estado[] estado = {


AGS, BCN, BCS, CAM, COA, COL,
CHI, CHU, DFE, DGO, EDM, GTO,
GUE, HGO, JAL, MIC, MOR, NAY,
NUL, OAX, PUE, QUE, QRO, SLP,
SIN, SON, TAB, TAM, TLX, VER,
YUC
};
public static final Estado numero(int ord) { return estado[ord - 1]; }
public static void main(String[] args) {
Estado e = Estado.AGS;
System.out.println(e);
e = Estado.numero(9);
System.out.println(e);
System.out.println(e == Estado.DFE);
System.out.println(e.equals(Estado.DFE));
System.out.println(Estado.estado[3]);
}// fin del main
} //fin de la case Estado
La salida del programa al ejecutarlo con el comando java Estado es:
Aguascalientes
Distrito Federal
true
true
Campeche
Ahora veamos un ejemplo que utilice la interface Estados y la clase Estado, ambas pertenecen al
paquete constantes.*; por lo tanto debe utilizarce la palabra reservada import para utilizarlas,
veamos el cdigo de ejemplo:
/**
* Programa de java que ejemplifica el uso
* del paquete constantes donde esta la interface
* Estados y la clase Estado que conforman
* un sistema robusto de enumeracin
* contenedora de constantes static , final
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Usaconstantes.java
* Utiliza el paquete: constantes
*/
import constantes.*;
class Usaconstantes implements Estados {

121

public static void main(String[] args) {


Estado e = Estado.ZAC;
System.out.println(e);
e = Estado.numero( DISTRITO_FEDERAL );
System.out.println(e);
System.out.println(e == Estado.DFE);
System.out.println(e.equals(Estado.DFE));
System.out.println(Estado.estado[20]);
}
} // fin de la clase Usaconstantes
La salida del programa al ejecutar el comando java UsaConstantes es:
Zacatecas
Distrito Federal
true
true
Puebla
6. Usando arreglos y strings
Un arreglo es una estructura de datos homognea o conjunto de elementos del
mismo tipo. En Java se pueden manejar arreglos de elementos de tipo primitivo
(8 tipos primitivos hay en Java) o arreglos de objetos. Los arreglos son variables
con ndice, y pueden ser unidimensionales, bidimensionales o n dimensionales.
Tradicionalmente las cadenas o strings suelen ser implementados en los
lenguajes de programacin como un tipo de dato o simplemente se manejan
con apuntadores y arreglos de tipo char como el caso de C y C++. En Java se
crearon dos clases para menejo de cadenas; la clase String y la StringBuffer.
Como veremos, la clase primera clase maneja cadenas inmutables y la segunda
es para cadenas mutables y sus mtodos son muy utilizados en la programacin
con Java.
6.1 Declaracin e inicializacin de arrays
Para crear un arreglo de cualquier tipo de elementos la sintaxis es:
tipo-elemento[] nombre;
// declara un arreglo
// asigna almacenamiento
nombre = new tipo-elemento[n];
// para los n elementos
o tambin puede declararse y asignarse localidades de almacenamiento para los n elementos as:
tipo-elemento[]

nombre = new tipo-elemento[n];

Ejemplos:
float[] x;

// declara x como una referencia a un arreglo de floats

x = new float[8]; // aloja un arreglo de 8 elementos


//de tipo float, referenciados por x

122

boolean[] banderas = new boolean[1024];// aloja un arreglo de 1024 elementos de


// tipo boolean referenciados por banderas
String[] nombres new String[32];// aloja un arreglo de 32 elementos spm objetos de
// la clase String referenciados por nombres
Point[] ideal = new Point[10][10];// aloja un arreglo de 100 elementos son objetos de
// la clase Point referenciados por ideal, y es un
// un arreglo bidemensional.
La inicializacin de arreglos es similar a como se hace en lenguaje C . Se ponen los valores entre
llaves { } si se desean inicializar en tiempo de compilacin, (de cualquier manera Java garantiza la
inicializacin con valores por omisin dependiendo del tipo ). Tambin pueden inicializarse de la
manera tradicional con asignacin mediante el operador [], veamos el siguiente fragmento de cdigo:
//Aqu el compilador no sabe que tan grande es el array a1.
int[] a1; //tienen el mismo
int a1[]; //significado
int[] a2;
//Es posible inicializar arrays de esta forma
int[] a1 = { 1, 2, 3, 4, 5 }; // inicializacin
// Es posible asignar un array a otro usando
// los handles o referencias:
a2 = a1;
Ejemplo de inicializacin de arreglos y copia de arreglos:
Si quieresobtener el cdigo clic con el botn derecho aqu ArraysIniUno.zip
/**
* Programa de Java que te ensea a declarar
* e inicializar arreglos (arrays). La inicializacin
* se efecta en tiempo de compilacin, dando los
* valores entre llaves.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ArraysIniUno.java
*/
public class ArraysIniUno {
public static void main(String[] args) {
int[] a1 = { 1, 2, 3, 4, 5 }; // declaracin e inicializacin
int[] a2;
a2 = a1; // asignando a a2 los valores de a1
for(int i = 0; i < a2.length; i++)
a2[i]++;
for(int i = 0; i < a1.length; i++)
prt("a1[" + i + "] = " + a1[i]);
}
static void prt(String s) {
System.out.println(s);
}
}
La salida del programa al ejecutarlo con el comando java ArrayIniUno es:
a1[0] = 2

123

a1[1]
a1[2]
a1[3]
a1[4]

=
=
=
=

3
4
5
6

6.1.1 Creacin de arrays


Cuando creamos arrays en Java, necesitamos utilizar el operador new , para reservar espacio en
memoria para almacenar todos los elementos. As , de esta manera se indica el nmero de
elementos que tendr en cada dimensin. se crean los arrays de la siguiente forma:
identificador = new tipo [ tamao ];
identificador = new tipo [ tamao] ... [ tamao ];
Es necesario indicar que el primer elemento de un array tiene un ndice cero, y el ltimo tiene un
ndice ( tamao - 1 ).
Cabe sealar que cuado creamos arrays de tipos primitivos y arrays de objetos difieren en cuanto al
espacio de memoria en que se crean, por ejemplo en un array de primitivos :
int[] a1 = { 1, 2, 3, 4, 5 }; // declaracin e inicializacin
Abra sido equivalente que hiciramos:
int[] a1 = new int[5]; // declaracin
a1[0]= 1; // inicializacin
a1[1]= 2;
a1[2]= 3;
a1[3]= 4;
a1[4]= 5 ;
Tenemos el siguiente modelo de memoria cuando declaramos el arreglo a1 ver siguiente figura:

Figura: Tras declarar el array a1 , se reserva espacio en la memoria stack para la referencia del array.
Despus de usar el operador new para colocar espacio, se reserva memora heap para el contenido
del array. Los valores son inicializados automticamente a 0, si no es que los inicializamos de forma
explcita. Ver la figura del modelo de memoria cuando tras colocar el espacio int[] a1 = new int[5].

124

Por otra parte, para un array de objetos el espacio colocado es para contener una referencia al
objeto, no el objeto en s. Por ejemplo, veamos que al definir una clase Calendario que contenga el
nombre del mes y un nmero de das.
public class Calendario {
String mes;
int nodias;
Calendario ( String mes, int nodias ) {
this.mes = mes;
this.nodias = nodias;
}
}// fin de la clase calendario
Despus de definir la clase , se puede crear un array de esos elementos: new Calendario[12]. El
modelo de memoria tendr el aspecto de la figura siguiente al asignar espacio Calendario c[] =
new Calendario[12].

Se observar que an no hay espacio reservado para objetos Calendario. Todo lo que hay en el array
es una referencia null. Esto no sucede hasta que se reserva espacio mediante new Calendario(..)
y se agregue el objeto a la matriz mediante c[ x ] = ... el modelo de memoria no ser afectado. En
la siguiente figura se muestra el modelo tras ejecutar las siguientes sentencias:
c[ 0 ] = new Calendario("Enero", 31 );
c[ 1 ] = new Calendario("Febrero" , 28);

125

Figura que muestra el array de objetos despus de la asignacin.


6.1.2 Uso de arrays
En java.util tenemos la clase Arrays , la cual contiene un conjunto de mtodos estticos que
permiten manipular arrays. Hay cuatro mtodos bsicos:
equals()
fill()
sort()
binarySearch()

para
para
para
para

comparar la igualdad de dos arrays.


rellenar un array con un valor determinado.
ordenar el array
bsqueda de un dato en un array

Todos estos mtodos estn sobrecargados para los distintos tipos de datos primitivos y para objetos.
Adicionalmente se tiene un mtodo simple asList() que hace que un array se convierta en un
contenedor List, que es una clase para manejar colecciones de objetos como un contenedor, lo cual
es tema para un curso avanzado de Java.
El siguiente ejemplo ( ver figura abajo ) hace uso de algunos de estos mtodos y consta de las
siguientes clases que manejan un arreglo de objetos, los ordena y obtiene promedio, varianza, etc.,
contiene:
-Persona.java para asignar valores de Nombre, apellido y edad
-Estudiante.java extiende Persona, asigna valores de calificacin y pasa los dems valores a la clase
Persona
-Mascarones.java ordena el arreglo por nombre y por calificacin, calcula los valores de promedio,
varianza, mnima y mxima calificacin
-usaEstudiante.java inicializa y asigna el arreglo, manda llamar las demas clases e imprime el
contenido del arreglo original, ordenado y los clculos de promedio, varianza, etc.

126

Si quieresobtener el cdigo de todo el ejemplo dale clic con el botn


derecho aqu usaEstudiante.zip
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.

import java.util.*;
import java.util.Collections;
/**
* <p>Archivo: usaEstudiante.java </p>
* <p>Descripcin: Te ensea a usar el ordenamiento de arreglos
* mediante el uso de colecciones de la clase List</p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Gerardo Gonzlez ( alumno del curso de Java )
* amplio y reviso: Oscar Alejandro Gonzlez Bustamante.
* @version 1.0
*/
public class usaEstudiante {
public static Estudiante[] est = new Estudiante[10];
public static void main(String[] args) {
//Inicializa y asigna el Arreglo
est[0]= new Estudiante("Gerardo","Gonzalez ",27,10.0);
est[1]= new Estudiante("Ramon ","Fernandez",30,9.99);
est[2]= new Estudiante("Rocio ","Espejo ",29,8.5);
est[3]= new Estudiante("Octavio","Garces ",29,10.0);
est[4]= new Estudiante("Mariana","Rosas ",33,6.9);
est[5]= new Estudiante("Ricardo","Lopez ",33,9.50);
est[6]= new Estudiante("Ernesto","Ramirez ",26,8.0);

127

28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.

est[7]= new Estudiante("Maribel","Juarez ",26,6.8);


est[8]= new Estudiante("Pedro ","Sandoval ",31,5.5);
est[9]= new Estudiante("Ricardo","Cedillo ",30,10.0);
//Crea una lista con el arrglo existente y asigna valores
List list = new ArrayList(Arrays.asList(est));
System.out.println("\n\t\tARREGLO ORIGINAL\n"); //Imprime arreglo original
System.out.print(" NOMBRE
APELLIDO EDAD CALIFICACION\n\n");
for(int i=0; i<10; i++)
System.out.println(list.get(i));
//Manda llamar a clase Mascarones para ordenar
Mascarones nc = new Mascarones();
Collections.sort(list, nc);
//Ordenacion por nombre
//Imprime los elementos de la lista
System.out.println("\n\n\t\tARREGLO ORDENADO POR: NOMBRE\n");
for(int i=0; i<10; i++)
System.out.println(list.get(i));
Mascarones2 cc = new Mascarones2(est); //Nueva clase Mascarones2
cc.insertionSort();
//Llama a metodo insercion
System.out.println("\n\n\t\tARREGLO ORDENADO POR: CALIFICACION\n");
cc.display();
//Muestra el arreglo en clase Mascarones2
double promedio=0.0;
//Sobrecarga constructor para calculo de promedio, varianza, MaxCalif, MinCalif
cc.Mascarones2(promedio);
cc.displayFinal();
//Muestra los valores del calculo
} //Fin main()
} //Fin clase usaEstudiante

import java.util.*;
/**
* <p>Archivo: Mascarones.java </p>
* <p>Descripcin: Te ensea a usar el ordenamiento de arreglos
* mediante el uso de la interface Comparator que implementa el
* mtodo compare(). La clase Mascarones2 que esta dentro de este
* archivo, realiza el cculo de los estadisticos y el ordenamiento </p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Gerardo Gonzlez ( alumno del curso de Java )
* amplio y reviso: Oscar Alejandro Gonzlez Bustamante.
* @version 1.0
*/
/*Ordena por NOMBRE */
class Mascarones implements Comparator {
public int compare(Object o1, Object o2) {
Estudiante u1 = (Estudiante) o1;
Estudiante u2 = (Estudiante) o2;
return u1.getNombre().compareTo(u2.getNombre());
}
public boolean equals(Object o) {
return this == o;

128

25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.

}
} //Fin clase Mascarones
/*Ordena por CALIFICACION */
class Mascarones2 {
private Estudiante[] a;
Mascarones2(Estudiante[] arreglo) { //1er constructor
a = arreglo;
}
// Fin constructor Mascarones2
public void display() {
// Muestra el arreglo
for(int j=0; j<a.length; j++)
System.out.println(""+a[j].toString());
}
public void insertionSort()
int in, out;

//Ordenacion por insercion

for(out=1; out<a.length; out++) {


Estudiante temp = a[out];
in = out;
while(in>0 && a[in-1].getCalif() -(temp.getCalif())>0) {
a[in] = a[in-1];
--in;
}
a[in] = temp;
}
} // Fin ordenacion
//Declaracion de variables
public double promedioGral, varianza, MinValor, MaxValor;
public double Mascarones2(double prom){

//2o constructor

/*Calculo del promedio: Suma de todos los valores entre


*el No. de elementos */
for(int i=0; i<a.length; i++)
promedioGral+=a[i].getCalif();
promedioGral/=a.length;
/*Calculo de la varianza: Suma de todos los elementos al
*cuadrado entre el promedio al cuadrado */
for(int j=0; j<a.length;j++) {
varianza+=Math.pow( (a[j].getCalif()),2);
}
//El total de la suma manos el promedio al cuadrado
varianza=(varianza/10)-(Math.pow(promedioGral,2));
/*Calculo de valores minimos y maximos, usando el arreglo ya ordenado */
MinValor= a[0].getCalif();
MaxValor= a[(a.length-1)].getCalif();
return varianza;
} //Fin constructor Mascarones2
/*Muestra valores promedio, varianza, Valor minimo y maximo*/
public void displayFinal() {
System.out.println("\n\t Promedio: "+promedioGral+
"\n\t Varianza: "+varianza+
"\n\t Calificacion Minima: "+MinValor+

129

89.
90.
91.
92.

"\n\t Calificacion Maxima: "+MaxValor);


}
} //Fin clase Mascarones2import java.util.*;

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.

public class Persona {

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.

public class Estudiante extends Persona{

protected String nombre;


protected String ap;
protected int edad;
//Asigna valores del arreglo a cada elemento
Persona(String nombre, String ap, int edad)
this(nombre);
this.ap= ap;
this.edad = edad;
}

Persona(String nombre) {
this.nombre = nombre;
}
Persona() {
this.nombre=null;
this.ap=null;
this.edad=-1;
}
} //Fin clase Persona

public double calif;


//Asigna valores de calificacion del arreglo y pasa a clase Persona lo dems
Estudiante(String nombre, String ap, int edad, double calif) {
super(nombre, ap, edad);
this.calif= calif;
}
public String toString() {
//Muestra cada elemento del arreglo en posicin i
return " "+nombre+" "+ap+
" "+edad+" "+calif;
}
public String getNombre() { //Regresa el valor del nombre
return nombre;
}
public double getCalif() {
return calif;
}

//Regresa el valor de la calificacion

} //Fin clase Estudiante

6.2 Copia de arreglos

130

Cuando se copian arreglos en Java , segn lo que se desee , pueden copiarse las referencias
utilizando el operador de asignacin; y= x; pero puede perderse informacin, o puede utilizarse
tambin el mtodo arraycopy() de la clase System as:
System.arraycopy(x, 0, y, 0, x.length);
lo cual copia el arreglo x en y sin prdida de informacin, vea los siguientes dos ejemplos:
Ejemplo uno: De inicializacin de arreglos y copia de arreglos:
Si quieresobtener el cdigo clic con el botn derecho aqu CopiaArrayUno.java
/**
* Programa de Java que te ensea a copiar
* arreglos (arrays). La inicializacin
* se efecta en tiempo de compilacin, dando los
* valores entre llaves. La copia se hace
* mediante handles o referencias, lo cual
* puede producir prdida de informacin.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CopiaArrayUno.java
*/
class CopiaArrayUno
{ // prueba el efecto de asignar un array a otro array
public static void main(String args[])
{
double[] x = {2.2, 4.4};
print(x, "x");
double[] y = {1.1, 3.3, 5.5};
print(y, "y");
y = x; // intentamos copiar x en y
print(y, "y");
x[0] = 8.8;
print(x, "x");
print(y, "y");
}
static void print(double[] u, String id)
{
for (int i=0; i<u.length; i++)
System.out.println(id + "[" + i + "] = " + u[i]);
System.out.println();
}
}// fin de la clase CopiaArrayUno

La salida del programa al ejecutar el comando java CopiaArrUno es:


x[0] = 2.2
x[1] = 4.4
y[0] = 1.1
y[1] = 3.3
y[2] = 5.5
y[0] = 2.2

131

y[1] = 4.4
x[0] = 8.8
x[1] = 4.4
y[0] = 8.8
y[1] = 4.4
En salida del programa se puede observar la prdida de informacin del tercer elemento del arreglo y
con valor de 5.5, adems de que al asignarle un valor a la localidad x[0] = 8.8, sucede que afecta
tambin al arreglo y en su localidad 0. Si es lo que se desea en un programa, puede ser til, pero si
no, entonces se pierde informacin.
Para copiar arreglos sin prdida de informacin tenemos el mtodo El siguiente ejemplo de
inicializacin de arreglos y copia de arreglos con el mtodo:
arraycopy(Object src, int srcPos, Object dst, int dstPos, int count)
donde src y dst son los arreglos fuente y destino. srcPos es la posicin de inicio en el ndice del
arreglo fuente, dstPos es la posicin de inicio en el arreglo destino y count es el nmero de
elementos que van a ser copiados. Veamos el siguiente ejemplo:
Si quieresobtener el cdigo clic con el botn derecho aqu ArraysIniDos.zip
/**
* Programa de Java que te ensea a copiar
* arreglos (arrays). La inicializacin
* se efecta en tiempo de compilacin, dando los
* valores entre llaves. La copia se hace
* mediante el mtodo arraycopy() lo cual
* evita la prdida de informacin.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CopiaArrayDos.java
*/
class CopiaArrayDos
{ // prueba del mtodo System.arraycopy()
public static void main(String args[])
{
double[] x = {2.2, 4.4};
print(x, "x");
double[] y = {1.1, 3.3, 5.5};
print(y, "y");
System.arraycopy(x, 0, y, 0, x.length); // copia x en y
print(y, "y");
x[0] = 8.8;
print(x, "x");
print(y, "y");
}
static void print(double[] u, String id)
{
for (int i=0; i<u.length; i++)
System.out.println(id + "[" + i + "] = " + u[i]);
System.out.println();
}
} // fin de la clase CopiaArrayDos

132

La salida del programa al ejecutarlo con el comando java CopiaArrayDos es:


x[0] = 2.2
x[1] = 4.4
y[0] = 1.1
y[1] = 3.3
y[2] = 5.5
y[0] = 2.2
y[1] = 4.4
y[2] = 5.5
x[0] = 8.8
x[1] = 4.4
y[0] = 2.2
y[1] = 4.4
y[2] = 5.5
Ahora en este ejemplo de CopiaArrayDos, vemos que la asignacin x[0] = 8.8 solo afecta al
arreglo x, y que System.arraycopy(x, 0, y, 0, x.length) tiene el efecto de copiar desde el indice
0 del array x , x.length elementos ( que es una propiedad de todos los arreglos en Java para
obtener el tamao del array ) , desde la posicin 0 del array y. Aqu no hay prdida de la informacin
de la localidad y2[2] ya que su valor 5.5 se conserva.
Paso de arreglos como argumentos de un mtodo
En estos dos ejemplos pudimos ver como se pueden pasan los arreglos como argumentos a los
mtodos mediante la declaracin dentro de los como parmetros dentro de la definicin de un
mtodo:
static void print(double[] u, String id)
y tambin observamos, como son enviados los arreglos desde la invocacin o llamado para pasarlos
como argumentos:
print(x, "x");
6.3 Arreglo de objetos
Es una forma de aprovechar el upcasting y el polimorfismo ya todas las clases heredan de la clase
Object que es la ltima superclase, y por sta razn este tipo de arreglo puede almacenar cualquier
cosa, es realmente un arreglo universal. Ejemplo:
Si quieresobtener el cdigo clic con el botn derecho aqu ArreglodeObjetos.zip
/**
* Programa de Java que te ensea a declarar
* e inicializar arreglos (arrays) de objetos.
* La inicializacin
* se efecta en tiempo de compilacin, mediante
* upcasting y con enlazamiento temprano se invoca al
* mtodo toString() para obtener en una cadena

133

* los valores del estado de los objetos.


* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ArreglodeObjetos.java
*/
class Point{
private double x,y;
Point(double a, double b) {
x=a; y=b;
}
public String toString()
{
return new String("(" + x + ", " + y + ")");
}
}
class Nombre{
private String nom,ap;
Nombre(String n, String a){
nom=n;
ap=a;
}
public String toString() { return new String(nom + " " + ap); }
}
class CuerpoSelestial{
private String nom;
private double masa;
private int diametro;
private double periodo;
CuerpoSelestial(String n, double a1, int a2, double a3)
{
nom=n;
masa=a1; diametro=a2; periodo=a3;
}
public String toString() {
return new String(" nombre: " + nom +
"\n masa: " + masa + " gramos" +
"\n dimetro: " + diametro + " kilometros" +
"\n periodo: " + periodo + " dias");
}
}
public class ArreglodeObjetos
{
public static void main(String args[])
{ Object[] a = new Object[6]; // array de objetos
a[0] = new Point(2,3); // upcasting
a[1] = new String("Hola, Mundo!"); // upcasting
a[2] = new Long(44); // upcasting
a[3] = new Nombre("Oscar","Gonzlez"); // upcasting
a[4] = new CuerpoSelestial("Jupiter",18.99E29,142800,4331.7); // upcasting
for (int i=0; i<a.length; i++)
System.out.println("a[" + i + "] = " + a[i]); // invocacion a toString()
}
} // fin de la clase ArreglodeObjetos

134

La salida del programa al ejecutar el comando java ArreglodeObjetos es:


a[0] = (2.0, 3.0)
a[1] = Hola, Mundo!
a[2] = 44
a[3] = Oscar Gonzlez
a[4] = nombre: Jupiter
masa: 1.899E30 gramos
dimetro: 142800 kilometros
periodo: 4331.7 dias
a[5] = null

6.4 La clase String


Una cadena o string es una secuencia de caracteres. Las palabras, sentencias y nombres son
cadenas. El mensaje "Hola, Mundo" es un string. Tambin un objeto de la clase String es una
cadena o string y es uno de los tipos mas simples y utilizados en Java . Estos objetos no pueden
cambiarse, esto es, una cadena de la clase String es inmutable. El siguiente ejemplo muestra como
puede manejarse una cadena con un arreglo de caracteres y tambin con un objeto de la clase
String.
Para descargar el ejemplo dale clic aqu ArreglodeCaracteres.zip
/**
* Ejemplo: programa de Arreglos y Strings (cadenas)
* que ejemplifica el uso de la clase
* String y de un arreglo de caracteres
* para manejar cadenas.
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ArreglodeCaracteres.java
*/
class ArreglosdeCaracteres{
// Prueba de el mtodo String.toCharArray() y de acceso a un arreglo de caracteres
public static void main(String args[])
{
String s = new String("ABCDEFG");
char[] a = s.toCharArray();
System.out.println("s = \"" + s + "\"\t\ta = \"" + a + "\"");
System.out.println("s.length() = " + s.length() +
"\t\ta.length = " + a.length);
for (int i=0; i<s.length(); i++)
System.out.println("s.charAt(" + i + ") = " +
s.charAt(i) + "\t\ta[" + i + "] = " + a[i]);
}
} // fin de la clase ArreglosdeCaracteres

La salida del programa al ejecutarlo con el comando java ArreglodeCaracteres es:


s = "ABCDEFG"
s.length() = 7
s.charAt(0) = A
s.charAt(1) = B
s.charAt(2) = C

a = "[C@bd0108"
a.length = 7
a[0] = A
a[1] = B
a[2] = C

135

s.charAt(3)
s.charAt(4)
s.charAt(5)
s.charAt(6)

=
=
=
=

D
E
F
G

a[3]
a[4]
a[5]
a[6]

=
=
=
=

D
E
F
G

6.5 Algunos mtodos de la clase String


A continuacin se listan una serie de programas que ejemplifican algunos de los mtodos de la clase
String.

Ejemplo

Programa

Comentarios

Alfabeto.java

Manejo de las localidades de un string. Obtiene


logitud de cadenas, el caracter e indice y su cdigo
hash

Subcadenas.java

Una subcadena o substring es aquella cadena que


forma parte contiga de otra cadena. La clase
String contiene el mtodo substring() para extraer
subcadenas.

Cambiamayusminus
.java

BusquedaDeCaracte
res.java

Reemplaza.java

ConvierteValorPrimi
tivo.java

PrimitivoaCadena.ja
va

Mtod
os
ejempl
ificado
s
String.le
ngth(),
String.c
harAt(),
String.in
dexOf(),
String.h
ashCod
e().
String.s
ubstring
()

String.t
oLower
La clase String contiene mtodos que hacen posible
Case(),
cambiar de maysculas a minsculas y viceversa en
String.t
una cadena.
oUpper
Case()
String.in
dexOf(),
String.la
La clase String tiene mtodos que regresan el ndice
stIndex
de un caracter dentro de la cadena o el mismo
Of(),
caracter dando el ndice.
String.s
ubstring
()
La clase String de Java tiene el mtodo replace()
String.r
para remplazar un caracter dentro de una cadena.
eplace()
Pasando tipos de datos primitivos a cadenas y
viceversa, con el mtodo valueof() de la clase String String.v
para pasar el valor de variables de tipo primitivo a
alueOf()
cadenas.
Java tiene mtodos en clases wrappers para cada
Integer.
tipo primitivo de dato que permiten pasar el valor de
parseInt
una variable de la clase String a su equivalente
()
vlido de tipo primitivo.

Ejemplo 1.
Haga el programa en Java tal, que dada una cadena con las letras del alfabeto romano, .
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" , diga cuantas letras tiene la cadena, que carcter se
encuentra en la posicin 4, de el ndice de la letra Z , e informe el cdigo hash de dicha cadena.

136

// Curso de Java Bsico


// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 1 de cadenas o strings
public class Alfabeto
{
public static void main(String[] args)
{
String alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
System.out.println(alfabeto);
System.out.println("Esta cadena contiene "+alfabeto.length()+" caracteres.");
System.out.println("El caracter en el indice 4 es "+ alfabeto.charAt(4));
System.out.println("El indice de el caracter Z es "+ alfabeto.indexOf('Z'));
System.out.println("El codigo hash para esta cadena es " + alfabeto.hashCode());
}
}// fin de Alfabeto
/*
La salida de ste programita es:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Esta cadena contiene 27 caracteres.
El caracter en el indice 4 es E
El indice de el caracter Z es 26
El codigo hash para esta cadena es -287815408
*/

Ejemplo 2
Haga el programa en Java tal, que dada una cadena con las letras del alfabeto romano, .
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" , obtenga las subcadenas del ndice 4 al 8, del 4 al 4, del 4 al
5, del 0 al 8 y del 8 hasta el final de la cadena.
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 2 subcadenas o substrings
public class Subcadenas
{
public static void main(String[] argumentos)
{
String alfabeto= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
System.out.println(alfabeto);
System.out.println("La subcadena de indice 4 a indice 8 es "+ alfabeto.substring(4,
8));
System.out.println("La subcadena de indice 4 a indice 4 es "+ alfabeto.substring(4,
4));
System.out.println("La subcadena de indice 4 a indice 5 es "+ alfabeto.substring(4,
5));
System.out.println("La subcadena de indice 4 a indice 8 es "+ alfabeto.substring(0,
8));
System.out.println("La subcadena de indice 4 a indice es "+ alfabeto.substring(8));
}
} // fin de Subcadenas
/*
La salida de ste programa es:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
La subcadena de indice 4 a indice 8 es EFGH

137

La
La
La
La
*/

subcadena
subcadena
subcadena
subcadena

de
de
de
de

indice
indice
indice
indice

4
4
4
4

a
a
a
a

indice
indice
indice
indice

4 es
5 es E
8 es ABCDEFGH
es IJKLMNOPQRSTUVWXYZ

Ejemplo 3.
Haga el programa en Java tal, que dada una cadena , cambie a sta todas sus letras a minsculas y
luego a maysculas.
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 3 de maysculas y minsculas
public class Cambiamayusminus
{ public static void main(String[] args)
{ String cadena = "UNIVERSIDAD NACIONAL AUTONOMA DE MXICO";
System.out.println(cadena);
String minusc = cadena.toLowerCase();
System.out.println(minusc);
String mayusc = cadena.toUpperCase();
System.out.println(mayusc);
}
} // fin de Cambiamayusminus
/*
La salida del programa es:
UNIVERSIDAD NACIONAL AUTONOMA DE MXICO
universidad nacional autonoma de mxico
UNIVERSIDAD NACIONAL AUTONOMA DE MXICO
*/

Ejemplo 4.
Haga el programa en Java tal, que dada una cadena , busque un carcter en dicha cadena, y reporte
su posicin o ndice de cada ocurrencia
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 4 de localizar un caracter dentro de una cadena y viceversa
public class BusquedaDeCaracteres
{ public static void main(String[] argumentos)
{ String cad = "UNIVERSIDAD NACIONAL AUTOMA DE MXICO.";
System.out.println(cad);
int i = cad.indexOf('A');
System.out.println("El primer indice de 'A' es " + i);
int j = cad.indexOf('A', i+1);
System.out.println("El siguiente indice de 'A' es " + j);
int k = cad.indexOf('A', j+1);
System.out.println("El siguiente indice de 'A' es " + k);

138

k = cad.lastIndexOf('A');
System.out.println("El ltimo indice de 'A' es " + k);
System.out.println(cad.substring(k));
}
} // fin de BusquedaDeCaracteres
/*
UNIVERSIDAD NACIONAL AUTOMA DE MXICO.
El primer indice de 'A' es 9
El siguiente indice de 'A' es 13
El siguiente indice de 'A' es 18
El ltimo indice de 'A' es 26
A DE MXICO.
Finished executing
*/

Ejemplo 5.
Haga el programa en Java tal, que dada una cadena , busque un carcter en dicha cadena, y
reemplace ste por otro carcter.
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 5 de reemplazar un caracter dentro de una cadena
public class Reemplaza
{ public static void main(String[] argumentos)
{ String institucion= "INSTITUTO POLITCNICO NACIONAL";
System.out.println(institucion);
System.out.println(institucion.replace('T', 'Q'));
System.out.println(institucion.replace('O', '#'));
System.out.println(institucion);
}
} // fin de Reemplaza
/*
La salida del programita es:
INSTITUTO POLITCNICO NACIONAL
INSQIQUQO POLIQCNICO NACIONAL
INSTITUT# P#LITCNIC# NACI#NAL
INSTITUTO POLITCNICO NACIONAL
*/

Ejemplo 6.
Haga el programa en Java tal, que dadas unas variables primitivas boolean b = true;
int n = 123; double x = 3.1415926535897932; convierta sus valores a cadenas.

char c = '';

// Curso de Java Bsico


// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 6 que convierte tipos primitivos a cadenas
public class ConvierteValorPrimitivo

139

{ public static void main(String[] argumentos)


{
boolean b = true;
char c = '';
int n = 123;
double x = 3.1415926535897932;
System.out.println("b = " + b);
System.out.println("c = " + c);
System.out.println("n = " + n);
System.out.println("x = " + x);
String cadb = String.valueOf(b);
String cadc = String.valueOf(c);
String cadn = String.valueOf(n);
String cadx = String.valueOf(x);
System.out.println("cadb = " + cadb);
System.out.println("cadc = " + cadc);
System.out.println("cadn = " + cadn);
System.out.println("cadx = " + cadx);
}
} // fin de ConvierteValorPrimitivo
/*
La salida es:
b = true
c=
n = 123
x = 3.141592653589793
cadb = true
cadc =
cadn = 123
cadx = 3.141592653589793
*/

Ejemplo 7.
Haga el programa en Java tal, que dada una cadena que contenga la fecha Jun 22, 2002, extraiga
el da y el ao y los convierta en enteros, y calcule la fecha de la semana siguiente.
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 7 convierte cadenas a tipos de datos primitivos
public class PrimitivoaCadena
{ public static void main(String[] argumentos)
{ String hoy= "Jun 22, 2002";
String cadenaDiaHoy = hoy.substring(4, 6);
int cadenaDiaInt = Integer.parseInt(cadenaDiaHoy);
int sigDiaSemanaInt = cadenaDiaInt + 7;
String sigFechaSemana = hoy.substring(0, 4) + sigDiaSemanaInt + hoy.substring(6);
System.out.println("La fecha de hoy es " + hoy);
System.out.println("El dia de hoy es " + cadenaDiaInt);
System.out.println("El siguiente dia de la semana es " + sigDiaSemanaInt);
System.out.println("La siguiente fecha de la semana es " + sigFechaSemana);
}

140

} // fin de PrimitivoaCadena
/*
La salida del programa es:
La fecha de hoy es Jun 22, 2002
El dia de hoy es 22
El siguiente dia de la semana es 29
La siguiente fecha de la semana es Jun 29, 2002
*/

6.6 La clase StringBuffer y sus mtodos


Una cadena o string puede tambin manejarse con la clase StringBuffer. Estos objetos a
diferencia de los de la clase String , si pueden cambiarse, esto es, una cadena de la clase
StringBuffer es suceptible a ser modificada , esto es, es mutable. En los siguientes programas el
participante manejar las cadenas con algunos de los mtodos de la clase StringBuffer.
7. Manejo de excepciones
Las excepciones son situaciones excepcionales que producen errores en los programas en
tiempo de ejecucin. Una condicin excepcional es un problema que evita la continuacin
de un mtodo o mbito, esto es, se sale del contexto actual para relegar ese problema un
un contexto mayor, como en una lnea de comando de ordenes. Esto es lo que sucede
cuando usted lanza una excepcin:
Cuando se lanza una excepcin ocurren varias cosas:

Primero: un objeto es creado o instanciado con new como cualquier otro objeto.

Segundo: la ruta actual de ejecucin es interrumpida y la referencia de el objeto de


excepcin es abortada del contexto actual.

Tercero: un mecanismo de manejo de excepcin se hace cargo y comienza a


buscar un lugar apropiado para continuar ejecutando el programa. Este lugar apropiado es
el manejador de excepcin cuyo trabajo es manejar el error para que el programa pueda
continuar.

7.1 Modelo del manejo de excepciones


Cuando un programa en Java arroja una excepcin, se instancia un objeto del tipo de excepcin de
acuerdo a el siguiente modelo de jerarqua de clases. Todas las excepciones son objetos que se
derivan de la clase principal Throwable, de ah las subclases Error ( son para excepciones
especiales del compilador e interprete de Java en las cuales el programador no tiene mucho que
hacer ). Las que nos interesan son las excepciones que estn debajo de la clase Exception, y en
este tipo de subclases que el programador puede manejar, veamos la siguiente figura que es una
sntesis de la jerarqua de excepciones:
Jerarqua de clases parcial para las excepciones

141

7.2 Lanzando excepciones try / catch


Cuando queremos que nuestro programa pueda capturar una excepcin utilizamos:
Utilizamos el bloque try - catch
try {
// cdigo que puede generar excepciones o
// regin salvaguardada donde se puede producir una excepcin

}
Manejadores de Excepcin

En nuestro cdigo cuando dentro del bloque try se lanza una excepcin , hay que capturarla con
catch y manejarla segn su tipo con el manejador de excepcin adecuado, ya que podemos poner
varios catch para los diferentes tipos de errores que sucedan:
try {
// Codigo que puede genera excepciones
} catch(Tipo1 id1) {
// Manejo de excepciones del Tipo1
} catch(Tipo2 id2) {
// Manejo de excepciones del Tipo2
} catch(Tipo3 id3) {
// Manejo de excepciones del Tipo3
}
// etc...
7.2.1 Ejemplos de try / catch
Primeramente veamos que sucede cuando no hay un bloque try - catch para proteger nuestro
cdigo y capturar una posible excepcin, el ejemplo de divisin por cero es intencional para
Siquieres obtener el cdigo clic con el botn derecho aqu EjemploExcepcin.java
1.
2.
3.
4.

/**
* Programa de Java que te ensea que pasa cuando
* no manejas una excepcin.
* @autor Oscar A. Gonzlez Bustamante

142

5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

16.

* @version 1.0
* Archivo: EjemploExcepcion.java
*/
class EjemploExcepcion
{
public static void main(String args[])
{
int divisor = 0;
int cociente = 1234/divisor;
}
}

La salida de ste programa al ejecutarlo con el comando java EjemploExcepcion es:


java.lang.ArithmeticException: / by zero
at EjemploExcepcion.main(EjemploExcepcion.java:14)
Exception in thread "main" Finished executing
Como vemos el proceso que maneja las excepciones en Java y que es un thread que corre en paralelo
junto con el intrprete de Java detecta el error en la lnea 14 y reporta el error como una excepcin,
adems imprime el mensaje "/ by zero" para indicarnos el problema luego el programa termina
abruptamente ya que no puede continuar porque no puede manejar esa divisin por cero.
Ahora veamos que pasa si decidimos poner el cdigo que produce la divisin por cero dentro de un
mtodo:
Siquieres obtener el cdigo clic con el botn derecho aqu EjemploExcepcin2.java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.

/**
* Programa de Java que te ensea que pasa cuando
* no manejas una excepcin dentro de un mtodo.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: EjemploExcepcion2.java
*/
class EjemploExcepcion2
{
static void excepcional()
{
int divisor = 0;
int cociente = 1234/divisor;
}
public static void main(String args[])
{
EjemploExcepcion2.excepcional();
}
}

La salida de ste programa al ejecutarlo con el comando java EjemploExcepcion2 es:


java.lang.ArithmeticException: / by zero
at EjemploExcepcion2.excepcional(EjemploExcepcion2.java:13)
at EjemploExcepcion2.main(EjemploExcepcion2.java:17)
Exception in thread "main" Finished executing
Como podemos observar el programa manejador de excepciones de Java reporte el origen de los
errores simulando una pila de llamadas, como lo hara un depurador, as el error se origina en la lnea

143

excepcional().
Ahora vamos a tratar la excepcin para que el programa sepa que hacer cuando se arroje el error de
divisin por cero. El siguiente ejemplo de programa muestra como podemos usar el try - catch para
ello:
Siquieres obtener el cdigo clic con el botn derecho aqu EjemploExcepcinCapturada.java
/**
* Programa de Java que te ensea que pasa cuando
* manejas una excepcin con el try - catch.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: EjemploExcepcionCapturada.java
*/
class EjemploExcepcionCapturada
{
public static void main(String args[])
{
try
{
int divisor = 0;
int cociente = 1234/divisor;
}
catch (ArithmeticException excepcion)
{
System.out.println("Excepcion de division por cero.");
System.out.println("El mensaje del tipo de error es:"
+ excepcion.getMessage() );
System.out.println("La descripcin de este error es:"
+ excepcion.toString() );
}
}
}
La salida de ste programa al ejecutarlo con el comando java EjemploExcepcionCapturada es:
Excepcion de division por cero.
El mensaje del tipo de error es:/ by zero
La descripcin de este error es:java.lang.ArithmeticException: / by zero
Finished executing
Vemos el efecto de utilizar el mtodo getMessage() de la clase Throwable que es la de obtener
una cadena del tipo de error "/ by zero" y la descripcin de este error lo obtenemos con el mtodo
toString() de la clase Object el cual nos da "java.lang.ArithmeticException: / by zero" que es una
informacin til para saber de que tipo de error o excepcin estamos tratando.
7.3 La clusula finally
Esta clusula se utiliza cuando tengamos que hacer determinada accin necesariamente, para
asegurarnos que se va a realizar conviene crear una excepcin, pero es conveniente usar una clusula
dentro de la sentencia try que esta diseada con ese propsito, es la clusula finally.
try {
//aqui va cdigo que puede lanzar una excepcin
}

144

catch (Tipo1 e)
{
// aqu va el cdigo para tratar la excepcin del Tipo 1
}
finally
{
// Aqu en el bloque finally es donde se ejecutan
// las sentencias que se quieran siempre ejecutar
// haya o no excepcin
}

7.3.1 Ejemplos de finally


El siguiente ejemplo es muy ilustrativo, vamos a producir una excepcin de manera intencional dentro
del bloque try al tratar de dividir un nmero por cero, y luego en otra ejecucin del programa vamos
a probarlo con la divisin por un nmero diferente de cero, para ver que pasa con el bloque
finally, el siguiente cdigo del programa nos muestra esto:
Siquieres obtener el cdigo clic con el botn derecho aqu EjemploFinally.java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.

37.

/**
* Programa de Java que te ensea que pasa cuando
* no manejas una excepcin con try - catch e incluyes
* la clusula finally ( que siempre se ejecutar, haya
* o no error o excepcin )
* @version 1.0
* Archivo: EjemploFinally.java
*/
public class EjemploFinally
{
public static void main(String args[])
{
try
{ //probar con divisor <> 0 finally se ejecutara de todos modos
int divisor = 0; // cambiar divisor = 10 para ver que sucede.
int dividendo = 1234;
int cociente = dividendo/divisor;
System.out.println(" divisor = " + divisor +
"\n dividendo = " + dividendo +
"\n cociente = " + cociente );
}
catch (ArithmeticException excepcion)
{
System.out.println(" Excepcion de division por cero:"
+ excepcion.getMessage() );
}
finally
{
System.out.println(" Aqu en el bloque finally se ejecutan " +
"las sentencias haya o no excepcin");
}
System.out.println(" Este puede ser un bloque de instrucciones");
System.out.println(" que puede continuar despues del finally");
}
} // fin de la clase EjemploFinally

145

La salida del programa cuando asignamos divisor = 0


EjemploFinally es:

al ejecutar el comando java

Excepcion de division por cero:/ by zero


Aqu en el bloque finally se ejecutan las sentencias haya o no excepcin
Este puede ser un bloque de instrucciones
que puede continuar despues del finally
La salida del programa cuando asignamos divisor = 10
EjemploFinally es:

al ejecutar el comando java

divisor = 10
dividendo = 1234
cociente = 123
Aqu en el bloque finally se ejecutan las sentencias haya o no excepcin
Este puede ser un bloque de instrucciones
que puede continuar despues del finally
Observe el lector que lo que esta dentro del bloque try se ejecutar si no hay excepcin y si la hay se
ejecutar lo que este dentro del bloque catch, pero en ambos casos siempre se ejecutarn las
sentencias que se encuentren dentro del bloque finally.

7.4 Mtodos que lanzan excepciones


Como habamos visto una excepcin puede ser manejada usando el bloque de sentencias try-catchfinally.
En esta seccin veremos como es posible en Java lanzar excepciones de manera explcita usando la
clusula throw y tambin como un mtodo puede declarar que puede lanzar una o mas
excepciones con throws.
7.4.1 Como arrojar excepciones explcitamente
Cuando queremos que nuestro cdigo lance excepciones de manera explcita podemos usar la
clusula throw para instanciar o crear un objeto de la excepcin que necesitemos . En el siguiente
cdigo de ejemplo en la lnea 14 lanzamos una excepcin del tipo ArithmeticException la cual la
creamos sin ningn motivo, para que nos demos cuenta de la instancia no se crear y el mtodo
getMessage() nos devolver null como respuesta.
Siquieres descargar el cdigo de todos estos programas, dale clic con el botnderecho aqu
ExcepcionesExplicitas.zip
1.
2.
3.
4.
5.
6.
7.
8.
9.

/**
* Programa que muestra el uso de throw para
* lanzar excepciones de manera explcita
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: Upcasting.java
*/
class EjemploExcepcionExplicita
{

146

10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.

public static void main(String args[])


{
try
{
throw new ArithmeticException();
}
catch (ArithmeticException e )
{
// codigo que maneja la excepcion
System.out.println(e.getMessage());
System.out.println("La excepcion es manejada");
}
}
} // fin de EjemploExcepcionExplicita

Al ejecutar el comando java EjemploExcepcionExplicita da el siguiente resultado:


null
La excepcion es manejada
Qu pasara si ahora la excepcin o el error fuera cierto ? , esto implica , que realmente se suscitara
un error de tipo AritmeticException en tiempo de ejecucin como el que se muestra en la lnea 14
del siguiente cdigo.
Lo que pasara es que lanzaramos explcitamente la excepcin en la lnea 16 y el bloque catch la
capturara y le dara su tratamiento, pero si no es as, entonces el resultado del if en la lnea 15 sera
false y escribira por pantalla el resultado del cociente. Veamos el cdigo a continuacin.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.

/**
* Programa que muestra el uso de throw para
* lanzar excepciones de manera explcita
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: EjExcepcionExplicita2.java
*/
class EjExcepcionExplicita2
{
public static void main(String args[]) {
int divisor = (int) ( Math.random() * 5 ); // da 0 o 1 o 2 o 3 o 4 o 5
try
{
int cociente = 1234/divisor;
if ( divisor == 0 )
throw new ArithmeticException();
else
System.out.println("cociente= " + cociente );
}
catch (ArithmeticException e )
{
// codigo que maneja la excepcion
System.out.println(e.getMessage());
System.out.println("Excepcion de division por cero.");
System.out.println("La excepcion es manejada");
}

147

27.
28.
29.
30.
31.
32.

finally {
System.out.println("divisor= " + divisor );
}
System.out.println("Fin del programa.");
}
} // fin de la clase EjExcepcionExplicita2

Una posible salida al correr este programa con un divisor igual a cero con el comando java
EjExcepcionExplicita2 es el siguiente
/ by zero
Excepcion de division por cero.
La excepcion es manejada
divisor= 0
Fin del programa.
Si el divisor da un valor diferente de cero, p.ej. que divisor sea cuatro, da la siguiente salida:
cociente= 308
divisor= 4
Fin del programa.
7.4.2 Ejemplos de mtodos que lanzan excepciones
Un mtodo puede declarar que puede lanzar una o mas excepciones con throws. Por ejemplo en el
siguiente fragmento de cdigo el mtodo readDatabaseFile() puede lanzar dos tipos de
excepciones:
1.
2.
3.
4.
5.
6.

public void readDatabaseFile( String file )


throws FileNotFoundException, UTFDataFormatException {
// abrir el flujo de archivo, puede causar un FileNotFoundException
FileInputStream fis = new FileInputStream ( file );
// leer un string desde el fis puede causar un UTFDataFormatException..
}

Para tener un cdigo robusto , el lenguaje Java requiere que si una excepcin ocurre mientras un
mtodo esta en el stack ( esto es, si este ha sido invocado ), el invocador de este mtodo debe
determinar que accin debe tomarse si surgen problemas.
Esto ltimo puede hacerse si se satisfacen estos requerimientos:

Tener en el mtodo invocador el manejo de la excepcin incluyendo para esto en su cdigo


un bloque try - catch , donde los nombres de clases del catch son de cualquier clase o superclase
de la excepcin lanzada. Esto implica el manejo de la situacin, aunque el bloque catch este vaco.

No tener en el mtodo invocador nada que maneje la excepcin, y la excepcin ser lanzada
hacia atrs, hacia su mtodo llamador.
Cabe sealar que un mtodo no esta obligado a manejar o declarar errores o excepciones en tiempo
de ejecucin.
Un mtodo puede declarar una excepcin que en un momento dado puede lanzar su cdigo dentro
de su cuerpo con la clusula throws como sigue:
public static void main(String args[] ) throws IOException
Seguido de la palabra llave throws hay una lista de todas las excepciones que el mtodo puede
arrojar hacia atrs a su invocador. Aunque en el mtodo main() mostrado como ejemplo solo hay

148

una sola excepcin, se puede usar la coma como separador de la lista de todas las excepciones que
pueda lanzar.
7.5 Creacin de clases de excepcin personalizadas
Es posible crear excepciones definidas por el usuario por medio de la herencia extendiendo de la clase
Exception. La clase Exception posee todo lo que una clase comn y corriente tiene. El siguiente
ejemplo es una clase de manejo de excepciones definida por el usuario, conteniendo tres
constructores, aunque tambin puedes poner , algunas variables, y mtodos.
Siquieres descargar el cdigo de este programa, dale clic con el botn derechoaqu
ExcepcionesConstruidas.zip
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.

/**
* Programa que te ensea a crear tus propias
* clases para manejar excepciones, o excepciones
* personalizadas o de usuario. Ademas te
* te ejemplifica el uso de el lanzamiento de
* excepciones con costructores diferentes y
* utilizando throw ( en singular )
* y throws ( en plural ).
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ExcepcionesConstruidas
*/
class MiExcepcion extends Exception {
public MiExcepcion() {}
public MiExcepcion(String msg) {
super(" \"" + msg + "\"" );
}
public MiExcepcion( String msg, int noError ) {
super(" Error garrafal No: " + noError +
" \"" + msg + "\"" );
}
} // fin de MiExcepcion
public class ExcepcionesConstruidas {
public static void f() throws MiExcepcion {
System.out.println( " Lanzando MiExcepcion de f() ");
throw new MiExcepcion(); // invocando al contructor por default
}
public static void g() throws MiExcepcion {
System.out.println("Lanzando MiExcepcion de g()");
throw new MiExcepcion(" Originada en g() ");
}
public static void h() throws MiExcepcion {
System.out.println("Lanzando MiExcepcion de h()");
throw new MiExcepcion(" Originada en h() " , 123 );
}
public static void main(String[] args) {
try {
f();
} catch(MiExcepcion e) {
System.out.println("Capturando excepcin de tipo " + e.toString() +
" "+
"Mensaje: " + e.getMessage() );
}
try {
g();
} catch(MiExcepcion e) {
System.out.println("Capturando excepcin de tipo " + e.toString() +

149

49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.

60.

" "+
"Mensaje: " + e.getMessage() );
}
try {
h();
} catch(MiExcepcion e) {
System.out.println("Capturando excepcin de Tipo: " + e.toString() +
" "+
"Mensaje: " + e.getMessage() );
}
} // fin del main()
} //fin de ExcepcionesConstruidas

En el anterior cdigo fuente de la lnea 13 a la 22 tenemos la clase personalizada para manejo de


excepciones MiExcepcin que es una extensin de Excepction y tiene tres constructores. Luego
para que un mtodo pueda utilizar esa clase de excepciones solo se escribe en la definicin del
mtodo throws MiExcepcion, as por ejemplo el mtodo g() en la lnea 29 tiene declarado public
static void g() throws MiExcepcion .
Ahora para lanzar una excepcin de manera explicita usamos la palabra reservada throw ( en
singular ) seguido del operador new y el nombre del constructor, as por ejemplo en la lnea 35
usamos throw new MiExcepcion(" Originada en h() " , 123 ) para invocar al constructor con
dos argumentos , uno de la clase String y el otro de tipo int.
Podemos proteger nuestro cdigo de una excepcin del tipo que acabamos de crear dentro de un
bloque try - catch, as por ejemplo, de la lnea 52 a la 58 estamos invocando al mtodo h() el cual
nos puede lanzar una excepcin del tipo MiExcepcion que es el nombre de la clase que creamos
para manejar nuestras excepciones.
La salida del programa al ejecutarlo con el comando java ExcepcionesConstruidas es el siguiente:
Lanzando MiExcepcion de f()
Capturando excepcin de tipo MiExcepcion Mensaje: null
Lanzando MiExcepcion de g()
Capturando excepcin de tipo MiExcepcion: " Originada en g() " Mensaje: " Originada en g() "
Lanzando MiExcepcion de h()
Capturando excepcin de Tipo: MiExcepcion: Error garrafal No: 123 " Originada en h() " Mensaje:
Error garrafal No: 123 " Originada en h() "
7.6 Lectura de un volcado de Stack
Cuando necesitamos informacin de donde inicio un error y hasta donde finaliza, tenemos la
necesidad de leer el volcado de pila o stack del programa que maneja las excepciones en Java, y para
esto utilizamos el mtodo printStackTrace(). Este mtodo forma parte de la clase Throwable la
cual es superclase de Exception. En el siguiente ejemplo veremos el uso del mtodo
printStackTrace() y de un volcado de pila.
Siquieres descargar el cdigo de este programa, dale clic con el botn derechoaqu
VolcadodePila.zip
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

/**
* Programa que te ensea a imprimir
* el volcado de pila o stack de un programa
* que tenga errores y as tener la traza de
* donde se origino el problema. Se utiliza
* el mtodo printStackTrace() de la clase
* Throwable.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: VolcadodePila.java

150

11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.

46.

*/
class VolcadodePila
{ public static void metodo1() throws ErrorGarrafal
{
metodo2();
}
public static void metodo2() throws ErrorGarrafal
{
metodo3();
}
public static void metodo3() throws ErrorGarrafal
{
throw new ErrorGarrafal(); // lanzo un ErrorGarrafal
}
public static void main(String args[])
{
try
{
metodo1();
}
catch ( ErrorGarrafal eg ) // capturo un ErrorGarrafal
{System.out.println("Excepcion: ( " + eg.getMessage() + " ) ");
System.out.println("La pila de llamada es:");
eg.printStackTrace();
}
}
} // fin de la clase VolcadodePila
class ErrorGarrafal extends Exception
{
ErrorGarrafal()
{
super("Esto es un error garrafal");
}
} // fin de la clase ErrorGarrafal

Podemos observar en la lnea 34 la invocacin del mtodo printStackTrace() el cual nos va a


imprimir el volcado de pila. Un volcado de pila es el registro en orden inverso en que se fueron
registrando los eventos de error por parte del administrador de excepciones de Java. Se utiliza una
pila o stack, donde el primero en entrar es el ltimo en salir, as que el volcado de pila empieza por el
ltimo en entrar, en este caso el metodo3() y termina en el primer mtodo main() . En la
siguiente figura, se exponen esquemticamente estos conceptos.

151

La salida del programa al ejecutarlo con el comando java VolcadodePila es el siguiente:


Excepcion: ( Esto es un error garrafal )
La pila de llamada es:
ErrorGarrafal: Esto es un error garrafal
at VolcadodePila.metodo3(VolcadodePila.java:23)
at VolcadodePila.metodo2(VolcadodePila.java:19)
at VolcadodePila.metodo1(VolcadodePila.java:15)
at VolcadodePila.main(VolcadodePila.java:29)
8. Flujos

El modelo ms sencillo de un algoritmo consiste en tres conexiones: datos


de entrada, procesamiento y datos de salida. Entrada y salida ( E / S ) es
un aspecto fundamental en la computacin. La computadora no sera muy
til si no pudiera recibir datos del mundo exterior y presentar los datos
computados.
En esta seccin se describe como Java , a travs de java.io y java.nio, y
otros paquetes relacionados , proporciona clases independientes para
manipular archivos y flujos ( streams ).

8.1 Qu es un Flujo?
Un flujo es un sistema de comunicacin implementado en el paquete java.io cuyo fin es guardar y
recuperar la informacin en cada uno de los diversos dispositivos de almacenamiento.
Podemos imaginar un flujo como un tubo donde podemos leer o escribir bytes. No nos importa lo
que pueda haber en el otro extremo del tubo: Puede ser un teclado, un monitor, un archivo, un
proceso, una conexin TCP/IP o un objeto de Java.
Todos los flujos que aparecen en Java englobados en el paquete java.io, pertenecen a dos clases
abstractas comunes: java.io.InputStream para los flujos de Entrada (aquellos de los que podemos
leer) y java.io.OutputStream para os flujos de salida (aquellos en los que podemos escribir).
Estos flujos, pueden tener orgenes diversos (un archivo, un socket TCP, etc.), pero una vez que
tenemos una referencia a ellos, podemos trabajar siempre de la misma forma: leyendo datos
mediante los mtodos de la familia read() o escribiendo datos con los mtodos write().
Hay flujos de:

Flujos de bytes
Flujos de caracteres

Hay flujos de entrada y salida:

Un flujo de entrada enva datos de una fuente a un programa


Un flujo de salida enva datos de un un programa hacia un destino

8.2 Los flujos estndar

152

Java al igual que cualquier otro lenguaje de programacin tiene su conjunto mtodos que le permiten
captar la informacin de flujos de entrada y enviar flujos de salida por dispositivos estndar.
Los flujos estndar son:

Flujo de datos de entrada:

Se realiza mediante la clase System.in y suele recibir los datos del teclado

Utiliza el mtodo read() para conseguir leer los caracteres del teclado

Flujo de datos de salida:

Se realiza mediante la clase System.out y suele enviar los datos por pantalla

Utiliza el mtodo print() y println() para la salida por pantalla

Flujo de datos de error

Se realiza mediante la clase System.err

o
al usuario

Nos aseguramos que la salida va redirigida al monitor para enviar mensajes de error

El flujo de entrada ms utilizado esta asociado a el teclado, veamos el siguiente ejemplo que es
bastante ilustrativo.
Si quieres obtener elcdigo dale clic aqu HolaOscar.zip
/**
* Ejemplo: programa de flujos (streams)
* que lee tu nombre de la lnea de comandos
* y te lo muestra por la consola de salida.
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: HolaOscar.java
*/
import java.io.*;
public class HolaOscar {
public static void main(String[] args) throws IOException
{
InputStreamReader lector = new InputStreamReader(System.in);
BufferedReader entrada = new BufferedReader(lector);
System.out.print("Cual es tu nombre? ");
String nombre = entrada.readLine();
System.out.println("Hola " + nombre + "!");
}
}// fin de la clase HolaOscar

La salida del programa al ejecutarlo con el comando java HolaOscar es:

Da tu nombre: Oscarin
Hola, Oscarin!

153

En la siguiente figura vemos el proceso de tomar los datos del flujo estndar de entrada System.in
asociado al teclado con la creacin del objeto lector de la clase InputStreamReader. Luego
con el objeto lector lo utilizamos como argumento del constructor de un objeto entrada de la
clase BufferReader, el cual tiene mtodos como readLine(), para leer el conjunto de bytes del
buffer hasta el final de la lnea. Finalmente utilizamos el mtodo println() de System.out que esta
asociado al flujo estndar de salida para presentar los datos por la consola o monitor.

8.2.1 Algunos ejemplos de flujo estndar


En los ejemplos siguientes, usamos el flujo estndar de entrada System.in asociado al teclado.
Todo lo que se lea de algn flujo de entrada esta dado en bytes , los cuales son transformados a
cadenas de caracteres. Entonces como hacemos la lectura de algn nmero real o entero por
teclado?. Afortunadamente existen mtodos de conversin de cadenas en las clases envoltorio (
wrappers ) como doubleValue() que convierte una cadena en formato de nmero real a una
variable primitiva de tipo double. As es como podemos entonces manejar los flujos de datos de
bytes o caracteres a formatos binarios especficos. Tambin observe que el mtodo main() se esta
manejando la excepcin IOException , para preveer algn tipo de error en el flujo de entrada o
salida. ver el ejemplo:

154

/**
* Ejemplo: programa de flujos (streams)
* que lee el valor del radio desde el teclado y calcula
* el rea del circulo. La cadena del nmero see lee
* con un flujo de entrada que luego es convertido a
* formato de nmero de tipo double con doubleValue()
* de la clase wrapper Double . El programa calcula el
* rea del circulo en base al radio dado y presenta el
* resultado por pantalla.
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: AreaCirculo.java
*/
import java.io.*;
public class AreaCirculo{
public static void main(String[] args) throws IOException
{
InputStreamReader lector = new InputStreamReader(System.in);
BufferedReader entrada = new BufferedReader(lector);
System.out.print("Introduce valor del radio: ");
String texto = entrada.readLine();
Double x = new Double(texto);
double r = x.doubleValue();
System.out.println("El area de un circulo de radio "+ r );
double area = r*r*Math.PI;
System.out.println(" es " + area);
}
}// fin de la clase AreaCirculo

Para correr el programa hay que ejecutar la sentencia java AreaCirculo y presenta los siguientes
resultados si se le da como radio el valor de 10.
Introduce valor del radio: 10
El area de un circulo de radio 10.0
es 314.1592653589793
8.3 Los flujos que ofrece java.io
Java ofrece dos clases abstractas para manejar los flujos de datos procedentes de equipos remotos o
archivos y son java.io.OutputStream y java.io.InputStream, a continuacin presentamos la
jerarqua de estas clases clases .
Object
o

InputStream

FileInputStream

FilterInputStream

PushbackInputStream

BufferedInputStream

LineNumberInputStream

StringBufferInputStream

ByteArrayInputStream

155

SequenceInputStream

PipedInputStream

OutputStream

ByteArrayOutputStream

PipedOutputStream

FileOutputStream

FilterOutputStream

PrintStream

BufferedOutputStream

DataOutputStream

Algunas de estas clases van a aparecer junto con algunos de sus mtodos, en los ejemplos que
veremos mas adelante.

8.4 Flujos de bytes


Para los ejemplos siguientes, supondremos que los objetos de tipo InputStream y OutputStream
nos vienen dados, sin preocuparnos de como han sido creados (de hecho, las clases mencionadas ya
habamos dicho que son clases abstractas que y no pueden ser instanciadas , as que son la base de
otras clases concretas de donde si podemos instanciar objetos ).
public abstract class InputStream extends Object
Lectura de bytes individuales: Se logra mediante cdigo como:
InputStream is= ...;
int b = is.read();
As podemos obtener el siguiente byte del InputStream. Hay que darse cuenta que el byte (8 bits) se
devuelve como un dato de tipo int (32 bits), con un valor entre 0 y 255. En caso de que se haya
alcanzado el final del archivo, el mtodo read() devuelve un valor de -1.
Lectura de varios bytes. Primero se crea un arreglo unidimensional del tamao adecuado. El
tamao de este arreglo es lo que indica al mtodo read() cuntos bytes debe leer como mximo. El
siguiente ejemplo de fragmento de cdigo lee 1024 bytes de un flujo de entrada.
byte[] = miArreglo = new byte[1024]; // declaramos el arreglo.
InputStream is = ...;
int lee = is.read(miArreglo);
La variable lee almacena el nmero de bytes que se han ledo en realidad. Si se llega al final del
archivo, devuelve el valor de -1. No hay garanta de leer exactamente el nmero de bytes
especificado, porque puede ser menor debido a que estamos leyendo de un archivo que se ha
acabado, porque los datos de una conexin de red tardan en llegar, o cualquier otra causa. De
cualquier forma, cuando el mtodo read() devuelva un valor distinto de -1 podemos seguir leyendo
mediante sucesivas llamadas a read().

156

Veamos el siguiente ejemplo que muestra el uso del mtodo read() para leer bloques de bytes.
Si quieres obtener elcdigo dale clic aqu EscribeNombres.zip
/**
* Ejemplo: programa de flujos (streams)
* que lee el flujos de bytes. Las cadenas a leer se
* almacenan en los arreglos de bytes buffer1 y buffer2.
* Ambos tiene un tamao especfico de 20 bytes y
* son ledos con el mtodo read(). Luego instanciamos
* dos objetos de la clase String con dichos buffers.
* Finalmente los enviamos por System.out.println() a
* la pantalla o consola de salida, y usamos el mtodo
* trim() para eliminar los espacios blancos o vacos.
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: EscribeNombres.java
*/
public class EscribeNombres
{ public static void main(String[] args)
{ final int LON = 20 ;
byte[] buffer1 = new byte[LON];
System.out.print("Introduce tu apellido: ");
try { System.in.read(buffer1, 0, LON) ; }
catch (Exception e) {}
String apellido = new String(buffer1) ;
byte[] buffer2 = new byte[LON];
System.out.print("Introduce tu nombre: ");
try { System.in.read(buffer2, 0, LON) ; }
catch (Exception e) {}
String nombre = new String(buffer2) ;
System.out.println("Hola , " + nombre.trim() + " "
+ apellido.trim());
}
} // fin de la clase EscribeNombres
La salida del programa al ejecutarlo con el comando java EscribeNombres es:
Introduce tu apellido: GONZALEZ
Introduce tu nombre: OSCAR
Hola , OSCAR GONZALEZ
Cerrar el flujo de entrada. Cuando ya no necesitamos leer datos de un flujo de entrada, se tienen
que liberar los recursos reservados mediante el mtodo close(). Si no cerramos el InputStream
explcitamente, el flujo asociado se cierra cuando se destruye el objeto.
Escritura de bytes individuales. La clase OutputStream dispone de varios mtodos write().
Ejemplo:
OutputStream os = ..;
int dato = 777;
os.write(dato);
Como en el caso del mtodo read() de la clase InputStream, el mtodo write() recibe un byte

157

dentro de una variable de tipo int (32 bits).


Escritura de varios bytes. El cdigo siguiente es muy ilustrativo.
byte[] vector = { 65, 66, 67, 68, 69};
OutputStream os = ...;
os.write(vector); // escribe los bytes 65, 66,67,68,69
os.write(vector,1,3); // escribe los bytes 66,67,68
8.5 Gestin de excepciones de entrada / salida
Todos los mtodos read(), write(), avaible(), etc. lanzan excepciones de tipo
java.io.IOException. Estas excepciones es obligatorio capturarlas, o aparecern errores en tiempo
de compilacin.
En general, las partes de los programas que trabajen con los flujos deben estar dentro de una
clusula try ... catch Ejemplo:
try {
InputStream is= ..;
while ( ... ) {
// Leemos y procesamos datos involucrados con los flujos
}
}catch(IOException ioe) {
System.err.println("Hubo un error al abrir el flujo tal y tal ... ");
ioe.printStackTrace();
}
En programas pequeos en los que no se quiera complicarse la existencia con estructuras de ste
tipo, se puede tomar el camino alternativo de mandar la excepcin "hacia arriba". Por ejemplo:
public static void main(String[] args) throws IOException {
// programa creado por un programador flojo
}
El siguiente programa calcula el rea de un tringulo, y hace uso del manejo de excepciones para los
flujos de entrada de tipo java.io.IOException en el mtodo lee_doble(). Si al compilar el
programa le manda un warning de que el mtodo readLine() esta desaprobado ( deprecated ), no se
preocupe mucho por eso, el programa correr, es solo una advertencia del compilador de Java que le
invita a ud. a utilizar algn otro mtodo ms actualizado para dicho fin.
Si quieres obtener elcdigo dale clic aqu AreaTriangulo.zip
/**
* Ejemplo: programa de flujos (streams)
* que lee el un flujo de datos por el teclado
* y lo convierte a un valor de tipo double.
* El programa utiliza manejo de excepciones
* de tipo java.io.IOException.
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: AreaTriangulo.java
*/
import java.io.DataInputStream;
class AreaTriangulo{
static double lee_doble(String msj) {

158

DataInputStream stream = new DataInputStream(System.in);


String
strng;
double aux;
// escriba una linea para leer desde el teclado.
try {
System.out.print(msj);
strng = stream.readLine();
} catch ( java.io.IOException e ) { strng = "0.0"; }
// tratando de convertir este valor a un valor de tipo double
try {
aux = Double.valueOf(strng).doubleValue();
} catch ( java.lang.NumberFormatException e) { aux = 0.0; }
return aux;
}

public static void main (String args[] ) {


double
a,b,c;
double
s,p;
System.out.println("Calcular Area de un triangulo");
a = lee_doble("Dame lado a: ");
b = lee_doble("Dame lado b: ");
c = lee_doble("Dame lado c: ");
System.out.println("a= "+ a + " b = " + b + " c= " + c);
p = ( a + b + c ) / 2.0;
System.out.println("p= " + p);
s = Math.sqrt( p*(p-a) * (p-b) * (p-c) );
System.out.println("Area = " + s );
System.out.println("fin del programa");
}
} // fin de la clase AreaTriangulo
La salida del programa al ejecutarlo con el comando java AreaTriangulo es:
Calcular Area de un triangulo
Dame lado a: 30
Dame lado b: 40
Dame lado c: 50
a= 30.0 b = 40.0 c= 50.0
p= 60.0
Area = 600.0
fin del programa
8.6 Flujos de acceso a archivos

159

Ya sea para leer o para escribir en un archivo, estos se manipulan con flujos de acceso a archivos. En
Java tenemos la clase FileInputStream , con los mtodos necesarios para abrir e interactuar con
un canal de comunicacin hacia un archivo de entrada para nuestra aplicacin, y la clase
FileOutputStream para el caso de un archivo de salida.
La clases FileInputStream y FileOutputStream reciben en uno de sus constructores como
parmetro el nombre del archivo a leer o escribir. Hay otras dos variantes: una que recibe un
objeto de tipo File y otra que recibe un objeto de tipo FileDescriptor. En la seccin siguiente veremos
la primera variante y como se utiliza la clase File para dicho fin.
8.7.1 Ejemplos de la clase File
En este primer ejemplo de la clase File muestra el uso de algunos de sus mtodos para manejo de
archivos:
Si quieres obtener elcdigo dale clic aqu FlujoArchivos2.zip
/**
* Programa de java que ejemplifica el uso
* de la clase File, demostrando el acceso a
* archivos y carpetas
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: FlujoArchivos2.java
*/
import java.io.*;
import java.util.Date;
public class FlujoArchivos2
{
static String ruta = "C:\\j2sdk141\\ejemplos\\";
static String[] archivos = { new String("Aeropuerto.java"),
new String("IncrementoDecremento.java") };
static String archi = archivos[1];
static void prhr(char c, int lim) { for(int i=0; i<lim ; i++) System.out.print(c); }
public static void main(String[] argumentos)
{
int parcial,total=0,tamao=0;
char car;
boolean lectura, escritura;
String nombre, directorio;
long modificado;
try
{
File f = new File(ruta+archi);
prhr('-',80);prhr('\n',1);
if (f.exists() )
{
// mas datos sobre el archivo
System.out.println("\tArchivo : "+archi+ " encontrado con xito en: "+ ruta);
System.out.println("\tTamao del archivo(compararlo al final): " + f.length() + " Bytes");
lectura = f.canRead(); // se puede leer el archivo ?
escritura = f.canWrite(); // se puede escribir el archivo?
nombre = f.getName(); /* Nombre (sin directorio) del archivo */
directorio = f.getParent(); /* Directorio del archivo */
modificado = f.lastModified(); /* Fecha de ltima modificacin */
Date d = new Date(modificado);
if (lectura && escritura )
System.out.println("\tEs una archivo de lectura y escritura\n");
else if( lectura && !escritura)

160

System.out.println("\tEs un archivo de solo lectura\n");


else if( !lectura && !escritura)
System.out.println("\tEs un archivo que no se puede leer ni escribir\n");
else if( escritura )
System.out.println("\tEs un archivo de escritura\n");
System.out.println("Nombre del archivo: " + nombre);
System.out.println("Nombre del directorio o carpeta del archivo : " + directorio);
System.out.println("Fecha de ltima modificacin : "+ d);
}
else
System.out.println(" El archivo: " + archi + " no existe en : " + ruta);
prhr('-',80);prhr('\n',1);
FileInputStream fis = new FileInputStream(f);
while(( parcial=fis.read())!=-1)
{
total+= parcial;
tamao++;
car = (char)parcial;
System.out.print(car);
}
System.out.print("\n");
fis.close();
}
catch (FileNotFoundException fnfe)
{
/* Archivo no encontrado */
System.err.println("Archivo no encontrado, Error: " + fnfe.getMessage());
}
catch (IOException ioe)
{
/* Error al leer */
System.err.println("Error al leer el archivo, Error: " + ioe.getMessage());
}
finally
{
prhr('-',60);prhr('\n',1);
System.out.println("\tEl tamao del archivo:("+archi+":"+tamao+" Bytes)");
}
System.out.println("Fin del programa");
} //fin del main()
} //fin de la clase FlujoArchivos2
La salida del programa al ejecutarlo con el comando java FlujoArchivos2 y que muestra el archivo
IncrementoDecremento.java que se encuentra en la carpeta C:\j2sdk141\ejemplos\ es:
-------------------------------------------------------------------------------Archivo : IncrementoDecremento.java encontrado con xito en: C:\j2sdk141\ejemplos\
Tamao del archivo(compararlo al final): 604 Bytes
Es una archivo de lectura y escritura
Nombre del archivo: IncrementoDecremento.java
Nombre del directorio o carpeta del archivo : C:\j2sdk141\ejemplos
Fecha de ltima modificacin : Fri Aug 10 20:17:24 GMT-06:00 2001
-------------------------------------------------------------------------------import java.io.*;
public class IncrementoDecremento {
public static void main(String[] args)
{
char c = 'R';

161

byte j = 127;
short k = 32767;
System.out.println("c = " + c);
++c;
System.out.println("c = " + c);
++c;
System.out.println("c = " + c);
System.out.println("j = " + j);
--j;
System.out.println("j = " + j);
++j;
System.out.println("j = " + j);
++j;
System.out.println("j = " + j);
System.out.println("k = " + k);
k -= 4;
System.out.println("k = " + k);
k += 5;
System.out.println("k = " + k);
}
}//?>
-----------------------------------------------------------El tamao del archivo:(IncrementoDecremento.java:604 Bytes)
Fin del programa

El segundo ejemplo de la clase File muestra el uso de algunos de sus mtodos para manejo de carpetas o
directorios:
Si quieres obtener elcdigo dale clic aqu FlujoArchivos3.zip
/**
* Programa de java que ejemplifica el uso
* de la clase File para demostrar
* el manejo de carpetas o directorios
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: FlujoArchivos3.java
*/
import java.io.*;
import java.util.Date;
public class FlujoArchivos3
{
static String ruta = "C:\\j2sdk141\\ejemplos\\E-S\\";
static String[] lista;
static void prhr(char c, int lim) { for(int i=0; i<lim ; i++) System.out.print(c); }
static void prln(String msg) { System.out.println(msg); }
static void pr(String msg) { System.out.print(msg); }
public static void main(String[] argumentos)
{
try
{
File f = new File(ruta);
prhr('-',80);prhr('\n',1);
if (f.exists() )
{
lista = f.list(); /* Obtenemos la lista de archivos */
for (int i=0; i<lista.length; i++) /* los imprimimos */
prln("Archivo n\u00B0 "+(i+1)+": " + lista[i]);
}

162

else
System.out.println(" El directorio: " + ruta + " no existe ");
}
catch (Exception e)
{
/* directorio no encontrado */
System.err.println("Directorio no encontrado, Error: " + e.getMessage());
}
finally
{
prhr('-',60);prhr('\n',1);
}
System.out.println("Fin del programa");
} // fin del main
} //fin de la clase FlujoArchivos3
La salida del programa que muestra el contenido de archivos de la carpeta de mi computadora
C:\\j2sdk141\\ejemplos\\E-S\\ , al ejecutarlo con el comando java FlujoArchivos3 es:
-------------------------------------------------------------------------------Archivo n 1: Alumnitos.txt
Archivo n 2: Alumno.class
Archivo n 3: alumnosxsqlserver2000.sql
Archivo n 4: ArchiEnt.txt
Archivo n 5: ArchivoEnt.class
Archivo n 6: ArchivoSal.class
Archivo n 7: ArchivoSal.txt
Archivo n 8: classes
Archivo n 9: Copy.class
Archivo n 10: Copy.java
Archivo n 11: E-ASAjava.doc
Archivo n 12: E-SenJava.doc
Archivo n 13: entrada.txt
Archivo n 14: ENTSAL.bak
Archivo n 15: ENTSAL.jde
Archivo n 16: Escribe.class
Archivo n 17: EscribeNombres.class
Archivo n 18: EscribeNombres.java
Archivo n 19: EsencialJDBC.class
Archivo n 20: EsencialJDBC.java
Archivo n 21: Estudiantes.txt
Archivo n 22: Evaluador.class
Archivo n 23: Evaluador.java
Archivo n 24: EvaluadorArchi.class
Archivo n 25: EvaluadorArchi.java
Archivo n 26: EvaluadorArchivos2.class
Archivo n 27: EvaluadorArchivos2.java
Archivo n 28: EvaluadorBD2.class
Archivo n 29: EvaluadorBD2.java
Archivo n 30: EvaluadorBD3.class
Archivo n 31: EvaluadorBD3.java
Archivo n 32: Flujo1.java
Archivo n 33: FlujoArchivos1.java
Archivo n 34: FlujoArchivos2.class
Archivo n 35: FlujoArchivos2.java
Archivo n 36: FlujoArchivos3.class
Archivo n 37: FlujoArchivos3.java
Archivo n 38: Mi2doAccesoJDBC.class
Archivo n 39: MiAccesoJDBC.class
Archivo n 40: MS-DOS.LNK
Archivo n 41: Persona.class
Archivo n 42: PrintNames.class
Archivo n 43: PrintNames.java
Archivo n 44: salida.txt
Archivo n 45: src

163

Archivo n 46: Sumatorias.class


Archivo n 47: Sumatorias.java
Archivo n 48: Smbolo del sistema.lnk
Archivo n 49: tablaALUMNOSXsqlserver2000.sql
-----------------------------------------------------------Fin del programa

8.8 La clase FileOutputStream


El prximo paso es el esperado: abrir un archivo y escribir en l. Hay varias formas de realizar esto,
todas, prcticamente simtricas a las utilizadas para leer archivos. Ejemplo:
/* Creamos un stream de salida sobre el archivo */
FileOutputStream fos;
fos = new FileOutputStream("c:\\cursojava\\salida.txt");
/* Escribiremos los nmeros del 1 al 10 en el archivo */
for ( int k=0; k<=10; k++) {
fos.write(k);
}
fos.close();
Otro ejemplo puede ser el comando copy de MS-DOS:
Si quieres el cdigo de este programa dale clic aqu

Copy.zip

/**
* Ejemplo: programa de flujos (streams)
* que ejemplifica el uso de las clases
* FileInputStream y FileOutputStream para
* programar el comando copy de MS-DOS
* El programa utiliza manejo de excepciones
* de tipo java.io.IOException.
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Copy.java
*/
import java.io.*;
class Copy {
public static void main(String[] args)
{
String origen = args[0];
String destino = args[1];
byte buffer[] = new byte[1024];
int cuenta;
try {
FileInputStream fis = new FileInputStream(origen);
FileOutputStream fos = new FileOutputStream(destino);

164

while((cuenta=fis.read(buffer))>0)
fos.write(buffer,0,cuenta);

}
catch(IOException ioe) {
System.err.println("Se ha producido un error");
ioe.printStackTrace();
}
} // fin del mtodo main()
} // fin de la clase Copy
Si ejecutamos el programa Copy con el comando :
8.9 La clase DataOutputStream
Los programas que se han visto hasta ahora solo escriben bytes en un flujo de datos. A pesar de que
con estas tcnicas podramos leer y escribir cualquier cosa en un archivo, esta forma de trabajar es
relativamente pesada, ya que cada vez que quisiramos escribir, por ejemplo, un entero de 32 bits en
un archivo, tendramos que dividir los 32 bits en cuatro paquetes de 8 bits cada uno, e ir
transmitindolos a travs de flujo de datos. Para leer ese dato, el proceso sera el inverso; leer cuatro
bytes del flujo y combinarlos para obtener el nmero de 32 bits.
Como veremos, el paquete java.io nos proporciona varias herramientas para facilitarnos este trabajo.
La clase DataOutputStream
La clase DataOutputStream, es una extensin de la clase OutputStream, y aade a sta ltima
la posibilidad de escribir datos "complejos" en un flujo de salida. Cuando hablamos de datos
"complejos", en realidad nos referimos a tipo de datos primitivos, pero no restringidos nicamente a
bytes y a matrices de bytes, como en el caso de OutputStream.
Mediante la clase DataOutputStream podemos escribir datos de tipo int, float, double, char,
etc.
Adems podemos escribir algunos objetos, como datos de tipo String, en una gran cantidad
de formatos.
La forma general de trabajar con objetos de tipo DataOutputStream es la siguiente: obtenemos un
objeto OutputStream (cuyo origen puede ser cualquiera, un archivo, un socket, una matriz en
memoria, la salida estndar, etc.) y lo "envolvemos" en un objeto DataOutputStream, de forma
que podamos usar la interfaz que nos proporciona este ltimo. Para crear este DataOutputStream,
le pasamos como parmetros el OutputStream a su constructor.
Cada vez escribamos un dato "complejo" en un objeto DataOutputStream. Este lo traducir a bytes
individuales, y los escribir en el OutputStream subyacente, sin que nosotros tengamos que
preocuparnos de la forma en que lo hace.
Veamos algunos ejemplos:
OutputStream os = ... ;

// Creamos el flujo de salida

DataOutputStream dos = new DataOutputStream(os);


int a = -7;
float b= 3.42552;
double c = 747.8839;
dos.writeInt(a); // Escribimos un entero en el stream (4 bytes)

165

dos.writeFloat( b ); // Escribimos un nmero de precisin simple (4 bytes)


dos.writeDouble( c ); // Escribimos un nmero de precisin doble (8 bytes)
dos.close();
os.close();
Los nombres de los mtodos usados son bastante descriptivos por s mismo. En la documentacin del
SDK de Java podemos encontrar otros mtodos, uno para cada tipo de dato primitivo:
writeBoolean(), writeByte(), writeChar(), writeLong() y writeShort().
Si seguimos explorando el SDK, descubriremos algunos mtodos de los que an no hemos hablado;
writeBytes(); writeChars() y writeUTF(). Estos tres mtodos reciben como parmetros un objeto
de tipo String, y lo escriben en el OutputStream subyacente usando diferentes formatos.

writeBytes() descompone la cadena de texto en bytes individuales (obtiene su cdigo


ASCII) y los escribe en el flujo de salida. Si la cadena consta de n letras, escribe n bytes, sin aadir
ningn delimitador ni de principio ni de fin de cadena.

writeChars() descompone la cadena de texto en chars individuales (obtiene su cdigo


Unicode) y los escribe en el flujo de salida. Si la cadena consta de n letras, escribe n valores char, sin
aadir ningn delimitador ni de principio ni de fin de cadena.

writeUTF() escribe la cadena en un formato conocido como UTF-8. Este formato incluye
informacin sobre la longitud exacta de la cadena.
La conclusin importante que debemos extraer de estos tres ltimos mtodos es que slo el ltimo
nos permite recuperar la cadena con facilidad. Los otros dos mtodos no incluyen informacin sobre
la longitud de la cadena, por lo que si otro programa necesita leer los datos que nosotros hemos
escrito, es necesario conocer con anticipacin la longitud de la cadena. Si no sabemos esto, es
imposible saber el nmero de bytes o de valores char que debemos leer.
Un fragmento de cdigo ejemplo de utilizacin de estos mtodos es:
Strng cadena1 = "Me voy a descomponer en una cadena de texto de bytes individuales";
String cadena2 = "Me voy a descomponer en una cadena de texto de chars individuales";
String cadena3 = "Me voy a descomponer en una cadena de texto en formato UTF-8 ";
dos.writeBytes(cadena1);
dos.writeChars(cadena2):
dos.writeUTF(cadena3);

8.10 La clase DataInputStream

Si podemos escribir datos formateados entonces tambin podemos leerlos cmodamente. Esta
funcin es posible porque disponemos de la clase DataInputStream.
La clase DataInputStream est diseada para leer datos generados por un objeto
DataOutputStream. La especificacin de esta clase garantiza que cualquier archivo escrito por un
DataOutputStream, sobre cualquier plataforma y sistema operativo, ser legible correctamente por
un DataInputStream, sin tener necesidad de preocuparse de que si las mquinas son "littleendian" o "big-endian".

166

Supongamos que estamos intentando leer los datos escritos por el programa de ejemplo anterior
(donde escribamos un int, un float y un double en un flujo de salida):
InputStream is = ... ; // creamos un flujo de entrada
DataInputStream dis = new DataInputStream( is );
int x;
float y;
double z;
x = dis.readInt();
y = dis.readFloat();
z = dis.readDouble();
dis.close();
is.close();
Qu pasa si deseamos leer las cadenas de texto que hemos escrito?. Es inmediato leer la cadena
escrita en formato UTF. En cambio, leer las otras dos cadenas nos va a costar ms trabajo, ya que
debemos leer los bytes o los chars individuales, juntarlos de forma adecuada y construir la cadena
resultante.
En este caso usaremos un truco , ya que sabemos que las cadenas cadena1 y cadena2 tienen una
longitud de 65 letras exactamente. En una situacin normal, puede que no tengamos esta
informacin.
int tam = 65; // Aplicamos el truco
InputStream is =...; //creamos el flujo de entrada
DataInputStream dis = new DataInputStream( is );
byte miNuevoArray[] = new byte [ tam ];
dis.readFully(miNuevaArray); /* Este mtodo es nuevo */
String cadenaConvertida = new String(miNuevaArray,0=;
// Ahora tenemos que leer un montn de caracteres char de (16 bits)
// que forman el siguiente String escrito.
// Hay que hacer un bucle para ir leyendo los caracteres uno por uno
char otroArrayMas[] = new char[tam]:
for( int n = 0 ; n < tam ; n++ )
otroArrayMas[ s ] = dis.readChar();
String otraCadenaconvertida = new String( otroArrayMas );
// Solo resta leer el String en formato UTF-8
// Unicamente con llamar a readUTF(), ya que la longitud
// del String est indicada en el propio archivo.
String ultimaCadena = dis.readUTF();

En el ejemplo anterior hemos usado un mtodo nuevo.


DataInputStream.readFully( byte[] ) , que es bsicamente equivalente a
InputStream.read(byte[]) , con la nica diferencia de que no retorna hasta que hayan sido ledos

167

exactamente el nmero de bytes que caben en la matriz.


Es fcil apreciar las ventajas de usar los mtodos writeUTF() y readUTF().

Entrada y Salida en memoria


Existen ocasiones en que nos puede interesar acceder a cierta informacin en memoria como si
estuviramos leyendo desde un flujo de datos. Por ejemplo, podemos tener un objeto capaz de leer
un archivo MPEG (video comprimido) y mostrarlo posteriormente en pantalla.
Supongamos que ese objeto est diseado para leer los datos desde un InputStream, pero
queremos que lea los datos desde una array de bytes que tenemos en memoria, cuyo contenido
hemos generado de alguna forma.
Una forma de resolver el problema sera escribir el array de bytes en un archivo, y hacer que nuestro
objeto reproductor de MPEG leyera el contenido.
Otra forma, ms elegante y ms eficiente que la anterior, sera crear un flujo que extrajera sus datos
directamente desde nuestro array en memoria. Cualquier objeto que leyera datos de este flujo, en
realidad estara obteniendo los datos secuencialmente del array.
La clase que nos permite hacer este es DataArrayInputstream. Esta clase tiene un constructor al
que se le pasa como parmetro la matriz de bytes de la que debe leer, por ejemplo:
int tam = 40;
byte[] buffer = new byte[ tam ];
for( int n = 0 ; n < tam ; n++ )
buffer[n] = n;
ByteArrayInputStream bais = new ByteArrayInputStream( buffer );

int c:
while( ( c = bais.read() ) != -1 )

/*Mientras leamos algo de buffer*/

System.out.println( " Se ha ledo el valor: " + c );


...
La clase ByteArrayPutputStream es otra del mismo tipo muy til, ya que por medio de esta
podemos escribir datos en un flujo, sabiendo que estos datos se almacenan internamente en una
matriz de bytes. Esta matriz crece dinmicamente a medida que escribimos datos en ella.
Una vez escritos los datos, podemos acceder a la matriz de bytes mediante el mtodo
toByteArray(), que nos devuelve una copia de la matriz original.
Veamos el siguiente fragmento de cdigo de ejemplo:
ByteArrayOutputStream baos = new ByteArrayOutputStream():
boolean condicion = false;
while( condicion ) {
int dato = ;
baos write(dato);

168

condicion = ;
}
byte[] bufferSalida = baos.toByteArray();
Una vez ejecutado el cdigo anterior obtenemos una matriz de bytes con todos los datos que se han
ido introduciendo en la iteracin del bucle.

8.11 Ejemplo de DataInputStream y DataOutputStream


Vamos a resolver el
DataOutputStream.

siguiente

programa

utilizando

las

clases

DataInputStream

Un profesor de computacin lleva las calificaciones de sus alumnos en una libreta y desea calcular las
calificaciones de estos. El promedio total para cada alumno ser : 50% para la calificacin de
Windows, 25% para la de Word y 25% para la de Excel. Si el alumno saca 10 la calificacin ser
Sobresaliente, si obtiene entre 9 a 9.999 su calificacin ser Muy Bien, si obtiene entre 8 a 8.9999
su calificacin ser Bueno, si obtiene de 7 a 7.999 su calificacin ser De pansazo y si obtiene
entre 0 a 6.999 su calificacin ser Burro no aprobado.
El rea que esta en gris debe ser calculada con frmulas. Los datos deben leerse de un archivo de
entrada: entrada.txt y los resultados en un archivo de salida: salida.txt.

I d Apellidos Nombre C

o Tratamiento Windows Word Excel Promedio Calif

1 D a v o l i o N a n c y Representante de ventas S r t a .

8.00

8.19

9.04

2 F u l l e r A n d r e w Vicepresidente comercial D

8.00

9.00

6.00

3 Leverling J a n e t Representante de ventas S r t a .

8.00

8.00

8.00

4 P e a c o c k Margaret Representante de ventas S

r a

8.32

8.00

8.00

5 Buchanan S t e v e n G e r e n t e d e v e n t a s S

10.00

8.00

10.00

6 S u y a m a M i c h a e l Representante de ventas S

8.00

5.00

8.00

7 K i n g R o b e r t Representante de ventas S

8.91

8.00

9.00

8 C a l l a h a n L a u r a Coordinador ventas interno S r t a .


9 Dodsworth A n n e Representante de ventas S r t a .

8.00
8.00

1.14
7.50

5.57
8.00

Informacin

general

Mxima Calificacin
Promedi
o
ALumno

de

rendimiento

del

Mnima Calificacin
Promedi
o
Alumno

grupo

de

estudian

Varianza de los promedios

Solucin: La clase EvaluadorArchivos tiene el mtodo main() que arranca todo el proceso, y en l
estn los nombres de los archivos entrada.txt y salida.txt para el manejo de los datos. Tambin se
leen todos los datos del archivo entrada.txt para asignrselos al arreglo p de la clase Alumnos en el
bucle while de la lnea 116 a la 119.

169

Despus se invocan a algunos mtodos estticos de clase para el clculo de los datos estadsticos.
As, el mtodo esttico de clase PromediosGenerales(Alumno z[]) devuelve el promedio de
cada alumno y recibe el arreglo de la clase Alumno. El mtodo maxYminCalif(Alumno w[])
hace el trabajo de obtener que alumnos obtuvieron la mxima y mnima calificacin y los imprime, y
finalmente el mtodo varianzaPromedios(Alumno v[],double media) calcula la varianza, en
base a la media que se le envia como argumento.
Si quieres obtener todo el cdigo de este ejemplo dale clic aqu EvaluadorArchivos2.zip
1.
/**
2.
* Programa de java que ejemplifica el uso
3.
* de las clases DataInputStream y DataOutputStream
4.
* para ensearte a usar datos con formato en archivos.
5.
* @autor Oscar A. Gonzlez Bustamante
6.
* @version 1.0
7.
* Archivo: EvaluadorArchivos2.java
8.
*/
9.
10.
public class EvaluadorArchivos2 {
11.
12.
static void
imprime( Alumno x[] ) {
13.
final int band=1;
14.
15.
if( band ==1)
16.
System.out.println("Id\tNombre\tApellidos\tCargo\tTrato\tWindows\tWord\tExcel\tPromedio\tCalificac
ion");
17.
18.
for (int i=0; i< x.length; i++) {
19.
System.out.println(""+x[i].id
+ "\t" +
20.
x[i].nombre
+ "\t" +
21.
x[i].apellidos
+ "\t" +
22.
x[i].cargo
+ "\t" +
23.
x[i].getExamen(1)
+ "\t" +
24.
x[i].getExamen(2)
+ "\t" +
25.
x[i].getExamen(3)
+ "\t" +
26.
x[i].getPromedio()
+ "\t" +
27.
x[i].getCalificacion() + "\t" );
28.
Escribe.ponRaya(100,"-");
29.
}
30.
31.
}
32.
33.
static double PromediosGenerales(Alumno z[]) {
34.
double sumaWindows=0.0, sumaWord=0.0, sumaExcel= 0.0, sumaGrupo= 0.0;
35.
double promWindows=0.0, promWord=0.0, promExcel= 0.0, promGrupo= 0.0;
36.
37.
System.out.println();
38.
Escribe.ponRaya(100,"=");
39.
System.out.println("Informacin general del rendimiento del grupo de estudiantes");
40.
Escribe.ponRaya(100,"=");
41.
42.
for (int i=0; i< z.length; i++) {
43.
sumaWindows = sumaWindows + z[i].getExamen(1);
44.
sumaWord = sumaWord + z[i].getExamen(2);
45.
sumaExcel = sumaExcel + z[i].getExamen(3);
46.
sumaGrupo = sumaGrupo + z[i].getPromedio();
47.
}
48.
49.
promWindows = sumaWindows / z.length;
50.
promWord = sumaWord / z.length;
51.
promExcel = sumaExcel / z.length;
52.
promGrupo = sumaGrupo / z.length;
53.

170

54.
System.out.println("\tPromedio de Windows:"+ promWindows + "\n" +
55.
"\tPromedio de Word: " + promWord
+ "\n" +
56.
"\tPromedio de Excel: " + promExcel
+ "\n" +
57.
"\tPromedio del Grupo: " + promGrupo);
58.
59.
System.out.println("");
60.
61.
return promGrupo;
62.
63.
}
64.
65.
public static void maxYminCalif(Alumno w[]) {
66.
double maxima=0.0, minima=0.0;
67.
int burro= 0, estrellita= 0;
68.
System.out.println();
69.
maxima = w[0].getPromedio();
70.
minima = w[0].getPromedio();
71.
for(int i=1; i< w.length; i++){
72.
if ( maxima < w[i].getPromedio() ) {maxima = w[i].getPromedio();
estrellita = i; }
73.
if ( minima > w[i].getPromedio() ) {minima = w[i].getPromedio(); burro =
i; }
74.
}
75.
Escribe.ponRaya(40,"-");
76.
System.out.println("\tMaxima Calificacion:" +
77.
"\n\tAlumno:" + w[estrellita].nombre + " " + w[estrellita].apellidos
+
78.
"\n\tPromedio:" + maxima);
79.
System.out.println();
80.
System.out.println("\tMinima Calificacion:" +
81.
"\n\tAlumno:" + w[burro].nombre + " " + w[burro].apellidos +
82.
"\n\tPromedio:" + minima);
83.
84.
}
85.
86.
public static void varianzaPromedios(Alumno v[],double media) {
87.
double ds=0.0, varianza = 0.0;
88.
89.
for (int i=0; i < v.length; i++) {
90.
ds = ds + Math.pow(media - v[i].getPromedio(),2);
91.
}
92.
ds = ds/ v.length;
93.
94.
varianza = Math.sqrt(ds);
95.
Escribe.ponRaya(40,"-");
96.
System.out.println("\tVarianza de los promedios:" + varianza);
97.
}
98.
99.
public static void main( String args[] ) {
100.
101.
String[] archivos = { new String("salida.txt"), new String("entrada.txt") };
102.
String archient = archivos[1];
103.
String archisal = archivos[0];
104.
105.
double lamedia = 0.0;
106.
107.
Alumno p[] = new Alumno[9];
108.
109.
// Crea un flujo de entrada
110.
ArchivoEnt archivo_secu = new ArchivoEnt(archient);
111.
112.
113.
// Mientras no se encuentre el final del archivo sigue leyendo
114.

171

115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.

int i=0;
while (i<p.length) {
p[i] = archivo_secu.leer();
i++;
}
archivo_secu.cerrar();

//parte dedicada a crear los datos y guardarlos en un archivo de salida


// hay que quitarle los comentarios si no existe el archivo con formato de entrada
/*
p[0] = new Alumno(1,"Davolio","Nancy","Representante de Ventas","Srta.",8.00,8.19,9.04);
p[1] = new Alumno(2,"Fuller","Andrew","Vicepresidente comercial","Dr.",8.00,9.00,6.00);

133.
134.

p[2] = new Alumno(3,"Leverling","Janet","Representante de Ventas","Srta.",8.00,8.00,8.00);


p[3] = new Alumno(4,"Peacock","Margaret","Representante de Ventas","Sra.",8.32,8.00,8.00);

imprime(p);
lamedia=PromediosGenerales(p);
maxYminCalif(p);
varianzaPromedios(p,lamedia);

135.

p[4] = new Alumno(5,"Buchanan","Steven","Gerente de Ventas","Sr.",10.0 ,8.00 ,10.0);

136.

p[5] = new Alumno(6,"Suyama","Michael","Representante de Ventas","Sr.",8.00,5.00,8.00);

137.

p[6] = new Alumno(7,"King","Robert","Representante de Ventas","Sr.",8.91,8.00,9.00);

138.
139.

p[7] = new Alumno(8,"Callahan","Laura","Cordinador ventas interno","Srta.",8.00,1.14,5.57);


p[8] = new Alumno(9,"Dodsworth","Anne","Representante de ventas","Srta.",8.00,7.50,8.00);

140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.

ArchivoSal archi_secu = new ArchivoSal(archisal);


for ( int i=0; i<p.length; i++) {
archi_secu.insertar(p[i]);
}
archi_secu.cerrar();
*/
} // fin del main()
} // fin de EvaluadorArchivos2

Al ejecutar este programa con el comando java EvaluadorArchivos2 da los siguientes resultados:
Id Nombre Apellidos Cargo Trato Windows Word Excel Promedio Calificacion
1 Davolio Nancy Representante de Ventas 8.0 8.19 7.04 7.807499999999999 Muy Bien
---------------------------------------------------------------------------------------------------2 Fuller Andrew Vicepresidente comercial 8.0 9.0 6.0 7.75 Muy Bien
---------------------------------------------------------------------------------------------------3 Leverling Janet Representante de Ventas 8.0 8.0 8.0 8.0 Muy Bien
---------------------------------------------------------------------------------------------------4 Peacock Margaret Representante de Ventas 8.32 8.0 8.0 8.16 Muy Bien
---------------------------------------------------------------------------------------------------5 Buchanan Steven Gerente de Ventas 10.0 8.0 10.0 9.5 Muy Bien
---------------------------------------------------------------------------------------------------6 Suyama Michael Representante de Ventas 8.0 5.0 8.0 7.25 Muy Bien
---------------------------------------------------------------------------------------------------7 King Robert Representante de Ventas 8.91 8.0 9.0 8.705 Muy Bien
---------------------------------------------------------------------------------------------------8 Callahan Laura Cordinador ventas interno 8.0 1.14 5.57 5.6775 Muy Bien
---------------------------------------------------------------------------------------------------9 Dodsworth Anne Representante de ventas 8.0 7.5 8.0 7.875 Muy Bien
---------------------------------------------------------------------------------------------------=====================================================================
===============================
Informacin general del rendimiento del grupo de estudiantes
=====================================================================
===============================
Promedio de Windows:8.35888888888889

172

Promedio de Word: 6.981111111111111


Promedio de Excel: 7.734444444444445
Promedio del Grupo: 7.8583333333333325
---------------------------------------Maxima Calificacion:
Alumno:Buchanan Steven
Promedio:9.5
Minima Calificacion:
Alumno:Callahan Laura
Promedio:5.6775
---------------------------------------Varianza de los promedios:0.9811380863285476

La clase ArchivoEnt hace el trabajo de leer los datos del archivo entrada.txt . La ubicacin de ese
archivo es especificada por la variable String ruta en la lnea 14 y puede ser cambiada.

El constructor ArchivoEnt(String nombarchent) crea el flujo al archivo de entrada y crea un


objeto de la clase DataInputStream para leer los datos con formato y todo se hace en un try catch por si hay un error de tipo IOException.
El mtodo leer() de la lnea 36 a la 56 hace el trabajo de leer un registro del archivo con datos con
formato y emplea los mtodos de la clase DataInputStream , readInt(), readUTF(), y
readDouble() regresando un objeto de la clase Alumno , el mtodo cerrar() de la lnea 58 a la
65 cierra el flujo de entrada que abrimos con el mtodo ent.cloose() lo cual es importante para
evitar un problema con el administrador de archivos del sistema operativo.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.

/**
* Clase publica ArchivoEnt y que es necesaria para el
* programa EvaluadorArchivos2.java y que ensea a
* utilizar las clases DataInputStream y DataOutputStream
* para usar datos con formato en archivos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ArchivoEnt.java
*/
import java.io.*;
public class ArchivoEnt {
static String ruta = "C:\\j2sdk141\\ejemplos\\E-S\\";
private File fichero;
private FileInputStream f;
private DataInputStream ent;
boolean fin;
ArchivoEnt(String nombarchent) {
try {
fin = false;
fichero = new File(ruta+nombarchent);
f = new FileInputStream(fichero);
ent = new DataInputStream( f );
} catch(IOException ioe) {
System.err.println("Se ha producido un Error: " + ioe.getMessage());
ioe.printStackTrace();
}
}

173

33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.

67.

//Retorna si nos encontramos al final del archivo


public boolean eof() { return fin; }
public Alumno leer() {
Alumno reg= null;
try{ //lee un registro de Alumno del archivo
reg= new Alumno(ent.readInt(),
ent.readUTF(),
ent.readUTF(),
ent.readUTF(),
ent.readUTF(),
ent.readDouble(),
ent.readDouble(),
ent.readDouble() );
return reg;
}catch(EOFException eof) { fin=true;}
catch(IOException ioe) {
System.err.println("Se ha producido un Error: " + ioe.getMessage());
ioe.printStackTrace();
}
return reg;
}
public void cerrar(){
try {
ent.close();
} catch(IOException ioe) {
System.err.println("Se ha producido un Error: " + ioe.getMessage());
ioe.printStackTrace();
}
}
} // de la clase ArchivoEnt

La clase ArchivoSal hace el trabajo de escribir los datos del archivo salida.txt . La ubicacin de
ese archivo es especificada por la variable String ruta en la lnea 14 y puede ser cambiada.

El constructor ArchivoSal(String nombarchsal) crea el flujo al archivo de salida y crea un objeto


de la clase DataOutputStream para escribir los datos con formato y todo se hace en un try - catch
por si hay un error de tipo IOException.
El mtodo insertar(Alumno reg) de la lnea 33 a la 48 hace el trabajo de escribir un registro de la
clase Alumno con formato y emplea los mtodos de la clase DataOutputStream , writeInt(),
writeUTF(), y writeDouble() , el mtodo cerrar() de la lnea 51 a la 58 cierra el flujo de salida
que creamos con el mtodo sal.cloose() , adicionalmente a esto primero liberamos el flujo de salida
con el mtodo sal.flush() lo cual es importante para evitar un problema con el sistema operativo.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

/**
* Clase publica ArchivoSal y que es necesaria para el
* programa EvaluadorArchivos2.java y que ensea a
* utilizar las clases DataInputStream y DataOutputStream
* para usar datos con formato en archivos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ArchivoSal.java
*/

174

11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.

import java.io.*;

1.
2.
3.
4.
5.
6.
7.
8.
9.

/**
* Clase publica Persona que es necesaria para el
* programa EvaluadorArchivos2.java y que ensea a
* utilizar las clases DataInputStream y DataOutputStream
* para usar datos con formato en archivos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Persona.java
*/

public class ArchivoSal {


static String ruta = "C:\\j2sdk141\\ejemplos\\E-S\\";
private File fichero;
private FileOutputStream f;
private DataOutputStream sal;
ArchivoSal(String nombarchsal) {
try {
fichero = new File(ruta+nombarchsal);
f = new FileOutputStream(fichero);
sal = new DataOutputStream( f );
} catch(IOException ioe) {
System.err.println("Se ha producido un Error: " + ioe.getMessage());
ioe.printStackTrace();
}
}
public void insertar(Alumno reg )
{
try {
sal.writeInt(reg.getId());
sal.writeUTF(reg.getNombre());
sal.writeUTF(reg.getApellidos());
sal.writeUTF(reg.getCargo());
sal.writeUTF(reg.getTratamiento());
sal.writeDouble(reg.getExamen(1));
sal.writeDouble(reg.getExamen(2));
sal.writeDouble(reg.getExamen(3));
} catch(IOException ioe) {
System.err.println("Se ha producido un Error: " + ioe.getMessage());
ioe.printStackTrace();
}
}
public void cerrar(){
try {
sal.flush(); sal.close();
} catch(IOException ioe) {
System.err.println("Se ha producido un Error: " + ioe.getMessage());
ioe.printStackTrace();
}
}

60.
} // fin de la clase de ArchivoSal
La clase Persona establece los campos y mtodos accesores get y modificadores o mutadores set
para obtener o cambiar los valores de las variables miembro de la clase. Esta clase heredar todos
estos miembros a su subclase Alumno y que son utilizados a lo largo del programa ejemplo.

175

10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.

47.

public class Persona {


protected int id;
protected String apellidos;
protected String nombre;
protected String cargo;
protected String tratamiento;
Persona() {
id=-1;
nombre=null;
apellidos=null;
tratamiento=null;
cargo=null;
}
Persona (int id, String apellidos, String nombre, String cargo, String tratamiento) {
this.id = id;
this.apellidos = apellidos;
this.nombre = nombre;
this.cargo = cargo;
this.tratamiento = tratamiento;
}
// metodos accesores y modificadores
public int getId() { return id;}
public void setId(int nuevoid) { id = nuevoid; }
public String getApellidos() { return apellidos;}
public void setApellidos(String nuevoapellidos) { apellidos = nuevoapellidos;}
public String getNombre() { return nombre; }
public void setNombre(String nuevonombre) { nombre = nuevonombre; }
public String getCargo() { return cargo; }
public void setCargo(String nuevocargo) { cargo = nuevocargo;}
public String getTratamiento() { return tratamiento; }
public void setTratamiento(String nuevotratamiento) { tratamiento = nuevotratamiento; }
} // fin de Persona

La clase Alumno que es hija de la clase Persona . En esta clase se manejan las calificaciones de los
exmenes de cada alumno con las variables de tipo doble exa1, exa2 y exa3, la media o
promedio con la variable de tipo doble promedio y la calificacin con la variable String
calificacion.
Tiene los mtodos getPromedio() y setPromedio() que hacen las operaciones del clculo del
promedio ponderado, y los mtodos setCalificacion() y getCalificacin() para la obtencin de la
calificacin en base al promedio. Implementa la interface ConstantesUtiles para manejar un arreglo
de Strings para asignar la calificacin.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

/**
* Clase publica Alumno y que es subclase
* de la clase Persona y que es necesaria para el
* programa EvaluadorArchivos2.java y que ensea a
* utilizar las clases DataInputStream y DataOutputStream
* para usar datos con formato en archivos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Alumno.java
*/

176

13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.

public class Alumno extends Persona implements ConstantesUtiles {


private double exa1, exa2, exa3;
private double promedio;
private String calificacion;
Alumno() {
super(-1,null,null,null,null);
exa1=-1;
exa2=-1;
exa3=-1;
promedio=-1;
calificacion=null;
}
Alumno(int id, String apellidos, String nombre, String cargo,
String tratamiento, double exa1, double exa2, double exa3) {
super(id,apellidos,nombre,cargo,tratamiento);
this.exa1 = exa1;
this.exa2 = exa2;
this.exa3 = exa3;
}
public void setExamen(double examen,
if ( noexa == 1 ) exa1 = examen;
if ( noexa == 2) exa2 = examen;
if ( noexa == 3 ) exa3 = examen;
}

int noexa) {
//windows
//word
//excel

public double getExamen(int noexa) {


if ( noexa == 1 ) return exa1;
else
if ( noexa == 2) return exa2;
else
if ( noexa == 3 ) return exa3;
else return -1;
}
public void setPromedio() {
promedio = exa1*0.5 + exa2*0.25 + exa3*0.25;
}
public double getPromedio() {
setPromedio();
return promedio;
}
public void setCalificacion() {
if ( promedio== 10.0 ) calificacion = calificativo[0] ;
else
if ( promedio <= 9.999 && promedio >= 9.0) calificacion = calificativo[1];
else
if ( promedio <= 8.9999 && promedio >= 8.0) calificacion = calificativo[1];
else
if ( promedio <= 7.999 && promedio >= 7.0) calificacion = calificativo[1];
else
if ( promedio <= 6.999 && promedio >= 0.0) calificacion = calificativo[1];
else calificacion = null;
}
public String getCalificacion() {
setCalificacion();
return calificacion;
}

177

77.
78.
} // fin de Alumno
La interface ConstantesUtiles solo sirve para declarar un arreglo constante de objetos String para cada una
de las calificaciones y se utiliza en la clase Alumno.
1.
/**
2.
* Interface publica con constantes que necesita
3.
* el programa EvaluadorArchivos2.java y que ensea a
4.
* utilizar las clases DataInputStream y DataOutputStream
5.
* para usar datos con formato en archivos.
6.
* @autor Oscar A. Gonzlez Bustamante
7.
* @version 1.0
8.
* Archivo: ConstantesUtiles.java
9.
*/
10.
11.
public interface ConstantesUtiles {
12.
13.
public static String calificativo[] = {
14.
"Sobresaliente", "Muy Bien","Bien","De pansazo","Burro no aprobado" };
15.
} // fin de la interface ConstantesUtiles
16.
Finalmente la clase Escribe tiene el mtodo ponRaya( int lim, String simb ) el cual se emplea para escribir
lneas de smbolos para separar los resultados de la salida y su uso es utilitario.
1.
/**
2.
* Clase publica Escribe y que es necesaria para el
3.
* programa EvaluadorArchivos2.java y que ensea a
4.
* utilizar las clases DataInputStream y DataOutputStream
5.
* para usar datos con formato en archivos.
6.
* @autor Oscar A. Gonzlez Bustamante
7.
* @version 1.0
8.
* Archivo: Escribe.java
9.
*/
10.
class Escribe {
11.
public static void ponRaya(int lim, String simb) {
12.
for (int i = 1; i <= lim; i++)
13.
System.out.print(simb);
14.
System.out.println();
15.
}
16.
} // fin de la clase Escribe

Tanto la interface ConstantesUtiles y la clase Escribe pudieron haber estado en un paquete y


luego importadas, incluso las clases Alumno, Persona, ArchiEnt y ArchiSal deberan haber estado
en un paquete de clases y luego importadas en la clase EvaluadorArchivos2 pero esto se deja
como ejercicio al lector.
9. Uso de paquetes
Como el Java se ha de usar para proyectos grandes es preciso tener unos mecanismos que
permitan hacer una particin del programa en mdulos tan independientes entre s como sea
posible, de tal manera que tengan una gran coherencia interna y unos procedimientos de
comunicacin bien definidos y poco numerosos.
Si todos los nombres de clase son accesibles desde cualquier parte del programa, se produce con
gran rapidez una saturacin del espacio de nombres. Si adems existen varias personas o
equipos trabajando de forma independiente en partes distintas del desarrollo, los conflictos de
nombres se vuelven casi inevitables.
Con el fin de evitar los problemas de este tipo, Java proporciona los llamados paquetes ( packages
) , que permiten ocultar el conjunto de clases interrelacionadas e interfaces, de modo que estas
clases no son accesibles desde el exterior de cada paquete ( ocultacin de la implementacin ).
9.1 Qu es un paquete

178

Siempre que se desea crear un paquete de clases empleamos la palabra reservada package con
la siguiente sintaxis:

package nombre_del_paquete;

siendo esta definicin la primera primera lnea de cdigo no comentada dentro de un programa
de Java, salvo comentarios , dentro del archivo fuente.
Los paquetes pueden ser organizados, mediante importaciones, en una estructura jerrquica
anloga a la que se establece entre las clases al emplear los mecanismos de herencia. De hecho,
las propias libreras del lenguaje estn organizadas de este modo. El nombre del paquete refleja
su origen y el lugar que ocupa en la jerarqua. La empresa Sun ha especificado un convenio de
nombres que consiste en comenzar el nombre de paquete con el nombre de dominio usado en
Internet por los creadores del paquete, pero con el orden invertido. Adems el dominio de mas
alto nivel ( com, mil, org, mx, edu, etc. ) se escribe en maysculas. A este nombre de
dominio le sigue una serie de nombres que especifican, en sentido descendente, la posicin del
paquete en la jerarqua.
Las distintas partes del nombre van separadas por puntos. Todo se
vera ms claro con un ejemplo, el nombre:

MX.ipn.cic.ute.cursojava.utilerias
hace referencia a un paquete utilerias, el cual depende en la jerarqua de cursojava y esta
desarrollado en el dominio ute.cic.ipn.mx.
Este convenio hace posible evitar conflictos entre los nombres de los paquetes desarrollados en
diferentes lugares, al estar garantizada la no repeticin de los nombres de dominio. Una ventaja
adicional es la facilidad para localizar las ltimas versiones de un paquete y para contactar con sus
desarrolladores.
9.2 Creacin y uso de paquetes ( package / import )
Como habamos dicho la seccin anterior, siempre que se desea crear un paquete de clases
empleamos la palabra reservada package y sta debe ser la primera lnea de cdigo no
comentada dentro de un programa de java.
Es posible hacer que parte de las clases y las interfaces contenidos en un paquete sean utilizados
desde fuera del paquete. Para ello , es necesario que dichas clases e interfaces hayan sido
definidos como public.
Para acceder a una clase de otro paquete se emplea la palabra clave import del siguiente modo:

import nombre_del_paquete.Nombre_de_la_clase;

as, si se quiere importar la clase Escri del paquete cuyo nombre dbamos antes como
ejemplo, habra que hacer:
import MX.ipn.cic.ute.cursojava.utilerias.Escri;
Una vez importada la clase, se puede usar su nombre sin el nombre del paquete, a menos que
exista una clase con el mismo nombre en el paquete que contiene el import , o que exista un
conflicto de nombres con otra clase importada desde otro paquete.

179

Si se quieren importar varias clases de un mismo paquete, el hacerlo clase por clase puede
resultar muy engorroso. Con el fin de evitar stas repeticiones se ha previsto la posibilidad de
emplear un comodn en la parte del nombre de clase en la sentencia import
import MX.ipn.cic.ute.cursojava.utilerias.*;
Esto hace que todas las clases e interfaces pblicas del paquete especificado sean importados al
paquete actual.
El siguiente ejemplo es ilustrativo:
Tenemos las dos clases pblicas A y P en la carpeta
C:\cursojava\mascarones\alumnitos Estas forman parte del paquete de clases package
mascarones.alumnitos; se compilan y generan las unidades de compilacin A.class , C.class
, D.class y P.class.
Tenemos tambin una clase B en la carpeta C:\jdk1.3\ejemplos ( aunque puede ser cualquier
carpeta) que utiliza las clases publicas A y P disponibles en el paquete mascarones.alumnitos
gracias a la utilizacin de la instruccin import mascarones.alumnitos.*; que debe ser
tambin la primera lnea no comentada del programa.
Ahora para que todo este bien, tenemos que modificar la variable de ambiente CLASSPATH
agregndole C:\cursojava que es la carpeta donde inicia la ruta de clases, al final de la
instruccin de esa variable de ambiente, as:
CLASSPATH=.;C:\jdk1.3\bin;C:\jdk1.3\lib\tools.jar;C:\jdk1.3\lib\dt.jar;C:\jdk1.3\lib;C:\cursojava
As tanto el compilador javac.exe y el intrprete java.exe pueden localizar las clases definidas
por el usuario en el paquete mencionado.
Al compilar todos los programas y ejecutarlos
produce la salida que se muestra abajo. Ver los siguientes cdigos y la figura.
Siquieres obtener el cdigo clic con el botn derecho aqu A.java
/**
* Programa de Java que te ensea a construir
* mediante la palabra reservada package un paquete de clases.
* Solo las clases e interfaces pblicas sern miembros del
* paquete. En ste ejemplo solo la clase A es miembro del
* paquete mascarones.alumnitos. Las clases C y D no son miembros
* del paquete mascarones.alumnitos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: A.java
*/
package mascarones.alumnitos;
public class A {
public A() {
System.out.println("constructor mascarones.alumnitos.A() ");
C xc= new C();
D xd= new D();
}
}// fin de A
class C {

180

C() {
System.out.println("constructor mascarones.alumnitos.C() ");
}
}//fin de C
class D {
D() {
System.out.println("constructor mascarones.alumnitos.D() ");
}
}//fin de D

Para compilar el programa A.java usa el comando javac A.java, el cual te va a producir los
archivos A.class , C.class y D.class. Todos deben estar en el la carpeta
C:\cursojava\mascarones\alumnitos.
Siquieres obtener el cdigo clic con el botn derecho aqu

P.java

/**
* Programa de Java que te ensea a construir
* mediante la palabra reservada package un paquete de clases.
* Solo las clases e interfaces pblicas sern miembros del
* paquete. En ste ejemplo solo la clase P es miembro del
* paquete mascarones.alumnitos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: P.java
*/
package mascarones.alumnitos;
public class P {
public P() {
System.out.println("constructor mascarones.alumnitos.P() ");
}
public static void escribe(String s) {
System.out.println(s);
}
} // fin de la clase P

181

Siquieres obtener el cdigo clic con el botn derecho aqu B.java


/**
* Programa de Java que te ensea a utilizar
* mediante la palabra reservada import un paquete de clases.
* Solo las clases e interfaces pblicas sern miembros del
* paquete y son las que puedes utilizar en tu programa.
* En ste ejemplo solo la clase A y P son miembro del
* paquete mascarones.alumnitos, y las importamos con el
* caracter comodn asterisco. El archivo B.class puede
* ubicarse en cualquier directorio o carpeta de tu computadora.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: B.java
*/
import mascarones.alumnitos.*;
public class B extends A {
B() {
System.out.println("Hola soy constructor B() ");
}
static void main(String args[]) {
B x = new B();
P y = new P();
y.escribe("saludo 1: Hola ");
P.escribe("saludo 2: Amigos.");
System.out.println("Fin del programa");
}
}// fin de la clase B

La salida del programa al ejecutar el comando java B es la siguiente:


constructor mascarones.alumnitos.A()
constructor mascarones.alumnitos.C()
constructor mascarones.alumnitos.D()
Hola soy constructor B()
constructor mascarones.alumnitos.P()
saludo 1: Hola
saludo 2: Amigos.
Fin del programa
9.3 Paquetes estndar de Java
En esta parte estudiaremos las diferentes bibliotecas o paquetes estndar que ayudan a formar
el Java Platform. Como Java ha evolucionado a lo largo de los aos a travs de sus diferentes
versiones, los cambios ms importantes entre las diferentes versiones se han concentrado en el
conjunto de bibliotecas estndar. No obstante, hablando de forma comparativa, los cambios a
nivel de lenguaje han sido relativamente pocos. Lo que realmente define cada nueva versin de
Java es el conjunto de bibliotecas. Y sta sigue creciendo con cada nueva versin, como muestra
en la siguiente grfica:

182

Nota.Las estadsticas para las bibliotecas de Java 1.0.1.3 proceden de Java Developers Almanac
2000 de Patrick Chan (addison Wesley, 2000)
Aqu presentaremos las bibliotecas que son estndar para Java 2 Standard Edition (J2SE) versin
1.4. Aunque el lenguaje es relativamente sencillo, deber estar familiarizado con lo que se
encuentra disponible con el conjunto de bibliotecas estndar. En caso contrario, pasar ms
tiempo intentando adivinar lo que es cada cosas que usando realmente las clases de bibliotecas
adecuadas. Aparte de las bibliotecas estndar presentadas aqu, hay muchas otras bibliotecas
estndar de Java que no estn incluidas en la versin J2SE ya que hay bibliotecas que aparecen
en Java 2 Enterprise Edition (J2EE), adems de las bibliotecas no empaquetadas con ninguna
edicin, conocida como extensiones estndar. Las extensiones estndar tambin son conjuntos de
bibliotecas de Java, pero Sun no las incluye en las ediciones estndar de Java. Si quiere usar las
extensiones, deber descargarlas por separado.
Muchas bibliotecas se inician como extensiones estndar antes incorporarse al ciclo de versiones
estndar. Un sencillo indicador de si una biblioteca se inici como extensin estndar es
comprobar el nombre del paquete. Si ese nombre comienza javax.*, probablemente fue una
extensin. Como mnimo, estos paquetes se pueden utilizar con varias versiones de Java.
Bibliotecas de utilidades: Algunos paquetes estn tan arraigados en la tecnologa de desarrollo
Java que todo el mundo debe conocerlos. Incluyen clases para compatibilidad con lenguajes
principales, utilidades, flujos de E/S, formato de texto, componentes reutilizables y seguridad.
9.3.1 Paquete java.lang
Las clases del paquete java.lang estn tan profundamente integradas en el desarrollo de Java
que ni siquiera debe indicarle al compilador que las importe. Desde luego, ya se ha encontrado
con varias de las clases que forman esta biblioteca String, Thread y Exception, por nombrar
algunos. En este paquete encontrar varias categoras de clases.

Clases envolventes: Son clase que le permiten tratar tipos primitivos como objetos
reales, por ejemplo, los objetos int y float; reciben el nombre de Integer y Float. Puede utilizar
las clases envolventes para realizar conversiones entre cadenas o tipos de datos especficos y las
otras utilidades de conversin numrica.

Compatibilidad de cadenas: Las clases String y StringBuffer le permiten trabajar


con texto Unicode. La clase String se usa cuando necesita texto permanente de slo lectura; y la
clase StringBuffer se usa cuando necesita texto que pueda ser modificado.

183


Compatibilidad con multitarea: Las clases de apoyo se encuentran en java.lang:
Thread, Runnable, ThreadGRoup, ThreadLocal y InheritableThreadLocal. Con estas
clases puede crear varios thread de ejecucin en sus programas de Java.

Bibliotecas Math: Las clases Math y StrictMath proporcionan una coleccin de


funciones matemticas para generar nmeros aleatorios, funciones trigonomtricas (seno, coseno,
tangente, etc.), funciones logartmicas y exponenciales y clculos como encontrar el valor mximo
y el mnimo. La clase Math est optimizada para la velocidad. Se garantiza que la clase
StrictMath producir los mismos resultados en todas las plataformas, como ciertos algoritmos
publicados.

Acceso al sistema: Algunas clases de este grupo (System, Runtime y Process)


proporcionan acceso a informacin y capacidades especficas de sistema. Otras ayudan a la carga
de programas de Java y a un alto nivel de seguridad: ClassLoader, SecurityManager, Class y
Package. La clase System es la que encontr con anterioridad con System.out, para escribir
mensajes. Tambin puede encontrar informacin como la memoria disponible y la posicin del
entorno de ejecucin a lo largo de estas clases. Las clases de acceso al sistema tambin se usan
para iniciar programas especficos de ciertas plataformas.

Errores y excepciones: Las clases base para el control de excepciones se encuentran


en el paquete java.lang: Throwable, Exception, Error y muchas de sus subclases. Muchas de
las subclases de excepcin se encuentran en paquetes ms apropiados, como IOException en
java.io.
Otros dos subpaquetes de Java usados con menos frecuencia que java.lang son java.lang.ref y
java.lang.reflect. El paquete java.lang.ref ofrece compatibilidad con objetos de referencia,
un modo de supervisar el uso de objetos para ayudar al recolector de elementos no utilizados.
El paquete java.lang.reflect se usa para la reflexin (la capacidad de preguntar a una clase
sobre si misma).
9.3.2 Paquete java.util y java.math
Los paquetes java.util y java.math contienen clases con utilidades generales, las cuales
aparecen descritas en la documentacin de Sun. En el paquete java.util, encontrar ayudas
para la compatibilidad con tipos de datos abstractos (ADT) llamada Collection Framework, para
fechas y calendarios y algunas clases para ayudar a la internacionalizacin de sus programas. Con
el paquete java.math, hay ayudas para las operaciones aritmticas con precisin arbitraria.
Adems hay varios subpaquetes de java.util, como:

java.util.jar y java.util.zip, que ofrecen compatibilidad con archivos JAR (Java Archive),
GZIP y ZIP.

java.util.logging, la utilidad de registro bsica.

java.util.regex, la biblioteca de expresiones regulares para comparar patrones.

java.util.pref, que proporciona almacenamiento de las preferencias del usuario y la


aplicacin. En plataformas basadas en Microsoft Windows, el paquete java.util.pref.
proporciona acceso al registro de Windows.
9.3.3 Paquete java.io
Los servidores de E/S de archivos y flujos se encuentran en los paquetes java.io y java.nio.
Aqu, la n de nio significa nuevo.
La E/S y los nuevos servicios de E/S aparecen descritos
en la seccin de flujos en el captulo 9.

184

Bsicamente, estas clases proporcionan la posibilidad de leer y escribir a nivel de byte, de


carcter, de primitivo y de objeto, incluyendo el acceso directo a la memoria intermedia de E/S
nativa. Los filtros de E/S proporcionan nuevas posibilidades a las operaciones de lectura y
escritura bsicas. Por ejemplo, los flujos de E/S bsicos no se almacenan temporalmente, pero si
no desea realizar una operacin de lectura y escritura ms optimizada, puede agregar un filtro de
memoria intermedia.
9.3.4 Paquete java.text
El paquete java.text proporciona clases de apoyo adicionales para la internacionalizacin de sus
aplicaciones, adems de las ya mencionadas. Estas tres grandes clases son DateFormat,
NumberFormat y MessageFormat. Estas clases, trabajando junto a la clase
java.util.Locale, le permiten escribir fechas, nmeros y mensajes en formatos especficos de
cada pas (por ejemplo, con los nombres de los meses en el idioma apropiado). Hay tres clases
de formato, DateFormat y NumberFormat, MessageFormat y funcionan de la misma forma.
Otra clase importante de java.text es el AttributedString. Use esta clase como String o
StringBuffer, pero con el aadido de atributos como negrita, cursiva o tamao potencialmente
asociados con cada carcter de la cadena.
En 9.3.5 Paquete java.beans
El paquete java.beans es la base del entorno de componentes reutilizables para Java, llamdo
tecnologa JavaBeans.
Bsicamente, los beans permiten un entorno Plug and Play en el que se crean pequeos
componentes reutilizables que puede reciclarse por todo el sitio. Los bean se pueden usar en
aplicaciones GUI de cliente o con aplicaciones de servidor que usen las Java Servlets y JavaServer
pages (JSP), esto se discute mas tarde en el captulo 13.
Los componentes reutilizables no son
el paquete java.beans, sino el marco que le ayuda a crear sus propios componentes
reutilizables.
9.3.6 Paquetes para la seguridad
Java Platform se construy desde el principio pensando en la seguridad. SecurityManager en
java.lang forma la base de esa arquitectura de seguridad. Con cada edicin de Java, se han
agregado nuevas posibilidades a la arquitectura de seguridad estndar de Java.
Java 1.1
agreg java.security al conjunto estndar de paquetes Java, ofreciendo listas de control de
acceso, generacin de claves pblicas/privadas y compendios de mensajes.
Java 1.2 agreg
normas de seguridad y un PolicyManager, que ofreca un control de acceso ms depurado. Java
1.3 slo tena cambios menores, pero 1.4 introdujo en el ncleo varias extensiones API que ya
estaban disponibles anteriormente.

javax.security: Java Authentication and Authorization Service (JAAS) agrega un marco


de autentificacin y autorizacin.

javax.crypto: Java Cryptographic Extensin (JCE) agrega compatibilidad con


encriptacin.

javax.net: Java Secure Socket Extensin (JSSE) agrega compatibilidad con SSL. (Secure
Socket Layer).

org.ietf.jgss: Java GSS-API agrega compatibildad con Kerberos V5 (GSS significa Servicio
genrico de seguridad).
9.3.7 Paquete java.awt

185

Este paquete forma parte de las bibliotecas relacionadas con multimedia de Java incluyen las
bibliotecas necesarias para crear aplicaciones grficas, dibujar, sonido, manipulacin de imgenes
y accesibilidad.
AWT significa Abstract Window Toolkit.
El paquete AWT se divide en dos partes. La
primera la ayuda para dibujar. Aqu encontrar clases y subpaquetes para dibujar formas,
establecer patrones de relleno, manipular imgenes y trabajar con fuentes. La otra parte de AWT
es un conjunto de componentes, contenedores y layouts ( administradores de diseo ), para
crear aplicaciones grficas GUI y sus clases de apoyo.
Cabe sealar que en la versin de Java 1.4 SDK SE, la mayora de los casos, no usar estos
componentes AWT; en su lugar usar componentes de javax.swing, que son una versin
mejorada de la AWT.
Directamente relacionadas, pero fuera de la jerarqua de paquetes java.awt se encuentran dos
bibliotecas, java.applet y javax.imageio. Ya ha visto al paquete java.applet en
funcionamiento; es la base de la compatibilidad con applets.
Paquetes java.awt.print y java.print
Hay muchas clases de apoyo para que aparezcan cosas en pantalla con Java. La mayora de ellas
en java.awt.print y javax.print. Prcticamente, cada nueva versin de Java intenta mejorar los
anteriormente pobres servicios grficos. Afortunadamente, los ltimos intentos mejoran los
mtodos errneos del pasado.
Paquete javax.sound
El siguiente es el paquete javax.sound. Naturalmente, esto agrega sonido para Java. Encontrar
la posibilidad de reproducir archivos con formato AU, WAV, AIFF, RMF (Rich Music Format) y
MIDI. I
Para ms informacin sobre como grabar sonidos y el mezclador, acuda a
http://java.sun.com/products/java-media/sound/.
9.3.8 Paquete javax.swing
Este paquete tambin orma parte de la Java Foundation Classes (JFC). Tambin lo es AWT, pero
el trmino JFC puede escucharse ms frecuentemente asociado a Swing que AWT. Swing es el
componente de segunda generacin integrado en Java. Al usar componentes Swing con las clases
de apoyo AWT (y las utilidades de dibujo) puede crear interfaces de usuario muy elaboradas. Los
componentes disponibles para Swing, comienzan con los botones y etiquetas ms bsicos y
continan con elementos ms elaborados como mens, barras de herramientas, barras de
progreso, tablas, rboles e incluso un completo editor compatible con HTML. Incluso es
compatible con ventanas emergentes especializadas para escoger colores y archivos y mostrar
mensajes.
9.3.9 Paquete java.net
El paquete java.net es el paquete para el trabajo en red en general, incluyendo compatibilidad
con Ipv6, la siguiente generacin de protocolos de Internet. Las clases esenciales de java.net
proporcionan compatibilidad con muchas tareas relacionadas con el trabajo en red, ejemplos:
InetAddress, URL y URI, para direccionamiento en Internet.
Socket y ServerSocket, para comunicaciones basadas en TCP/IP.

186

DatagramPacket, DatagramaSocket y MulticastSocket, para comunicaciones basadas en UDP/IP.


Authenticator, PasswordAuthentication, URLDecoder, URLEncoder, URLConnection y
JarURLConnection, para acceso y manipulacin de URL.
9.3.10 Paquete java.sql y javax.sql
La API Java Database Connectivity (JDBC) proporciona acceso a bases de datos relacionales de
Java. La API ha atravesado varias versiones propias y actualmente se encuentra en la 3.0
Las anteriores versiones proporcionaban algunas capacidades estndar (java.sql) y algunas otras
opcionales (javax.sql). Con java 1.4 las opcionales ahora son estndar. La API JDBC se estudia en
el captulo 12.
9.4 Creacin de paquetes compactados en archivos .jar
El formato para compactar archivos que conocemos como ZIP, tambin se usa en el formato de
archivos JAR (Java ARchive).
Como todo en la filosofa de Java estos archivo son multiplataforma, y se pueden incluir archivos
de audio e imagen, archivos de clases. Con esto una aplicacin se agiliza haciendo una sola
peticin al servidor, ya que no es lo mismo que una aplicacin haga peticiones por cada archivo
.class, .jpg, .gif, etc., en lugar de un solo .jar.
Estos tambin soportan firmas digitales para su seguridad. Estos son particularmente tiles
cuando se trabaja con internet. Ya con una sola peticin es suficiente adems de que su acceso es
muy rpido.
Algo que pudiramos ver como desventaja es que en estos archivos JAR a diferencia de los
archivos ZIP comunes, no podemos agregar o actualizar un archivos JAR existentes. Estos
archivos se generan siempre nuevos.
Un archivo JAR consta de un solo archivo que contiene una coleccin de archivos ZIP o archivos
compactados, junto con una declaracin que se describe.
Esta herramienta la encontramos en SDK de Sun. Esta comprime automticamente los archivos
que se seleccionen y se invoca en la lnea de comandos, este es el formato que se utiliza para su
generacin.
jar [opciones] destino [manifiesto] archivo(s) de entrada
Donde las opciones son una coleccin de letras sin guiones ni caracteres especiales.
c

Crea un archivo nuevo o vaco

Lista la tabla de contenidos

Extrae todos los archivos

x file

Extrae el archivo nombrado

Espera un nombre de archivo (si no se diera toma la ent / sal estndar )

Dice que el primer parmetro es el nombre de un archivo de declaracin


creado por el usuario

Genera una salida que describe que es lo que va haciendo el JAR.

187

Solo almacena los archivos.


En esta caso los archivos se pueden
consultar declarndolos en el CLASSPATH.

No crear automticamente un archivo de declaracin

Si se incluye algn subdirectorio en los archivos a aadir a un archivo JAR, se integra a ese
subdirectorio automticamente incluyendo tambin todos sus subdirectorios, etc. Tambin se
mantiene la informacin de rutas.
9.4.1 Ejemplo de creacin de un archivo .jar
Para este ejemplo debes tener configurado tu autoexec.bat , o tu variable de entorno path, de
manera que tengas la ruta del directorio donde se encuentra el archivo jar.exe de tu SDK, en
%java_home%\bin.
1. En la consola del MS-DOS o en la terminal de linux , ejecutas el archivo jar.exe desde la
ruta donde se encuentran tus archivos compilados. Si escribes jar y das un enter, se desplegar
una lista de ayuda donde te muestran los parmetros que acompaan la instruccin.
Regularmente se utilizan tres parmetros que son c, v y f: crear un nuevo archivo JAR,
desplegar una salida (solo para ver que archivos se van empaquetando) y especificar el nombre
del archivo JAR generado respectivamente.
2. Supongamos que en tu directorio C:\tareaj tienes los archivos Hola.class, Saludos.class,
Sonia.class y MiFoto.gif; y quieres empaquetarlos en un JAR. Entonces la instruccin es la
siguiente:
C:\tareaj>jar cvf Sonia.jar Hola.class Saludos.class MiFoto.gif
Esta instruccin
archivos.

te

empaquetar

en

un

JAR

de

nombre

Sonia.jar

los

tres

3. Ahora, supongamos que en tu directorio C:\tareaj generaste una librera de clases con la
sentencia package de nombre MiLibreria. Esto gener una carpeta que contiene los archivos
.class dentro de tu directorio C:\tareaj. Si quieres hacer un JAR con esta carpeta que contiene
tus archivos .class :
C:\tareaj> jar cvf Sonia.jar MiLibreria MiFoto.gi
Esta instruccin te empaquetar en un JAR de nombre Sonia.jar
MiLibreria con todos los archivos .class que contiene, mas el archivo GIF.

la

carpeta

4. Si la idea de usar el archivo JAR es para empaquetar los archivos de un applet, la llamada del
applet debe ser la siguiente manera en tu pagina web:
Usaremos la librera MiLibreria creada en el punto 3.
<applet archive=Sonia.jar code=MiLibreria.Sonia.class width=300 height=200>
</applet>
Ejemplo de uso de un archivo JAR en un applet.
El applet que se usa para explicar el uso del archivo JAR despliega una imagen, por lo que se
empaca en un archivo JAR llamado izta.jar : A_imagen.class y arita_de_la_luz.jpg como se
muestra en la siguiente pantalla:

188

Si quieres el cdigo y la imagen de este ejemplo dale clic aqu

tareaj.zip

Nota: Este es el caso en que no se gener ninguna librera con package.


En la pagina html del applet se especifica el archivo JAR como se muestra a continuacin:
<html>
<body>
<applet archive=izta.jar width=800 height=600 code="A_imagen.class">
</applet>
</body>
</html>
Utilizamos el visor appletviewer de Java para ver el applet, la salida es la siguiente:

10. Los applets

La clase Applet proporciona todo lo necesario para la creacin de applets. Est contenida en el paquete
java.applet, por tanto, siempre que deseemos desarrollar un applet deberemos importar este paquete, as como
tambin el paquete java.awt , java.awt.event, y javax.swing que contienen todas las herramientas necesaria
para desarrollar interfaces grficas.

189

Un applet es un programa que se ejecuta mediante un navegador de Internet o con el programa herramienta del
SDK appletviewer.exe .

Los applet tienen la ventaja de ejecutarse en Internet sobre el navegador en el equipo del cliente, pero los
diseadores de Java les colocaron algunas restricciones para evitar que estos daen o inserten virus en las mquina
donde se ejecutan, entre ellas estn:
a)
b)
c)
d)

No pueden leer o escribir en el sistema de archivos desde un navegador


Solo tienen acceso al ervidor definido dentro del applet en un programa que use sockets
impedimento para ejecutar programas en el cliente
impedimento para cargar programas nativos incluidas las DLL.

10.1 Construccin de applets


Con la versin de Java 2 la estructura para crear un programa de tipo applet tiene la siguiente
forma:
//Creacin del Archivo.java
//primera forma para Java 2
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Nombre extends Applet
implements ActionListener {
...........
...........
...........
public void init()
{ ....... }
public void paint()
{ ....... }
public void actionPerformed(ActionEvent e )
{ ....... }
}
Si queremos que nuestro applet maneje eventos, debemos importar el paquete
java.awt.event.* y utilizar la interface ActionListener para implementar la accion que
responda al evento en el mtodo actionPerformed()
Con la versin de Java 1 que ya esta desaprobada , la estructura para crear un programa de tipo
applet tiene la siguiente forma:
//Creacin del Archivo.java
//segunda forma
import java.applet.*;
import java.awt.*;
public class Nombre extends Applet {
...........
...........

190

...........
public void init()
{ ....... }
public void paint()
{ ....... }
public boolean action(Event e, Object o )
{ ....... }
}
En 10.2 Ciclo de vida de un applet
Un applet hereda sus propiedades y sus mtodos de la clase Applet del paquete java.awt
existente en la biblioteca java.applet, cuenta con varios mtodos que el usuario puede
sobreescribir para darle la funcionalidad requerida. Estos mtodos siguen un ciclo de vida que se
explica en el diagrama de abajo, estos mtodos son:
init(): es el primer mtodo que se ejecuta al cargar el applet y slo se ejecuta una vez. Se debe
utilizar para inicializar las variables.
start(): se ejecuta despus del init(). Permite reinicializar un applet despus de que se haya
parado. El mtodo start() se ejecuta cada vez que se muestra en pantalla el documento HTML
que contiene el applet.
paint(): se ejecuta cada vez que se debe volver a pintar la salida de un applet.
stop(): se ejecuta cuando el navegador abandona la pgina HTML que contiene el applet. Se
utiliza para parar el applet; para volverlo a iniciar se llama el mtodo start().
destroy(): se ejecuta cuando el entorno determina que el applet debe ser borrado
completamente de la memoria. El mtodo stop() siempre se ejecuta antes que el destroy.
En esta clase el mtodo inicial para ejecutar un applet es init() cuando se omite se usa el mtodo
start() , si tambin se omite se usa el mtodo paint() ( esto significa que no requiere de un
mtodo main() )

Figura que muestra el ciclo de vida de un applet.

191

En el ejemplo siguiente se muestra un applet llamado CicloVida que despliega una serie de
mensajes en la consola y en el visualizador del appletviewer , el cual demuestra el ciclo de vida
del applet.
/**
* Programa que muestra las etapas de la vida de un applet.
* Ejemplifica los mtodos ms comunes de un applet.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CicloVida.java
*/
import java.applet.Applet;
import java.awt.Graphics;
public class CicloVida extends Applet
{
/**
* Mtodo constructor del applet. Tiene el mismo nombre de la clase
*/
public CicloVida()
{
System.out.println("El constructor se esta ejecutando....");
}
/**
* Mtodo init del applet. Inicializa el applet.
*/
public void init()
{
System.out.println("Este es el mtodo init().\n");
}
/**
* Mtodo start. Arranca o comienza el applet
*/
public void start()
{
System.out.println("Este es el mtodo start(). \n");
}
/**
* Mtodo paint. Dibuja o pinta el applet.
*/
public void paint(Graphics lasGraficas)
{
lasGraficas.drawString("Hola , a todos mis pupilos!", 10,50);
System.out.println("El applet acaba de ser dibujado con paint() \n");
}
/**
* Mtodo stop. Para el applet.
*/
public void stop()
{
System.out.println("Este es el mtodo stop(), para el applet. \n");
}
/**
* Mtodo destroy. Destructor del applet.
*/
public void destroy()
{
System.out.println("Este es el mtodo destroy(), destruye el applet.\n");
}
} // fin de CicloVida

192

<html>
<head>
<title>CHECA EL CICLO DE VIDA DEL APPLET</title>
</head>
<body>
<APPLET CODE= "CicloVida.class" WIDTH="200" HEIGHT="150">
</APPLET>
</body>
</html>

La figura siguiete muestra la ejecucin del applet CicloVida con el comando appletviewer
ElciclodelApplet.htm

10.3 El tag Applet en HTML


Los applets son ejecutados mediante un navegador ( Internet Explorer, Netscape, Opera, etc. ) o
con el appletviewer, pero esto es realizado mediante un archivo con extensin HTML. En este
archivo debe tener la etiqueta o tag <APPLET></APPLET> con la siguiente estructura:
Archivo.html
<APPLET
Code
CodeBase
Align
Width

= "Nombre archivo de clase"


= "Ruta (URL) a los archivos de clase"
= "Alineacin del Applet"
= "Ancho en pixeles del Applet"

193

Height
<PARAM name
parmetro">
</APPLET>

= "Alto en pixeles del Applet" >


= "nombre del parmetro" value = "valor del

En la etiqueta <APPLET></APPLET> algunos argumentos permiten modificar la ubicacin del


espacio que ocupa el applet en una pgina web, algunos de estos atributos son:
a) ALIGN, determina la alineacin del applet, los valores que toma son: LEFT, RIGHT ,
TEXTTOP, MIDDLE, BASELINE, BOTTOM, ABSBOTTOM, TOP, ABSMIDDLE, as por ejemplo,
<APPLET ALIGN=LEFT> coloca el applet haca la izquierda y el texto adelante del mismo. Si
agregamos la etiqueda <BR> el texto se coloca despus del applet si se incluye el atributo CLEAR
el cual toma los valores LEFT para colocar el texto en el siguiente margen izquierdo disponible,
RIGHT para el margen derecho y ALL en la siguiente lnea donde ambos mrgenes estn
disponibles.
b)

HSPACE, indica el espacio horizontales entre el applet y el texto que lo rodea.

c)

VSPACE, indica el espacio vertical entre el applet y el texto que lo rodea.

d)
CODEBASE, contiene la ruta de las clases del applet, si se omite se considera
el mismo directorio de la pgina web.
f)
PARAM, contiene una pareja de NAME
applet , y pueden ser uno o mas etiquetas PARAM.

VALUE

para

enviar

parmetros

al

Actualmente se tienen equipos informticos en donde residen las pginas web, las bases de
datos, cmaras de vdeo y otros servicios; estos se conocen como hosts o servidores. Las
computadores que reciben los datos, imgenes, pginas web de los servidores se conocen como
clientes.
En Java los programas que se ejecutan en el cliente se llaman applets y los que se ejecutan del
lado del servidor se llaman servlets .
Con el paquete javax.swing la clase Applet recibe el nombre de JApplet, pero tiene los
mismos mtodos de la clase Applet del paquete java.awt . Ahora veremos como podemos
utilizar la clase JApplet en un un programa que despliega mensaje:
Si quieres el cdigo del applet dale clic aqu

SwingEjemplo.zip

Si quieres ejecutar el applet en tu navegador dale clic aqu

SwingEj.htm

/**
* Programa de Java que te ensea a hacer applets
* con la librera java.swing.*
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: SwingEjemplo.java
*/
import java.awt.Graphics;
import java.util.Date;
public class SwingEjemplo extends javax.swing.JApplet
{
public void paint( Graphics g )
{

194

g.drawString("Hola alumnos, su curso de ", 25, 20 );


g.drawString("applets, con swing, y awt ", 25, 35 );
g.drawString("a comenzado hoy => " + new Date() , 25, 50 );
}
}

el archivo HTML para invocar a este applet es similar que para el caso de los applets con la clase
Applet, as:
<HTML>
<HEAD>
<TITLE>Applet Hola</TITLE>
</HEAD>
<BODY>
<P>Applet con javax.swing de bienvenida</P>
<APPLET CODE="SwingEjemplo.class" WIDTH=500 HEIGHT=100>
</APPLET>
</BODY>
</HTML>

El resultado que se visualiza al ejecutar el applet con comando appletviewer es:

10.4 Paso de parmetros a un applet desde HTML


En un applet es posible recibir parmetros desde la pgina web de HTML con la etiqueta
<APPLET> que lo invoca mediante el mtodo getParameter("argumento") . Este mtodo
devolver el valor del "argumento" como un objeto de la clase String.
Los parmetros son
enviados dentro de la etiqueta <APPLET> con <PARAM NAME = "argumento" VALUE =
"elvalor" > y no est limitada a un solo parmetro, pueden ser varios parmetros los que se
enven, por ejemplo:
<APPLET CODE = "SwingParametros.class" WIDTH=400 HEIGHT=100>
<PARAM NAME="figura" VALUE= "circulo" >
<PARAM NAME="radio" VALUE= "50.0" >
</APPLET>
Donde estamos enviando dos parmetros; uno llamado "figura" y otro "radio" con sus valores
"circulo" y "50.0" respectivamente. Como el mtodo getParameter() regresa un objeto de la
clase String, en el caso de "50.0" , este ser una cadena y no un nmero, esto es, no sera un
valor de tipo double o float, si queremos convertirlo a esos tipos hay que utilizar mtodos de
conversin de tipos disponibles en las clases wrapper Double o Float.
En 10.5 Ejemplos con el mtodo getParameter()
En el siguiente applet de ejmplo se calcula el rea de un crculo o de un cuadrado y se

195

dibuja la figura dependiendo del valor recibido en el parmetro "figura", si este valor es "circulo",
dibujar un circulo y obtendr su rea, pero si el valor es "cuadrado" entonces dibujar un
cuadrado y calcular su rea :
Si quieres el cdigo del programa dale clic aqu

SwingParametros.zip

/**

* Programa de Java que te ensea a hacer applets


* con la librera java.swing.* que reciban parametros
* y utiliza para ello el mtodo getParameter()
* Dependiendo del valor del parametro dibujar un
* circulo o un cuadrado.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: SwingParametros.java
*/
import java.awt.*;
import javax.swing.JApplet;
public class SwingParametros extends JApplet
{
public void paint( Graphics g )
{
String figura;
float radio;
float lado;
double areacirculo, areacuadrado;
// LEE LOS PARAMETROS DE HTML name Y value
figura = getParameter("figura");
if ( figura.equals("circulo") ) {
radio = new Float( getParameter("radio") ).floatValue();
areacirculo = Math.PI * radio * radio;
g.drawString("El area de un "+ figura +
" de radio " + radio + " = " + areacirculo,
15, 20 );
g.setColor( Color.RED );
g.drawOval( 100, 30, (int)radio, (int)radio );
g.setColor( Color.CYAN );
g.fillOval(100, 30, (int)radio - 1, (int)radio - 1 );
}
else if ( figura.equals("cuadrado") ) {
lado = new Float( getParameter("lado") ).floatValue();
areacuadrado = lado * lado;
g.drawString("El area de un "+ figura +
" de lado " + lado + " = " + areacuadrado,
15, 20 );
g.setColor( Color.RED );
g.drawRect(100, 30, (int)lado, (int)lado );
g.setColor(new Color(00,21,00));/* establece color verde muy obscuro */
g.fillRect(100+1,30+1,(int)lado-1,(int)lado-1); /* dibuja borde */
}
else {
g.drawString("Lo siento no hay ninguna figura",15, 20 );
}
} // fin del paint()
} // fin de la clase SwingParametros

En este caso el archivo HTML con el que se invoca el applet tiene dos etiquetas <APPLET> y cada
una con un parmetro "figura" que es el parmetro que se le enva al programa en Java el cual
extrae su valor con el mtodo getParamenter() y en una sentencia if se decide cual figura
dibujar , el archivo es el siguiente:

196

<HEAD>
<TITLE>Applet con parmetros</TITLE>
</HEAD>
<BODY>
<P>Applet que desplega un el area de una figura y la dibuja</P>
<P>Ahora voy a dibujar una figura=circulo</P>
<APPLET CODE = "SwingParametros.class" WIDTH=400 HEIGHT=100>
<PARAM NAME="figura" VALUE= "circulo" >
<PARAM NAME="radio" VALUE= "50.0" >
</APPLET>
<APPLET CODE = "SwingParametros.class" WIDTH=400 HEIGHT=100>
<PARAM NAME="figura" VALUE= "cuadrado" >
<PARAM NAME="lado" VALUE= "50.0" >
</APPLET>
</BODY>
</HTML>

la salida del programa al ejecutarlo con el comando appletviewer es:

11. AWT, applets y aplicaciones

Las AWT proveen componentes bsicos para una GUI ( Graphics User
Interface - Interface Grfica de Usuario ) y son utilizados en las
aplicaciones y los applets de Java. Una de las ventajas de usar AWT es
que la interface es independiente de la plataforma o interface grfica de
la mquina. Esto nos asegura que lo que se vea en una computadora
aparecer igual en otra computadora.
Una estrategia para estudiar las AWT es dividirlas en :

Componentes

Contenedores

Layouts ( Administradores de diseo )

Eventos

197

Componentes. Son clases o interfaces que permiten crear los objetos


grficos que componen una GUI tales como;
botones, listas
desplegables, cuadros de texto, casillas de verificacin, botones de
opcin, campos de texto, etiquetas, mens, etc.
Contenedores. Son clases o interfaces que permiten crear objetos
grficos para contener a los componentes, tales como; paneles, cuadros
de dilogo, marcos, ventanas, etc.
Layouts. Son clases o interfaces que permiten crear objetos de que
administren el diseo , la distribucin y colocacin de los objetos
componentes dentro de los objetos contenedores. Por ejemplo el
FlowLayout distribuye los componentes de izquierda a derecha y de
arriba a abajo, el BorderLayout los distribuye en cinco reas
geogrficas; norte, sur, este, oeste y centro, etc..
Eventos. Son las clases o interfaces que permiten crear objetos que
capturen y manejen los eventos. Un evento es una accin sobre algn
componente, por ejemplo, clic a un botn, pulsar la tecla de enter en un
botn, mover un elemento con las teclas de navegacin, eventos
especiales como los programados por tiempo, etc. Sin los eventos las
GUI seran interfaces grficas sin vida, y por lo tanto no seran muy tiles
que digamos.
11.1 El paquete java.awt
El paquete java.awt contiene las clases componentes que generan una
GUI . Un resumen de este paquete se muestra en la siguiente figura.

java.lang.Object
BorderLayout
CardLayout
CheckboxGroup
Color
Event
FlowLayout
Font
FontMetrics
Graphics
GridLayout

198

Image
Insets
Point
Polygon
Toolkit
MenuComponent
Component
MenuBar
MenuItem
CheckBoxMenuItem
Menu
PopupMenu
Component
Button
Canvas
Checkbox
Choice
Container
Panel ------- ( java.applet package
)
ScrollPane
Window
Dialog ---- FileDialog
Frame
Label
List
Scrollbar
TextComponent

199

TextArea
TextField

Exceptions - AWTException

Errors - AWTError

11.2 Componentes
Como habamos mencionado al principio de este captulo, los componentes son clases o interfaces
que permiten crear los objetos grficos que componen una GUI. La tabla siguiente nos
introduce brevemente a la amplia gama de los componentes de la AWT.
Tabla. Las AWT y sus componentes
Tipo de Componente
Button
Canvas
Checkbox
CheckboxMenuItem
Choice
Component
Container
Dialog
Frame
Label
List
Menu
MenuItem
Panel
Scroollbar
ScroolPane
TextArea

Descripcin
Es un botn usado para recibir el clic del ratn
Un lienzo o panel usado para dibujar
Cuadro de verificacin. Es un componente que le permite
seleccionar un elemento
Es un cuadro de verificacin dentro de un men
Es una lista desplegable de elementos estticos.
Es el padre de todos los componentes AWT, excepto de
los componentes de tipo men
Es el padre de todos los contenedores
Es un cuadro de dilogo o una ventana de alto nivel con
titulo y bordes.
Es un marco o ventana y es la clase base de todas las
ventanas GUI con controles para ventana.
Etiqueta. Es una cadena de texto como componente.
Un componente que contiene un conjunto dinmico de
elementos.
Es un elemento dentro de la barra de men, el cual
contiene un conjunto de elementos de tipo men.
Un elemento dentro de un men.
Una clase contenedora bsica usado frecuentemente para
crear diseos ( layouts ) complejos.
Un componente que permite al usuario hacer una
seleccin dentro de un rango de valores.
Una clase contenedora que implementa un deslizador
horizontal y vertical para un nico componente hijo
Un componente que permite al usuario introducir texto en
un bloque o rectngulo.

11.2.1 Button
En esta seccin veremos ejemplos que hacen uso de los componentes, del paquete java.awt los
cuales puede escoger para crear su GUI.

200

Ya nos es familiar que un objeto de la clase Button sea un componente. Puede ser construido
con una etiqueta de texto para informar al usuario sobre su uso. En el siguiente fragmento de
cdigo se crea un nuevo botn , se le da una etiqueta, una dimensin, y se le agrega un oyente
mediante delegacin de eventos, luego se agrega el componente al contenedor.
private Button boton = new Button(); //se crea el botn
boton.setLabel("Botoncito"); //se le da una etiqueta
boton.setBounds(new Rectangle(70, 45, 95, 55)); // se le da una dimensin al botn
boton.addActionListener(new ActionListener() // agregamos un oyente al botn
{
public void actionPerformed(ActionEvent e)
{
button1_actionPerformed(e); // si le dan clic al botn se dispara el evento
}
});
this.getContentPane().add(boton, null); // se agrega el botn al contenedor

El mtodo actionPerformed() es el que implementa la interface ActionListener, la cual es


registrada como un oyente , y el invocada cuando el bton es presionado por un clic del ratn. La
accin es delegada al mtodo button1_actionPerformed()
private void button1_actionPerformed(ActionEvent e)
{
System.out.println("Viva Villa jijos del maiz!!!!");
}
La cadena "Viva Villa jijos del maiz!!!" pudo haberse establecido con el mtodo:
boton.setActionCommand("Viva Villa jijos del maiz!!!");
y luego recuperado con el mtodo
e.getActionCommand()
dentro del mtodo
button1_actionPerformed()

201

Si quieres obtener elcdigo clic con el botn derecho aqu Frame1JDev.zip


El cdigo completo del programa se lista a continuacin:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Button;
import java.awt.Rectangle;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase Button.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: FrameJDev.java
*/
public class Frame1JDev extends JFrame
{
private Button boton = new Button(); //se crea el botn
public Frame1JDev()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
this.setTitle("Esto es un Frame");
boton.setLabel("Botoncito"); //se le da una etiqueta
boton.setBounds(new Rectangle(70, 45, 95, 55)); // se le da una dimensin al botn
boton.addActionListener(new ActionListener() // agregamos un oyente al botn
{
public void actionPerformed(ActionEvent e)
{
button1_actionPerformed(e); // si le dan clic al botn se dispara el evento
}
});
this.getContentPane().add(boton, null); // se agrega el botn al contenedor
}
private void button1_actionPerformed(ActionEvent e)
{
System.out.println("Viva villa jijos del maiz!!!!");
}
public static void main( String args[] ) throws IOException
{
Frame1JDev f = new Frame1JDev();

202

60.
61.
62.
63.
64.
65.

66.

f.setVisible( true );
System.out.println("da un teclazo!!!");
System.in.read();
}
}

11.2.2 CheckBox
El componente Checkbox nos provee de un simple dispositivo de encendido/apagado con una
etiqueta de texto a un lado. Veamos el siguiente ejemplo:
Si se selecciona el Checkbox correspondiente desplegar el sabor del helado correspondiente, si
se quita la marca de verificacin o la palomita escribir que no hay ese sabor correspondiente.

Si quieres el cdigo de este programa dale clic aqu


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.

RicosHelados.zip

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.Checkbox;
import java.awt.Rectangle;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.io.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase Checkbox.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: RicosHelados.java
*/
public class RicosHelados extends JFrame
{
private Checkbox fresa = new Checkbox(); // se crean los componentes Checkbox
private Checkbox chocolate = new Checkbox();
private Checkbox vainilla = new Checkbox();

203

24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.

public RicosHelados()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(370, 145));
this.setTitle("Ricos Helados de Coyoacn"); // titulo del JFrame
this.setBackground(Color.cyan);
fresa.setLabel("FRESA"); // se establecen la etiquetas
fresa.setBounds(new Rectangle(35, 35, 73, 23)); // tamao del componente
fresa.setBackground(Color.pink); // color del fondo
fresa.addItemListener(new ItemListener() // se agrega un oyente
{
public void itemStateChanged(ItemEvent e)
{
fresa_itemStateChanged(e); // se delega el evento
}
});
chocolate.setLabel("CHOCOLATE");
chocolate.setBounds(new Rectangle(135, 35, 90, 25));
chocolate.setForeground(Color.white);
chocolate.setBackground(new Color(162, 126, 12));
chocolate.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
chocolate_itemStateChanged(e);
}
});
vainilla.setLabel("VAINILLA");
vainilla.setBounds(new Rectangle(235, 35, 73, 23));
vainilla.setBackground(Color.yellow);
vainilla.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
vainilla_itemStateChanged(e);
}
});
this.getContentPane().add(vainilla, null); // se agregan los componentes
this.getContentPane().add(chocolate, null);
this.getContentPane().add(fresa, null);
}
// se invoca este mtodo en caso de que escojan fresa
private void fresa_itemStateChanged(ItemEvent e)
{
String sabor = "No hay de Fresa";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
sabor = "Rico helado de Fresa";
}
System.out.println( e.getItem() + " => " + sabor );

204

88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.

120.

}
// se invoca este mtodo en caso de que escojan chocolate
private void chocolate_itemStateChanged(ItemEvent e)
{
String sabor = "No hay de Chocolate";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
sabor = "Rico helado de Chocolate";
}
System.out.println( e.getItem() + " => " + sabor );
}
// se invoca este mtodo en caso de que escojan vainilla
private void vainilla_itemStateChanged(ItemEvent e)
{
String sabor = "No hay de Vainilla";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
sabor = "Rico helado de Vainilla";
}
System.out.println( e.getItem() + " => " + sabor );
}
public static void main( String args[] ) throws IOException
{
RicosHelados rh = new RicosHelados();
rh.setVisible( true );
System.out.println("da un teclazo para terminar!!!");
System.in.read();
}
} // fin de la clase RicosHelados

La seleccin o la no seleccin de un Checkbox es enviada a la interface ItemListener. El


ItemEvent esenviado conteniendo el mtodo getStatedChange(), el cual regresa
ItemEvent.DESELECTED o un
ItemEvent.SELECTED, segn sea el caso. El mtodo
getItem() regresa la etiqueta del objeto Checkbox como un String con la etiqueta que
representa a ese Checkbox.
11.2.3 CheckboxGroup - Botones de opcin
Los ChecboxGroup proveen el agrupamiento de mltiples elementos Checkbox como un
conjunto con exclusin mutua, de modo tal que un solo Checkbox en el conjunto tendr en
todo momento el valor de true .
El Checkbox con el valor true es el que actualmente este seleccionado. Se puede crear cada
Checkbox de un grupo usando el constructor que toma un argumento adicional, un
CheckboxGroup. Este objeto CheckboxGroup conecta el elemento Checkbox dentro del
conjunto. La apariencia de cada elemento Checkbox agregado a el grupo es convertido a un
botn de opcin o "botn de radio".
El siguiente ejemplo tenemos un contenedor JFrame con cuatro opciones AM, FM, TV, VIDEO
mutuamente excluyentes. Por default se establece como true a la opcin TV. Cuando el usuario
selecciona una de estas cuatro opciones se dispara el evento que escribe un mensaje por la
consola, ver figura.

205

Si quieres el cdigo de este programa dale clic aqu


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.

MiCheckboxGroup.zip

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.CheckboxGroup;
import java.awt.Checkbox;
import java.awt.Rectangle;
import java.io.*;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase CheckboxGroup.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: MiChecboxGroup.java
*/
public class MiCheckboxGroup extends JFrame
{
private CheckboxGroup cbg = new CheckboxGroup(); // se crea el CheckboxGroup
private Checkbox am = new Checkbox("AM",cbg, false); // constructores de los items
private Checkbox fm = new Checkbox("FM",cbg, false);
private Checkbox tv = new Checkbox("TV",cbg, true); // opcin seleccionada
private Checkbox video = new Checkbox("VIDEO",cbg, false);
public MiCheckboxGroup()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{

206

42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.

this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
this.setTitle("Botones de radio mutuamente excluyentes");
am.setBounds(new Rectangle(75, 85, 73, 23));
am.addItemListener(new ItemListener() // se agrega un oyente al Checkbox am
{
public void itemStateChanged(ItemEvent e) // si cambia su estado
{
am_itemStateChanged(e); // se dispara el evento por delegacin
}
});
fm.setBounds(new Rectangle(120, 85, 75, 25));
fm.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
fm_itemStateChanged(e);
}
});
tv.setBounds(new Rectangle(160, 85, 73, 23));
tv.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
tv_itemStateChanged(e);
}
});
video.setBounds(new Rectangle(205, 85, 73, 23));
video.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
video_itemStateChanged(e);
}
});
this.getContentPane().add(video, null); // se agregan los componetes al JFrame
this.getContentPane().add(tv, null);
this.getContentPane().add(fm, null);
this.getContentPane().add(am, null);
}
// se maneja el evento del Checkbox am
private void am_itemStateChanged(ItemEvent e)
{
String modo = "No hay AM";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
modo = "MODO AMPLITUD MODULADA";
}
System.out.println( e.getItem() + " => " + modo );
}
private void fm_itemStateChanged(ItemEvent e)
{
String modo = "No hay FM";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
modo = "MODO FRECUENCIA MODULADA";
}

207

106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.

138.

System.out.println( e.getItem() + " => " + modo );


}
private void tv_itemStateChanged(ItemEvent e)
{
String modo = "No hay TV";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
modo = "MODO TELEVISIN";
}
System.out.println( e.getItem() + " => " + modo );
}
private void video_itemStateChanged(ItemEvent e)
{
String modo = "No hay VIDEO";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
modo = "MODO VIDEO";
}
System.out.println( e.getItem() + " => " + modo );
}
public static void main( String args[] ) throws IOException
{
MiCheckboxGroup micbg = new MiCheckboxGroup();
micbg.setVisible( true );
System.out.println("da un teclazo para terminar!!!");
System.in.read();
System.out.println("Fin del programa");
} // fin del main()
} // fin de la clase MiCheckboxGroup

11.2.4 Choice
Un Choice es un componente que nos provee de una simple lista de seleccin de un elemento el cual
ser seleccionada una entrada.
Cuando se hace clic en el objeto Choice, este despliega una lista de elementos que pueden ser
aadidos a ella. Estos elementos agregados son objetos String.

208

Se hace uso de la interface ItemListener para observar los cambios en la lista Choice. Los detalles
del manejo del evento son los mismos que para el caso del Checkbox.
Es siguiente cdigo ejemplifica el uso de una lista Choice con elementos de algunas universidades en
Mxico ( ver figura anterior ) los cuales al seleccionarlos despliega texto por la consola y establece un
valor nuevo para la etiqueta.
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.

ChoiceUniversidades.zip

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Choice;
import java.awt.Rectangle;
import java.awt.Color;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.io.*;
import java.awt.Label;
import javax.swing.JTree;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase Choice.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ChoiceUniversidades.java
*/
public class ChoiceUniversidades extends JFrame
{
private static String escuela = null;
private Choice lista = new Choice(); // se crea la lista desplegable o Choice
private Label le = new Label();
public ChoiceUniversidades()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
} // fin del constructor
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(412, 134));
this.setTitle("Universidades Mexicanas de prestigio y renombre");
lista.setBounds(new Rectangle(90, 20, 175, 25));
lista.setBackground(Color.blue); // color de la lista
lista.setForeground(Color.yellow); // color de la letra en la lista
lista.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
lista_itemStateChanged(e);
}
});
le.setText("hola");

209

55.
le.setBounds(new Rectangle(10, 65, 380, 30));
56.
le.setBackground(Color.white);
57.
lista.addItem("UNAM"); // agregamos los elementos a la lista
58.
lista.addItem("IPN");
59.
lista.addItem("UAM");
60.
lista.addItem("CHAPINGO");
61.
lista.addItem("UVM");
62.
lista.addItem("UNITEC");
63.
this.getContentPane().add(le, null);
64.
this.getContentPane().add(lista, null); // agregamos la lista al JFrame
65.
66. }
67.
68.
public static void main( String args[] ) throws IOException
69.
{
70.
ChoiceUniversidades cu = new ChoiceUniversidades();
71.
cu.setVisible( true );
72.
System.out.println("da un teclazo para terminar!!!");
73.
System.in.read();
74.
System.out.println("Fin del programa");
75.
} // fin del main()
76.
77. // manejamos el evento de la lista Choice
78. private void lista_itemStateChanged(ItemEvent e)
79. {
80.
if( "UNAM".equals( e.getItem() ) ) // obtenemos el elemento seleccionado
81.
{
82.
escuela = new String("UNIVERSIDAD NACIONAL AUTNOMA DE MXICO");
83.
}
84.
else if ( "IPN".equals( e.getItem() ) )
85.
{
86.
escuela = new String("INSTITUTO POLITCNICO NACIONAL");
87.
}
88.
else if ( "UAM".equals( e.getItem() ) )
89.
{
90.
escuela = new String("UNIVERSIDAD AUTNOMA METROPOLITANA");
91.
}
92.
else if ( "CHAPINGO".equals( e.getItem() ) )
93.
{
94.
escuela = new String("UNIVERSIDAD DE CHAPINGO");
95.
}
96.
else if ( "UVM".equals( e.getItem() ) )
97.
{
98.
escuela = new String("UNIVERSIDAD DEL VALLE DE MXICO");
99.
}
100.
else if ( "UNITEC".equals( e.getItem() ) )
101.
{
102.
escuela = new String("UNIVERSIDAD TECNOLGICA DE MXICO");
103.
}
104.
105.
le.setText( escuela ); // establecemos nuevo valor a la etiqueta
106.
System.out.println("==> "+ escuela );
107. } // fin del metodo que maneja el evento
108.
} // fin de la clase ChoiceUniversidades

Un objeto Label despliega una lnea sencilla de texto esttico. El programa puede cambiar el texto
pero el usuario no. No hay bordes especiales u otra decoracin que sea usada para delinear un
Label. Recordaremos que en el programa de la seccin anterior 11.2.4 Choice utilizamos una Label
para cambia el texto de la etiqueta de acuerdo a al opcin que se eligiera en la lista Choice:
private Label le = new Label(); // se construye un objeto Label
le.setText("hola"); // se le asigna valor al objeto Label
le.setBounds(new Rectangle(10, 65, 380, 30)); // se le da una tamao

210

le.setBackground(Color.white); // color blanco de fondo para la etiqueta


this.getContentPane().add(le, null); // se agrega al JFrame
Un Label usualmente no espera que maneje eventos, pero lo puede hacer de la misma manera que un
Canvas. Si estos eventos son teclas pulsadas solo es posible mediante el llamado al mtodo
requestFocus().
11.2.5 Canvas
Un Canvas ( lienzo ) provee de un espacio en blanco o coloreado por cualquier color de fondo. Tiene
un tamao preferido de 0 por 0, a menos que se especifique un tamao usando setSize(). Para
especificar el tamao, hay que colocarlo en un administrador de diseo que especifique el tamao.
Se puede usar ese espacio para dibujar, escribir texto, o recibir del teclado o del ratn alguna entrada.
Para dibujar utilizamos ampliamente los mtodos de java.awt.Graphics. Generalmente un Canvas
adems de proveer de un espacio general para el dibujo nos proporciona un rea de trabajo para
personalizar un componente.
El Canvas puede "oir" todos los eventos que son aplicables a todo componente en general. En
particular , podra desearse agregar objetos como un KeyListener, MouseMotionListener, o un
MouseListener al mismo, para permitir la respuesta a algn tipo de entrada por parte del usuario.
Nota: Para recibir eventos de teclado en un Canvas , es necesario llamar al mtodo requestFocus() de
el Canvas. Si esto no es hecho , es generalmente imposible redireccionar las teclas pulsadas al
Canvas, En lugar de que las teclas pulsadas se pierdan enteramente en otro componente.
El siguiente ejemplo cambia el color del Canvas cada ves que una tecla es presionada.

Siquieres descargar el cdigo de este programas, dale clic aqu CanvasLienzo.zip


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.

package mypackage1;
import java.io.*;
import java.awt.event.*;
import java.awt.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase Canvas. Con eventos del teclado
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CanvasLienzo.java
*/
public class CanvasLienzo extends Canvas implements KeyListener
{
private int index;
Color colores[] = { Color.red, Color.green, Color.blue };
public void paint( Graphics g )

211

19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.

{
g.setColor( colores[ index ] );
g.fillRect( 0, 0, getSize().width, getSize().height );
}
// Metodos para manejo de eventos del teclado
public void keyTyped( KeyEvent ke )
{
index++;
if ( index == colores.length )
{
index = 0;
}
repaint();
}
// Metodos de teclado no utilizados en este programa
public void keyPressed( KeyEvent ke ) { }
public void keyReleased( KeyEvent ke ) { }

public static void main( String args[] ) throws IOException


{
Frame f = new Frame("Esto es un Canvas o Lienzo");
CanvasLienzo cl = new CanvasLienzo();
cl.setSize(150, 150 );
f.setLayout( new BorderLayout() );
f.add( cl, BorderLayout.CENTER );
cl.requestFocus(); //solicitud del foco o enfoque
cl.addKeyListener( cl );
f.pack();
f.setVisible( true );
} // fin del main()
50. } // fin de la clase CanvasLienzo

11.2.6 TextField
Un objeto TextField es una lnea simple de texto en un cuadro de entrada, por ejemplo:

debido a que solo puede tener una lnea, un ActionListener puede ser informado, usando
actionPerformed(), cuando la tecla del Enter o Return sea presionada. Puede agregar otros
componentes oyentes si as lo desea.
Se puede utilizar el componente TextField para enmascarar teclas como en el caso de una contrasea
o para ignorar algunas teclas del teclado. El siguiente ejemplo crea el cdigo para que el campo de
texto Nombre ignore los dgitos y que la contrasea aparezca enmascarada con un asterisco.

212

Si quieres el cdigo de este programa dale clic aqu


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.

ComponenteTextField.zip

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.TextField;
import java.awt.Rectangle;
import java.awt.Label;
import java.awt.event.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase TextField.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ComponenteTextField.java
*/
public class ComponenteTextField extends JFrame
{
// se construyen los campos de texto
private TextField tfnombre = new TextField("Nombre del Web");
private TextField tfurl = new TextField( );
private TextField tfpassw = new TextField( );
// se construyen sus etiquetas
private Label labnombre = new Label("Nombre:");
private Label laburl = new Label();
private Label labpassw = new Label();
public ComponenteTextField()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
} // fin del constructor
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null); // layout por default
this.setSize(new Dimension(388, 220)); // dimensin del JFrame
this.setTitle("Ejemplo del componente TextField"); // titulo del JFrame
tfnombre.setBounds(new Rectangle(160, 20, 180, 25)); // tamao del TextField
tfnombre.addKeyListener ( new QuitaDigitos() ); // quita los digitos al campo tfnombre
tfurl.setText("URL del Web"); // su texto por default
tfurl.setBounds(new Rectangle(160, 65, 150, 25));
tfpassw.setBounds(new Rectangle(160, 115, 145, 30));
tfpassw.setEchoChar('*'); // caracter de enmascaramiento
labnombre.setBounds(new Rectangle(25, 20, 130, 30));
laburl.setText("Direccin o URL:");
laburl.setBounds(new Rectangle(25, 65, 100, 30));
labpassw.setText("Contrasea:");
labpassw.setBounds(new Rectangle(25, 115, 100, 30));
// se agregan los componentes
this.getContentPane().add(labpassw, null);
this.getContentPane().add(laburl, null);
this.getContentPane().add(labnombre, null);
this.getContentPane().add(tfpassw, null);
this.getContentPane().add(tfurl, null);
this.getContentPane().add(tfnombre, null);

213

63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.

}
class QuitaDigitos extends KeyAdapter
{
public void keyPressed( KeyEvent e )
{
char c = e.getKeyChar();
if ( Character.isDigit( c ) )
{
e.consume();
}
}
} // fin de la clase interna QuitaDigitos
public static void main( String args[] )
{
ComponenteTextField ctf = new ComponenteTextField();
ctf.setVisible( true );
System.out.println("Fin del programa");
} // fin del main()

84. } // fin de la clase ComponenteTextField

11.2.7

TextArea

Una TextArea "rea de texto" es un objeto para manejar texto capturado desde el un dispositivo de
entrada y este puede manejar mltiples lneas y mltiples columnas. Se puede establecer ue sea de
solo lectura, usando el mtodo setEditable( boolean ). Este desplegar unas barras de
deslizamiento verticales y horizontales.

El oyente se puede especificar con addTextListener() el cual recibe la notificacin de las teclas
pulsadas de la misma manera que lo hace un TextField.
Se puede en agregar oyentes en general, a una rea de texto, pero debido a que es multilnea , el
presionar la tecla de Enter pone otro caracter en el buffer. Si se necesita reconocer "una entrada
completa" , se puede poner un botn de aplicar o Enviar seguido del rea de texto para permitir al
usuario indicar esto.
Si quieres el cdigo de este programa dale clic aqu
1.

TextAreaPersona.zip

package mypackage1;

214

2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.

import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Label;
import java.awt.Rectangle;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.lang.String;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase TextArea. Utiliza una clase llamada
* Persona que esta en el mismo paquete
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: TextAreaPersona.java
*/
public class TextAreaPersona extends JFrame
{
private Label labNombre = new Label();
private Label labEdad = new Label();
private Label labPeso = new Label();
private TextField tfNombre = new TextField();
private TextField tfEdad = new TextField();
private TextField tfPeso = new TextField();
private TextArea ta = new TextArea(); // se construye un TextArea
private String texto = null;
public TextAreaPersona()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(363, 374));
this.setTitle("Ejemplo de una TextArea");
// etiquetas
labNombre.setBounds(new Rectangle(40, 5, 50, 30));
labNombre.setText("Nombre:");
labEdad.setText("Edad:");
labEdad.setBounds(new Rectangle(40, 50, 60, 30));
labPeso.setText("Peso:");
labPeso.setBounds(new Rectangle(40, 90, 110, 30));
tfNombre.setBounds(new Rectangle(95, 10, 185, 25));
tfEdad.setBounds(new Rectangle(95, 50, 185, 25));
tfPeso.setBounds(new Rectangle(95, 90, 185, 25));
tfPeso.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
tfPeso_actionPerformed(e);
}

215

66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.

});
texto = new String( "*** datos introducidos ***\n");
ta.setText( texto ); // establece texto inicial al TextArea
ta.setBounds(new Rectangle(70, 130, 220, 200)); // dimensin del TextArea.
ta.setEditable(false); // se inhibe la entrada por teclado al TextArea
this.getContentPane().add(ta, null);
this.getContentPane().add(tfPeso, null);
this.getContentPane().add(tfEdad, null);
this.getContentPane().add(tfNombre, null);
this.getContentPane().add(labPeso, null);
this.getContentPane().add(labEdad, null);
this.getContentPane().add(labNombre, null);
}
private void tfPeso_actionPerformed(ActionEvent e)
{ // construyo una persona con los valores de los TextField
Persona pe = new Persona( tfNombre.getText(),
tfEdad.getText(),
tfPeso.getText() );
texto += tfNombre.getText() + "\n";
texto += tfEdad.getText() + "\n";
texto += tfPeso.getText() + "\n\n";
texto += "ahora con toString() \n";
texto += pe.toString();
// se agregan estos valores al TextArea
ta.setText( texto );
}

public static void main( String args[] )


{
TextAreaPersona tap = new TextAreaPersona();
tap.setVisible( true );
System.out.println("Fin del programa");
} // fin del main()
102.
} // fin de la clase TextAreaPersona

1. package mypackage1;
2. /**
3.
* Programa de Java que utiliza TextAreaPersona.
4.
* @autor Oscar A. Gonzlez Bustamante
5.
* @version 1.0
6.
* Archivo: Persona.java
7.
*/
8. class Persona {
9.
String nombre;
10.
String
edad;
11.
String peso;
12.
13.
Persona( String nom, String edad, String peso) {
14.
nombre = nom;
15.
this.edad = edad;
16.
this.peso = peso;
17.
} // fin del constructor
18.
19.
Persona () { }
20.
21.
public String toString() {
22.
String s = new String ( "Nombre: " + nombre + "\n" +

216

23.
"Edad: " + edad + "\n" +
24.
"Peso: " + peso + "\n" );
25.
return s;
26.
}
27.
28. } // fin de la clase Persona
11.2.8 List
Una List es una "lista" que presenta varias opciones de texto que son desplegadas en una rea que
permite seleccionar varios elementos al mismo tiempo y es posible recorrerla mediante barras de
desplazamiento.

El numero de argumentos del constructor define el tamao preferido de la lista en trminos del
nmero de renglones visibles. Como ha de suponerse un administrador de diseo "Layout" puede
sobreescribir este valor. El argumento booleano indica que la lista debe permitir al usuario hacer
mltiples selecciones.
Cuando un elemento es seleccionado o deseleccionado de la lista, java.awt enva una instancia de
ItemEvent a la lista. Cuando el usuario hace doble clic sobre el elemento en una lista desplazable, un
ActionEvent es generado por la lista en modo de seleccin simple y en modo de seleccin mltiple.
Los elementos son seleccionados desde la lista de acuerdo a las convenciones de la plataforma. Para
un entorno UNIX Motif , un simple clic ilumina una entrada de la lista , pero debe hacerse doble clic
para disparar la accin de la lista.
El siguiente ejemplo muestra una lista con platillos mexicanos que al seleccionarlos despliega por la
consola lo que el comensal quiere comer:
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

ListEj.zip

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.List;
import java.awt.Rectangle;
import java.awt.Color;
import java.awt.Label;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
/**
* Programa de Java que te ensea a utilizar componentes

217

12. * del paquete java.awt. Este demuestra el uso de los


13. * objetos de la clase List.
14. * @autor Oscar A. Gonzlez Bustamante
15. * @version 1.0
16. * Archivo: ListEj.java
17. */
18. public class ListEj extends JFrame
19. {
20. private List lis = new List(); // se instancia la lista
21. private Label lab = new Label();
22. private String comida = null;
23.
24. public ListEj()
25. {
26.
try
27.
{
28.
jbInit();
29.
}
30.
catch(Exception e)
31.
{
32.
e.printStackTrace();
33.
}
34.
35. }
36.
37. private void jbInit() throws Exception
38. {
39.
this.getContentPane().setLayout(null);
40.
this.setSize(new Dimension(226, 169));
41.
this.setTitle("Ejemplo de una List");
42.
lis.setBounds(new Rectangle(60, 25, 100, 85)); //tamao de la lista
43.
lis.setBackground(Color.orange); // color de fondo de la lista
44.
lis.setForeground(Color.blue); // color de la letra de la lista
45.
lis.setMultipleMode( false ); // modo de multiples opciones a escoger
46.
lis.addActionListener(new ActionListener()
47.
{
48.
public void actionPerformed(ActionEvent e)
49.
{
50.
lis_actionPerformed(e);
51.
}
52.
});
53.
lab.setText("Rica comida mexicana ummm rico!");
54.
lab.setBounds(new Rectangle(35, 5, 175, 25));
55.
lis.add("Tacos"); // se agregan los elementos a la lista
56.
lis.add("Chiles Enogada");
57.
lis.add("Tortas");
58.
lis.add("Enchiladas");
59.
lis.add("Sopes");
60.
lis.add("Pambazos");
61.
lis.add("Tamales");
62.
lis.add("Burritos");
63.
this.getContentPane().add(lab, null);
64.
this.getContentPane().add(lis, null);
65. }
66.
67.
public static void main( String args[] )
68.
{
69.
ListEj le = new ListEj();
70.
le.setVisible( true );
71.
System.out.println("Fin del programa");
72.
} // fin del main()
73.
74. // se maneja el evento de la lista
75. private void lis_actionPerformed(ActionEvent e)

218

76.
77.
78.
79.
80.

{
System.out.println("Yo quiero comer: " + e.getActionCommand() );
}

81. } //fin de la clase ListEj


11.2.9 Dialog
Un Dialog es un componente asociado con un Frame. Este es una ventana con algunas
decoraciones. Difiere de un Frame en que estas pocas decoraciones son provistas y pueden ser
requeridas en un dialogo en estado "modal", el cual causa el almacenamiento de todas las formas de la
entrada mientras es cerrado.
Un Dialog tambin puede trabaja en estado "no modal" . Un estado no modal en un Dialog significa
que se puede interactuar tanto con el Frame y el Dialog al mismo tiempo. Un Dialog en estado
modal boquea la entrada a el resto de la aplicacin incluyendo el Frame, hasta que el Dialog sea
cerrado.
Este es elFrame

Al dar clic en el botn Insertar aparece elDialog Insertar

Debido a que el Dialog es una subclase de Window, su administrador de diseo por omisin es
BorderLayout.
El siguiente ejemplo muestra ampliamente el uso de la clase Dialog. Es una aplicacin sencilla que
utiliza manejo de base de datos con Java ( ver seccin 12.1.5 Ejemplo JDBC-ODBC con AWT y Access)
Si quieres el cdigo y la bd de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

DatosPersonales.zip

import java.awt.*;
import java.sql.*;
import java.awt.event.*;
class DatosPersonales extends Frame
implements ActionListener
{ Button crear, ver, insertar, cerrar;
TextField informacion;
Panel principal;

219

11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.

Connection conexion;
DatosPersonales()
{ super("Datos personales");
setSize(200,120);
principal=new Panel();
crear=new Button ("Crear");
crear.addActionListener(this);
ver=new Button ("Ver");
ver.addActionListener(this);
insertar=new Button("Insertar");
insertar.addActionListener(this);
cerrar=new Button("Cerrar");
cerrar.addActionListener(this);
informacion=new TextField(20);
principal.add(informacion);
principal.add(crear);
principal.add(insertar);
principal.add(ver);
principal.add(cerrar);
addWindowListener(new Cerrar());
principal.setBackground(SystemColor.control);
add(principal);
setVisible(true);
try
{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}
catch(ClassNotFoundException e)
{ informacion.setText("No se pudo cargar el controlador JDBC-ODBC");}
}
private void Crear_tabla()
{ Statement sentencia;
try
{
conexion=DriverManager.getConnection("jdbc:odbc:Personal");
sentencia=conexion.createStatement();
try
{
sentencia.executeUpdate("DROP TABLE DATOSPERSONALES");
}
catch(SQLException e){informacion.setText("Error al crear la tabla");
System.out.println(e);}
sentencia.executeUpdate("CREATE TABLE DATOSPERSONALES("+
"NOMBRE CHAR(20) NOT NULL,"+
"APELLIDOS CHAR(20),"+
"EDAD CHAR(3),"+
"TELEFONO CHAR(10))");
informacion.setText("Tabla creada");
conexion.close();
}
catch(SQLException e){}
}

public void actionPerformed(ActionEvent e)


{ String com=e.getActionCommand();
if ("Crear".equals(com))

220

75.
{ informacion.setText("");
76.
Crear_tabla();}
77.
else
78.
if ("Insertar".equals(com))
79.
{ new Insertar(this);
80.
}
81.
else
82.
if ("Ver".equals(com))
83.
{
84.
new Ver(this);
85.
}
86.
87.
else
88.
{dispose();System.exit(0);}
89. }
90.
91.
92. class Cerrar extends WindowAdapter
93. { public void windowClosing(WindowEvent e)
94. { dispose();
95.
System.exit(0);
96. }
97. }
98.
99. public static void main(String args[])
100. { new DatosPersonales();}
101.
102. }
103.
104.
105. class Insertar extends Dialog implements ActionListener
106. {
107. private Connection conexion;
108. private Button incluir,terminar;
109. private TextField nombre,apellidos,edad,telefono;
110. Insertar(Frame f)
111. { // constructor f es el Frame dueo del Dialog
112. super(f,"Insertar datos",true);
113. setSize(310,160);
114. nombre=new TextField(20);
115. apellidos=new TextField(20);
116. edad=new TextField(3);
117. telefono=new TextField(10);
118.
119. incluir=new Button("Incluir");
120. incluir.addActionListener(this);
121.
122. terminar=new Button("Terminar");
123. terminar.addActionListener(this);
124.
125.
126.
127. Panel P_Datos=new Panel();
128. P_Datos.add(new Label("Nombre : "));
129. P_Datos.add(nombre);
130. P_Datos.add(new Label("Apellidos: "));
131. P_Datos.add(apellidos);
132. P_Datos.add(new Label("Edad
: "));
133. P_Datos.add(edad);
134. P_Datos.add(new Label("Telefono : "));
135. P_Datos.add(telefono);
136. P_Datos.add(incluir);
137. P_Datos.add(terminar);
138.

221

139.
140. nombre.setEditable(true);
141. apellidos.setEditable(true);
142. edad.setEditable(true);
143. telefono.setEditable(true);
144.
145. add(P_Datos);
146. setVisible(true);
147.
148.
149.
150. }
151. private void insertar_fila()
152. { Statement sentencia;
153. try{
154. conexion=DriverManager.getConnection("jdbc:odbc:Personal");
155. sentencia=conexion.createStatement();
156. sentencia.executeUpdate("INSERT INTO DATOSPERSONALES"+
157.
" VALUES ('"+nombre.getText()+"',"+
158.
"'"+apellidos.getText()+"',"+
159.
"'"+edad.getText()+"',"+
160.
"'"+telefono.getText()+"')");
161.
162. }
163. catch(SQLException e){}
164. }
165.
166. public void actionPerformed(ActionEvent e)
167. { String com=e.getActionCommand();
168. if ("Incluir".equals(com))
169.
{insertar_fila();
170.
nombre.setText("");
171.
apellidos.setText("");
172.
edad.setText("");
173.
telefono.setText("");
174.
}
175.
else
176.
{
177.
if(conexion!=null)
178.
{
179.
try
180.
{
181.
conexion.close();
182.
}
183.
catch(SQLException ex){}
184.
}
185.
dispose();
186.
}
187. }
188. }
189.
190.
191.
192.
193. class Ver extends Dialog
194. implements ActionListener
195. {
196. private Connection conexion;
197. private ResultSet resultado;
198. private Button siguiente,terminar;
199. private TextField nombre,apellidos, edad,telefono;
200. Ver(Frame f)
201. { // constructor f es el Frame dueo del Dialog
202. super(f,"Ver datos",true);

222

203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.

setSize(310,160);
nombre=new TextField(20);
apellidos=new TextField(20);
edad=new TextField(3);
telefono=new TextField(10);
siguiente=new Button("Siguiente");
siguiente.addActionListener(this);
terminar=new Button("Terminar");
terminar.addActionListener(this);
Panel P_Datos=new Panel();
P_Datos.add(new Label("Nombre : "));
P_Datos.add(nombre);
P_Datos.add(new Label("Apellidos: "));
P_Datos.add(apellidos);
P_Datos.add(new Label("Edad
: "));
P_Datos.add(edad);
P_Datos.add(new Label("Telefono : "));
P_Datos.add(telefono);
P_Datos.add(siguiente);
P_Datos.add(terminar);
add(P_Datos);
nombre.setEditable(false);
apellidos.setEditable(false);
edad.setEditable(false);
telefono.setEditable(false);
mostrar();
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{ String com=e.getActionCommand();
if ("Siguiente".equals(com))
siguiente();
else
{
if (conexion!=null)
{
try
{
conexion.close();
}
catch(SQLException ex){}
}
dispose();
}
}
private void mostrar()
{
Statement sentencia;
try{
conexion=DriverManager.getConnection("jdbc:odbc:Personal");
sentencia=conexion.createStatement();
resultado=sentencia.executeQuery("SELECT * FROM DATOSPERSONALES");
siguiente();
}

223

267. catch(SQLException e){}


268. }
269.
270. private void ver_Datos()
271. { try
272. {
273. nombre.setText(resultado.getString("NOMBRE"));
274. apellidos.setText(resultado.getString("APELLIDOS"));
275. edad.setText(resultado.getString("EDAD"));
276. telefono.setText(resultado.getString("TELEFONO"));
277. }
278. catch (SQLException e){}
279. }
280.
281. private void siguiente()
282. { try
283. {
284. if (resultado.next()) ver_Datos();
285. }
286. catch(SQLException e){}
287. catch(Exception ex){}
288. }
289.
290. }

291.

El primer argumento en el constructor de Dialog designa si el dueo del Dialog que esta siendo
construido. En el Ejemplo previo, f es el Frame al que pertenece el Dialog.
Un Dialog generalmente no se hace visible a el usuario cuando es creado. Este se desplegar en
respuesta a alguna accin del usuario sobre la interface, tal como presionar un botn.
Para ocultar un Dialog, podemos invocar al mtodo
setVisible ( false ). Se hace esto aadiendo un WindowListener a el y esperando una llamada a
el mtodo WindowClosing() en dicho oyente.
11.2.10 FileDialog
Un FileDialog es una implementacin de un dispositivo para la seleccin de un archivo. Este tiene su
propio ventana, la cual permite al usuario navegar dentro del sistema de archivos del sistema y
seleccionar un archivo en particular para subsecuentes operaciones, por ejemplo:

224

En general no es necesario manejar eventos de un FileDialog. La invocacin al mtodo setVisible(


true ) bloquea los eventos hasta que el usuario seleccione el botn de Aceptar, de tal manera que el
nombre del archivo que seleccion sea requerido. Esta informacin es regresada como un String.
El siguiente programa crea un JFrame y este invoca al FileDialog al dar clic al botn.
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.

Frame2JDev.zip

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Button;
import java.awt.Rectangle;
import java.awt.FileDialog;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase FileDialog.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Frame2JDev.java
*/
public class Frame2JDev extends JFrame
{
private Button boton = new Button(); //se crea el botn
ArchivoDialogo ad; //se hace una referencia a la clase con el FileDialog
public Frame2JDev()
{
try
{
jbInit();
}
catch(Exception e)

225

30.
{
31.
e.printStackTrace();
32.
}
33. }
34.
35. private void jbInit() throws Exception
36. {
37.
this.getContentPane().setLayout(null);
38.
this.setSize(new Dimension(309, 191));
39.
this.setTitle("Esto es el Frame padre");
40.
this.setLocation( 150, 150 ); // colocar Frame en esa posicin
41.
ad = new ArchivoDialogo( this ,"Un FileDialog" ); // Clase con un FileDialog
42.
boton.setLabel("Abrir el FileDialog"); //se le da una etiqueta
43.
boton.setBounds(new Rectangle(70, 45, 115, 55)); // se le da una dimensin al boton
44.
boton.addActionListener(new ActionListener() // agregamos un oyente al botn
45.
{
46.
public void actionPerformed(ActionEvent e)
47.
{
48.
button1_actionPerformed(e); // si le dan clic al botn se dispara el evento
49.
}
50.
});
51.
this.getContentPane().add(boton, null); // se agrega el botn al contenedor
52. }
53.
54. private void button1_actionPerformed(ActionEvent e)
55. {
56.
ad.setLocation( 250, 250 ); // colocar el FileDialog en esa posicin
57.
ad.setVisible( true ); // hace visible el FileDialog
58.
// obtiene la ruta seleccionada en el FileDialog
59.
String archnom = ad.getDirectory() + ad.getFile();
60.
System.out.println("Ruta: " + archnom );
61. }
62.
63.
public static void main( String args[] ) throws IOException
64.
{
65.
Frame2JDev f = new Frame2JDev();
66.
f.setVisible( true );
67.
System.out.println("da un teclazo!!!");
68.
System.in.read();
69.
} // fin del main()
70.
71. } // fin de la clase Frame2Dev

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.AWTEvent;
import java.awt.event.WindowEvent;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase FileDialog.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ArchivoDialogo.java
*/
public class ArchivoDialogo extends FileDialog
{
/**
*

226

20.
* @param parent
21.
* @param title
22.
* @param modal
23.
*/
24. public ArchivoDialogo(JFrame parent, String title )
25. {
26.
super(parent, title);
27.
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
28.
try
29.
{
30.
jbInit();
31.
}
32.
catch(Exception e)
33.
{
34.
e.printStackTrace();
35.
}
36.
37. }
38.
39. private void jbInit() throws Exception
40. {
41.
this.setSize(new Dimension(400, 300)); // 400 x 300 para el FileDialog
42.
this.setLayout(null);
43. }
44.
45. /**
46.
*
47.
* @param e
48.
*/
49. protected void processWindowEvent(WindowEvent e)
50. {
51.
if (e.getID() == WindowEvent.WINDOW_CLOSING)
52.
{
53.
cancel();
54.
}
55.
super.processWindowEvent(e);
56. }
57.
58. void cancel()
59. {
60. }
61. } // fin de ArchivoDialogo

11.2.11 ScroollPane
Un ScroollPane provee de un contenedor general que no puede ser usado como un componente
libre. Siempre esta asociado con un contenedor ( por ejemplo, un Frame ) . Provee un rea de
visualizacin dentro de una regin grande y con barras de deslizamiento para manipularla.

El ScroollPane crea y maneja las barras de desplazamiento y las contiene en un solo componente.
No es posible controlar el administrador de diseo que usa, en lugar de esto se puede agregar a un

227

Panel para que el scrooll pane , configure el administrador de diseo, y coloque los componentes en
dicho panel.
Generalmente , no es posible manejar eventos en un ScroollPane; los eventos son manejados a
travs de los componentes que se contengan.
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.

PruebaSeleccionMultiple.zip

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase JScrollPane.
* Este programa fue recopilado y modificado del libro:
* Java Como programar. - Deitel & Deitel 5ta edicin.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: PruebaSeleccionMultiple.java
*/
public class PruebaSeleccionMultiple extends JFrame {
private JList listaColores, listaCopia;
private JButton botonCopiar;
private final String nombresColores[] = { "Negro", "Azul", "Cyan",
"Gris oscuro", "Gris", "Verde", "Gris claro", "Magenta", "Naranja",
"Rosa", "Rojo", "Blanco", "Amarillo" };
// configurar GUI
public PruebaSeleccionMultiple()
{
super( "Listas de seleccin mltiple" );
// obtener panel de contenido y establecer su esquema
Container contenedor = getContentPane();
contenedor.setLayout( new FlowLayout() );
// establecer objeto JList listaColores
listaColores = new JList( nombresColores );
listaColores.setVisibleRowCount( 5 );
listaColores.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
contenedor.add( new JScrollPane( listaColores ) );
// crear botn copiar y registrar su componente de escucha
botonCopiar = new JButton( "Copiar >>>" );
botonCopiar.addActionListener(
new ActionListener() { // clase interna annima
// manejar evento de botn
public void actionPerformed( ActionEvent evento )
{
// colocar valores seleccionados en listaCopia
listaCopia.setListData( listaColores.getSelectedValues() );
}
} // fin de clase interna annima
); // fin de la llamada a addActionListener
contenedor.add( botonCopiar );

228

56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76. }

// establecer objeto JList listaCopia


listaCopia = new JList( );
listaCopia.setVisibleRowCount( 5 );
listaCopia.setFixedCellWidth( 100 );
listaCopia.setFixedCellHeight( 15 );
listaCopia.setSelectionMode(
ListSelectionModel.SINGLE_INTERVAL_SELECTION );
contenedor.add( new JScrollPane( listaCopia ) );
setSize( 325, 130 );
setVisible( true );
} // fin del constructor PruebaSeleccionMultiple
public static void main( String args[] )
{
PruebaSeleccionMultiple aplicacion = new PruebaSeleccionMultiple();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
// fin de la clase PruebaSeleccionMultiple

77.

11.2.12 MenuBar
Un Menu es un componente diferente a otros componentes porque no se puede agregar a un Menu a
los contenedores comunes. Solo se puede agregar mens a un "menu container". Se puede comenzar
un rbol de men poniendo un MenuBar "una barra de men" en un Frame, usando el mtodo
setMenuBar(). Desde este punto, se pueden agregar mens a la barra de men y mens o
elementos de men dentro del men.

Los mens Pop-up son una excepcin porque estos aparecen como ventanas flotantes y no requieren
un administrador de diseo, pero es importante agregar el menu Pop-up al contenedor padre, de lo
contrario no funciona.
Los Help menu ( mens de Ayuda ) pueden ser implementados en un MenuBar mediante el uso del
mtodo setHelpMenu( Menu ). Se debe agregar el men a ser tratado como un Help menu a la
barra de menu; entonces ser tratado en la misma forma que un Help menu para la plataforma en que
se este trabajando. Para X/Motif-type systems, este ser colocado como una entrada de men al final

229

derecho de la barra de men.


El siguiente programa maneja estos diversos tipos de menus y al ejecutarlo despliega un JFrame con
un N , y un Help menu. Al darle clic al botn desplegar un men popupMenu.
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.

PopUpMenu.zip

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Button;
import java.awt.Rectangle;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.PopupMenu;
import java.awt.MenuItem;
import java.awt.Font;
import java.awt.Color;
import java.awt.MenuBar;
import java.awt.Menu;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase PopupMenu.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: PopUpMenu.java
*/
public class PopUpMenu extends JFrame {
String [] elementos = {"Nuevo", "Abrir","Re Abrir","Eliminar", "Guardar", "Cargar", "Salir" };
private Button b = new Button();
private PopupMenu popupMenu1 = new PopupMenu(); // se instancia un PopupMenu
private MenuItem menuItem1 = new MenuItem(); // se instancian los elementos
private MenuItem menuItem2 = new MenuItem(); // del PopupMenu
private MenuItem menuItem3 = new MenuItem();
private MenuItem menuItem4 = new MenuItem();
private MenuItem menuItem5 = new MenuItem();
private MenuItem menuItem6 = new MenuItem();
private MenuBar menuBar1 = new MenuBar();
private Menu a = new Menu ( "Archivo");
private Menu e = new Menu ( "Editar");
private Menu h = new Menu ( "Ayuda" );
public PopUpMenu()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 282));
this.setTitle("Un Pop up Men");
this.setBackground(Color.blue);

230

57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.

b.setLabel("dame clic y vers!");


b.setBounds(new Rectangle(80, 60, 195, 65));
b.setActionCommand("dame clic y vers! ");
b.setFont(new Font("Tahoma", 1, 16));
b.addActionListener(new ActionListener() // oyente al botn
{
public void actionPerformed(ActionEvent e)
{
b_actionPerformed(e);
}
});
popupMenu1.setLabel("Un popup"); // se establecen las etiquetas
menuItem1.setLabel( elementos[0] );
menuItem2.setLabel( elementos[1] );
menuItem3.setLabel( elementos[2] );
menuItem4.setLabel( elementos[3] );
menuItem5.setLabel( elementos[4] );
menuItem6.setLabel( elementos[5] );
popupMenu1.addActionListener( new ActionListener() // oyente al botn para el poppupMenu
{
public void actionPerformed(ActionEvent e)
{
popupMenu1_actionPerformed(e);
}
});
this.getContentPane().add(b, null); // se agrega el botn al contenedor
popupMenu1.add(menuItem1);
popupMenu1.add(menuItem2);
popupMenu1.add(menuItem3);
popupMenu1.add(menuItem4);
popupMenu1.add(menuItem5);
popupMenu1.add(menuItem6);
menuBar1.add( a ); // se agrega el menu Archivo al MenuBar
menuBar1.add( e ); // sea agrega el menu Editar al MenuBar
menuBar1.setHelpMenu( h ); // agrega un menu de ayuda al MenuBar
// agregar el PopupMenu al Contendor padre JFrame si no no funciona
// al agregarlo tambien se agregan todos sus items.
this.getContentPane().add(popupMenu1);
}
public static void main( String args[] )
{
PopUpMenu pum = new PopUpMenu();
pum.setVisible( true ); // hace visible al JFrame
pum.setMenuBar( pum.menuBar1 );
System.out.println("Fin del programa");
} // fin del main()
private void b_actionPerformed(ActionEvent e)
{
popupMenu1.show( b , 70, 70); // muestra PopupMenu
}
private void popupMenu1_actionPerformed(ActionEvent e)
{
String item = null;
int i;
// maneja el evento de ver cual MenuItem fue seleccionado.
for ( i=0; i < elementos.length; ++i )
if ( e.getActionCommand().equals( elementos[i] ) )

231

121.
122.
123.
124.
125.

126.

item = new String ( elementos[i] );


System.out.println("comando: " + item );
}
} // fin de la clase PopUpMenu

11.2.12.1 Creando un MenuBar


(fecha de ltima modificacin de sta pgina:

11.2.12.1 Creando un MenuBar


Un componente MenuBar es un men horizontal. Puede solamente agregarse a un objeto Frame, y
forma la raz de todos los rboles men. Un Frame despliega un MenuBar a la vez. Sin embargo ,
se pueden cambiar el MenuBar en base al estado de el programa as que diferentes mens pueden
aparecer en distintos puntos; por ejemplo:

El MenuBar no soporta oyentes. Como parte normal del comportamiento de un men, los eventos
anticipados que ocurran en la regin de la barra de men son procesados automticamente.
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.

CreandoMenuBar.zip

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.MenuBar;
import java.awt.Menu;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase MenuBar.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CreandoMenuBar.java
*/
public class CreandoMenuBar extends JFrame
{
private MenuBar mb1 = new MenuBar(); // se crea un objeto MenuBar
private Menu menu1 = new Menu(); // se crea un objeto Menu
public CreandoMenuBar()
{
try
{
jbInit();
}
catch(Exception e)
{

232

28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.

e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
this.setTitle("Creando Un Menu Bar");
mb1.setName( "Soy un MenuBar");
// se hace esto para que aparezca la barra de menu vacia
menu1.setLabel(" ");
mb1.add(menu1);
}
public static void main( String args[] )
{
CreandoMenuBar cmb = new CreandoMenuBar();
cmb.setMenuBar( cmb.mb1 ); // se agrega el MenuBar al JFrame
cmb.setVisible ( true );
} // fin del main()

51. } // fin de la clase CreandoMenuBar

Es posible crear entradas a una barra de men agregando objetos de la clase Menu. Los
componentes Menu proveen a la barra de men elementos de tipo men pull-down " mens
desplegables ".

private MenuBar mb1 = new MenuBar();


private Menu a = new Menu ( "Archivo");
private Menu e = new Menu ( "Editar");
private Menu h = new Menu ( "Ayuda" );
mb1.add( a ); // se agrega el menu Archivo al MenuBar
mb1.add( e ); // sea agrega el menu Editar al MenuBar
mb1.setHelpMenu( h ); // agrega un menu de ayuda al MenuBar

Puede agregarse un ActionListener a un objeto Menu, pero este es poco comn. Normalmente, se
usan mens para desplegar y controlar los mens items, " elementos de men " los cuales son
descritos en la siguiente seccin.
11.2.12.2 Creando un MenuItem
Un componente MenuItem son los nodos hoja de una rbol de men. Son agregados a un men
para completarlo; por ejemplo:

233

Si quieres el cdigo de este programa dale clic aqu


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.

CreandoMenuItem.zip

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.MenuBar;
import java.awt.Menu;
import java.awt.MenuItem;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase MenuItem.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CreandoMenuItem.java
*/
public class CreandoMenuItem extends JFrame
{
private MenuBar mb1 = new MenuBar(); // se crea un objeto MenuBar
private Menu a = new Menu("Archivo"); // se crean objetos Menu
private Menu e = new Menu("Editar");
private Menu h = new Menu("Ayuda");
MenuItem mi1 = new MenuItem("Nuevo"); // se crean objetos MenuItem
MenuItem mi2 = new MenuItem("Guardar");
MenuItem mi3 = new MenuItem("Cargar");
MenuItem mi4 = new MenuItem("Salir");
public CreandoMenuItem()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
this.setTitle("Creando Un Menu Bar");
mb1.setName( "Soy un MenuBar");
// se hace esto para que aparezca la barra de menu vacia
mb1.add( a ); // se agregan los objetos Menu al MenuBar
mb1.add( e );

234

48.
mb1.setHelpMenu( h ); // se agrega el objeto menu Help a MenuBar
49.
a.add( mi1 ); // agregando los objetos MenuItem al objeto Menu
50.
a.add( mi2 );
51.
a.add( mi3 );
52.
a.addSeparator(); // agrega un separador entre los MenuItem
53.
a.add( mi4 );
54. }
55. public static void main( String args[] )
56. {
57.
CreandoMenuItem cmi = new CreandoMenuItem();
58.
cmi.setMenuBar( cmi.mb1 ); // se agrega el MenuBar al JFrame
59.
cmi.setVisible ( true );
60.
61. } // fin del main()
62. } // fin de la clase CreandoMenuItem

Usualmente , puede agregarse un ActionListener a un objeto MenuItem para proveerle


comportamiento a los mens.
11.2.12.3 Creando un CheckboxMenuItem
Un CheckboxMenuItem es un elemento de men que puede ser verificado, as que puede tener
selecciones de tipo ( encendido o apagado ) en sus mens; por ejemplo:

Si quieres el cdigo de este programa dale clic aqu


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.

CreandoChecboxMenuItem.zip

package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.MenuBar;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.CheckboxMenuItem;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase ChecboxMenuItem.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CreandoChecboxMenuItem.java
*/
public class CreandoCheckboxMenuItem extends JFrame
{
private MenuBar mb1 = new MenuBar(); // se crea un objeto MenuBar
private Menu a = new Menu("Archivo"); // se crean objetos Menu

235

20. private Menu e = new Menu("Editar");


21. private Menu h = new Menu("Ayuda");
22. MenuItem mi1 = new MenuItem("Nuevo"); // se crean objetos MenuItem
23. MenuItem mi2 = new MenuItem("Guardar");
24. MenuItem mi3 = new MenuItem("Cargar");
25. MenuItem mi4 = new MenuItem("Salir");
26. // creando el objeto CheckboxMenuItem
27. CheckboxMenuItem mi5 = new CheckboxMenuItem("Reiniciar");
28.
29. public CreandoCheckboxMenuItem()
30. {
31.
try
32.
{
33.
jbInit();
34.
}
35.
catch(Exception e)
36.
{
37.
e.printStackTrace();
38.
}
39.
40. }
41.
42. private void jbInit() throws Exception
43. {
44.
this.getContentPane().setLayout(null);
45.
this.setSize(new Dimension(400, 300));
46.
this.setTitle("Creando Un Menu Bar");
47.
mb1.setName( "Soy un MenuBar");
48.
mb1.add( a ); // se agregan los objetos Menu al MenuBar
49.
mb1.add( e );
50.
mb1.setHelpMenu( h ); // se agrega el objeto menu Help a MenuBar
51.
a.add( mi1 ); // agregando los objetos MenuItem al objeto Menu
52.
a.add( mi2 );
53.
a.add( mi3 );
54.
a.addSeparator(); // agrega un separador entre los MenuItem
55.
a.add( mi4 );
56.
a.add( mi5 ); // se agrega el CheckboxMenuItem al menu Archivo
57. }
58. public static void main( String args[] )
59. {
60.
CreandoCheckboxMenuItem ccbmi = new CreandoCheckboxMenuItem();
61.
ccbmi.setMenuBar( ccbmi.mb1 ); // se agrega el MenuBar al JFrame
62.
ccbmi.setVisible ( true );
63.
64. } // fin del main()
65. } // fin de la clase CreandoCheckboxMenuItem

66.

Se debera monitorear el CheckboxMenuItem utilizando la interface ItemListener. El mtodo


itemStateChanged es invocado cuando el estado del checkbox es modificado.

Por ultimo deseo agregar un ejemplo realizado por un alumno que tiene todo lo referente a mens
visto en esta seccin, pero el utiliza mucho las clases del paquete javax.swing, en lugar de las de
java.awt, pero es esencialmente lo mismo, veamos:

236

como se podr observar en la figura , hay menus que responden a los eventos y envian un mensaje a
un TextArea , el cdigo es el siguiente:
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.

CreandoChecboxMenuItem.zip

import java.awt.*;
import java.awt.event.*;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.ButtonGroup;
import javax.swing.JMenuBar;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JFrame;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase ChecboxMenuItem.
* @autor Gilardoni Jara
* @version 1.0
* Reviso: Oscar Alejandro Gonzlez Bustamante
* Archivo: MenuSwing.java
*/
public class MenuSwing extends JFrame
implements ActionListener, ItemListener {
JTextArea salida;
JScrollPane barrascroll;
String newline = "\n";
public MenuSwing() {
JMenuBar menuBar;
JMenu menu, submenu;
JMenuItem menuItem;
JRadioButtonMenuItem radioBotom;
JCheckBoxMenuItem checkBotom;
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

237

40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.

//adiciono los componentes , usando BorderLayout.


Container contentPane = getContentPane();
salida = new JTextArea(5, 30);
salida.setEditable(false);
barrascroll = new JScrollPane(salida);
contentPane.add(barrascroll, BorderLayout.CENTER);
//creo la barra del menu.
menuBar = new JMenuBar();
setJMenuBar(menuBar);
//Primer Item del menu.
menu = new JMenu("Archivo");
menuBar.add(menu);
//Primeros Grupos del Primer item del menu
menuItem = new JMenuItem("Nuevo");
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("Abrir");
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("Cerrar");
menuItem.addActionListener(this);
menu.addSeparator();
menu.add(menuItem);
//radio boton del primer menu
menu.addSeparator();
ButtonGroup group = new ButtonGroup();
radioBotom = new JRadioButtonMenuItem("Radio Boton A");
radioBotom.setSelected(true);
group.add(radioBotom);
radioBotom.addActionListener(this);
menu.add(radioBotom);
radioBotom = new JRadioButtonMenuItem("Radio Boton B");
group.add(radioBotom);
radioBotom.addActionListener(this);
menu.add(radioBotom);
//check box del primer menu
menu.addSeparator();
checkBotom = new JCheckBoxMenuItem("Check Box A");
checkBotom.addItemListener(this);
menu.add(checkBotom);
checkBotom = new JCheckBoxMenuItem("Check Box B");
checkBotom.addItemListener(this);
menu.add(checkBotom);
//submenu
menu.addSeparator();
submenu = new JMenu(" Submenu");
menuItem = new JMenuItem("Submenu 1 ");
menuItem.addActionListener(this);
submenu.add(menuItem);
menuItem = new JMenuItem("Submenu 2");
menuItem.addActionListener(this);
submenu.add(menuItem);
menu.add(submenu);
//Segundo menu de la barra
menu = new JMenu("Editar");
menuBar.add(menu);
//Grupo del segundo menu

238

104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132. }

133.

menuItem = new JMenuItem("Buscar");


menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("Copiar");
menuItem.addActionListener(this);
menu.add(menuItem);
}
public void actionPerformed(ActionEvent e) {
JMenuItem source = (JMenuItem)(e.getSource());
String s = "Ud. Presiono el Menu: " + source.getText();
salida.append( s + newline);
}
public void itemStateChanged(ItemEvent e) {
JMenuItem source = (JMenuItem)(e.getSource());
String s = " Ud. Presiono el check box: " + source.getText();
salida.append(s + newline);
}
public static void main(String[] args) {
MenuSwing window = new MenuSwing();
window.setTitle("Menu con Swing");
window.setSize(400, 300);
window.setVisible(true);
}
// fin de la clase MenuSwing

11.3 Contenedores
Usted agrega componentes GUI a un contenedor utilizando el mtodo add(). Hay dos tipos
principales de contenedores: la clase Window y Panel.
Una ventana ( Window ) es un rectngulo que flota libremente en la pantalla. Hay dos tipos de
ventanas. El Frame y el Dialog. Un Frame es una ventana con una barra de titulo y esquinas que
pueden ser cambiadas de tamao. Un Dialog es una simple ventana que no puede tener una barra
de men y aunque se puede mover no puede ser cambiada de tamao.
El Panel debe estar contenido dentro de otro contenedor, o dentro de una ventana de un navegador
Web. El Panel es una rea rectangular dentro de la cual se puede colocar otros componentes. Se
debe colocar un Panel dentro de una ventana de tipo Window ( o dentro de una subclase de Window
) para ser desplegado.
Posicionamiento y tamao de los componentes en un contenedor.
La posicin y el tamao de un componente dentro de un contenedor es determinado por un
administrador de diseo ( layout manager ). Un contenedor mantiene una referencia a una instancia
en particular de un administrador de diseo . Cuando el contenedor necesita posicionar un
componente, este invoca a el administrador de diseo para dicho fin. La misma delegacin sucede
cuando es decido el tamao de un componente. El administrador de diseo toma todo el control
sobre todos los componentes dentro del contenedor. Es responsable del clculo y definicin del
tamao preferido para el objeto en el contexto del tamao actual de la pantalla.
Debido a que el administrador de diseo generalmente es responsable del tamao y posicin de los
componentes dentro de su contenedor, usted generalmente no debera intentar establecer el tamao

239

o la posicin de dichos componentes. Pero si lo tratara de hacer ( usando mtodos como


setLocation(), setSize() o setBounds() ), el administrador de diseo puede sobreescribir su
decisin.
Si insiste en controlar el tamao o la posicin de los componentes sin utilizar los administradores de
diseo , entonces puede deshabilitar al administrador de diseo mediante la llamada al siguiente
mtodo en su contenedor:
contenedor.setLayout(null);
Despus de este paso, usted debe ahora usar setLocation(), setSize(), o setBounds() en todos los
componentes para ubicarlos dentro del contendor.
Hacer esto resulta en un programa dependiente de la plataforma as que habr diferencias entre
diferentes sistemas basados en ventanas y en tamaos de tipos de fuentes. Una mejor solucin sera
crear una nueva subclase de LayoutManager.
11.3.1 Ejemplos con contenedores
Los Frames
Un Frame es una subclase de Window. Es una ventana con un titulo y puede cambiarse de tamao
en las esquinas. Frame hereda estas caractersticas de la clase Container as que se puede agregar
componentes a un Frame utilizando el mtodo add(). El administrador de diseo para un Frame
omisin es el BorderLayout. Se puede cambiar el administrador de diseo utilizando el mtodo
setLayout().
El constructor Frame ( String ) crea un nuevo objeto Frame invisible con el ttulo especificado por el
argumento String. Usted puede agregar todos los componentes a el Frame mientras este sea
invisible.
El siguiente programa crea un Frame que tiene un titulo, tamao y color de fondo especficos:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.

package oscar;
import java.awt.*;
import java.io.*;
/**
* <p>Ttulo: EjemploFrame.java</p>
* <p>Descripcin: Te ensea un contendor Frame </p>
* <p>Copyright: Es libre </p>
* <p>Empresa: Patito feo </p>
* @author Oscar Alejandro Gonzlez Bustamante
* @version 1.0
*/
public class EjemploFrame {
private Frame f;
public EjemploFrame() {
f = new Frame(" Hola esto es un Frame ");
}
public void lanzaelFrame() {
f.setSize(200, 200);
f.setBackground( Color.red );
f.setLocation( new Point( 250, 250 ) );
f.setVisible( true );
}

240

26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.

public static void main( String[] argumentos ) throws IOException {


EjemploFrame ventanaGUI = new EjemploFrame();
ventanaGUI.lanzaelFrame();
for ( int i = 250 ; i > 0; i-- )
ventanaGUI.f.setLocation( 250 - i , 250 - i );
System.out.println( " Dar un teclazo para terminar");
System.in.read();
ventanaGUI.f.dispose();
System.out.println("Chao chao bye bye !!");
System.exit(0);
}

40. }// fin de la clase EjemploFrame

Los Paneles
Un Panel es como un Frame, y provee del espacio para que el programador coloque cualquier
componente GUI, incluyendo tambin otros paneles. Cada panel hereda de la clase Container todos
sus mtodos y atributos , y puede tener su propio administrador de diseo.
El siguiente programa crea un pequeo panel de color verde , y lo agrega a un frame.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.

package oscar;
import javax.swing.*;
import java.awt.*;
import java.io.*;
/**
* <p>Ttulo:FrameConPanel.java </p>
* <p>Descripcin: Te ensea a crear un panel dentro de un Frame </p>
* <p>Copyright:es libre</p>
* <p>Empresa: El patito feo Inc.</p>
* @author Oscar Alejandro Gonzlez Bustamante.
* @version 1.0
*/
public class FrameConPanel extends JFrame {
Panel panel1 = new Panel();
FlowLayout flowLayout1 = new FlowLayout();
FlowLayout flowLayout2 = new FlowLayout();
public FrameConPanel() {
super( "Frame con un Panel");
try {
jbInit();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
void jbInit() throws Exception {
this.getContentPane().setLayout(flowLayout2);
panel1.setLayout(flowLayout1);
panel1.setBackground(Color.green);
panel1.setLocale(java.util.Locale.getDefault());
this.getContentPane().setBackground(Color.blue);
flowLayout1.setAlignment(FlowLayout.LEFT);

241

38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.

flowLayout1.setHgap(50);
flowLayout1.setVgap(50);
flowLayout2.setAlignment(FlowLayout.LEFT);
this.getContentPane().add(panel1, null);
}

public static void main(String[] args) throws IOException {


FrameConPanel frameConPanel = new FrameConPanel();
frameConPanel.setLocation(100,100);
frameConPanel.setSize(200,200);
frameConPanel.setVisible( true );
System.out.println("Dar un teclazo!!");
System.in.read();
frameConPanel.dispose();
System.out.println("Adios");
}
54. } // fin de la clase FrameConPanel

El resultado al ejecutar el programa con el comando java FrameConPanel lo muestra la siguente


figura.

11.4 Layouts
La distribucin de los componentes en un contenedor usualmente esta controlada con un
administrador de diseo ( layout manager ). Cada contenedor ( como un Panel o un Frame ) tiene
por omisin un administrador de diseo asociado con este, el cual puede ser cambiado invocando al
mtodo setLayout().
Cada administrador de diseo es responsable de definir el tamao de cada componente en sus
contenedores.
Los siguientes administradores de diseo son incluidos en el lenguaje de programacin Java:

FlowLayout - Es el administrador de diseo por default en el Panel y en el Applet. Coloca


los componentes de izquierda a derecha y de arriba hacia abajo.

BorderLayout - Es el administrador de diseo por default de Window, Dialog y Frame.


Coloca los componentes en 5 regiones, Norte, Sur, Este, Oeste y Centro.

GridLayout - Es un administrador de diseo que provee flexibilidad para colocar


componentes a manera de celdillas de una hoja de clculo.

CardLayout - Es raramente usado, y coloca los componentes en capas, donde cada capa es
como una carta de naipes, de ah su nombre.

GridBagLayout - Utilizado para distribuir los componentes como dentro de unas celdillas
pero de diferente tamao, es parecido al GridLayout.

242

La siguiente figura muestra los administradores de diseo ( layout managers).

11.4.1 Ejemplos con layouts


El FlowLayout
Es el administrador de diseo por default para la clase Panel y los componentes son agregados de
izquierda a derecha. Su alineacin por omisin es centrada y permite colocar los componentes a sus
tamaos preferidos. Con los argumentos de el constructor de FlowLayout se permite definir los
componentes para que fluyan de izquierda a derecha o de derecha a izquierda. Tambin es posible
especificar los espacios mnimos de separacin entre cada componente. Aqu tenemos los
constructores:
FlowLayout()
FlowLayout(int align)
FlowLayout(int align, int hgap, int vgap)
Los valores para la alineacin deben ser FlowLayout.LEFT, FlowLayout.RIGHT, o
FlowLayout.CENTER , as por ejemplo:
setLayot( new FlowLayout( FlowLayout.RIGHT, 20, 40 ) );
crea un administrador de diseo de tipo FlowLayout con una alineacin centrada y con las unidades
de espacios mnimos especificados , por default da 5 para espacio horizontal y 5 para el vertical.
Veamos el siguiente ejemplo:
Si quieres el cdigo de los programas de esta seccin dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

EjemploFlowLayout.zip

package oscar230604;
import java.awt.*;
import java.awt.event.*;
/**
* <p>Ttulo: EjemploFlowLayout.java </p>
* <p>Descripcin: Te ensea a usar el FlowLayout</p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Oscar Alejandro Gonzlez Bustamante
* @version 1.0

243

13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.

69.

*/
public class EjemploFlowLayout extends Frame {
Button button1 = new Button();
Button button2 = new Button();
Button button3 = new Button();
FlowLayout flowLayout1 = new FlowLayout();
public EjemploFlowLayout() {
try {
jbInit();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
void jbInit() throws Exception {
button1.setLabel("Aceptar");
button1.setLocale(java.util.Locale.getDefault());
button1.addActionListener(new EjemploFlowLayout_button1_actionAdapter(this));
button2.setLabel("Abrir");
button3.setLabel("Cerrar");
this.setSize( 400, 300 );
this.setBackground(Color.orange);
this.setResizable(true);
this.setTitle("Ejemplo de FlowLayout - Curso de Java Bsico -");
this.setLayout(flowLayout1);
flowLayout1.setAlignment(FlowLayout.RIGHT);
flowLayout1.setHgap(20);
flowLayout1.setVgap(40);
this.add(button1, null);
this.add(button2, null);
this.add(button3, null);
}
public static void main(String[] args) {
EjemploFlowLayout ejemploFlowLayout = new EjemploFlowLayout();
ejemploFlowLayout.setVisible( true );
}
void button1_actionPerformed(ActionEvent e) {
}
}
class EjemploFlowLayout_button1_actionAdapter implements java.awt.event.ActionListener {
EjemploFlowLayout adaptee;
EjemploFlowLayout_button1_actionAdapter(EjemploFlowLayout adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.button1_actionPerformed(e);
}
} // fin de la clase EjemplodeFlowLayout

En la figura siguiente podemos ver que al ejecutar el programa con el comando java
EjemploFlowLayout nos presenta una ventana con tres botones con los espacios entre cada botn
de 20 unidades por 40 unidades y con alineacin hacia la derecha .

244

El BorderLayout
Es el administrador de diseo por default de la clase Frame. Los componentes son agregados a 5
regiones especificas dentro de la ventana o frame:
NORTH ocupa la parte de arriba
EAST ocupa el lado derecho
SOUTH ocupa la parte inferior
WEST ocupa la parte izquierda
CENTER ocupa la parte central
Cuando ajustamos verticalmente el tamao de la ventana o frame , las regiones EAST, WEST y
CENTER son ajustadas.
Cuando ajustamos horizontalmente el tamao de la ventana o frame , las regiones NORT, SOUTH y
CENTER son ajustadas.
Cuando aadimos botones a las posiciones relativas los botones no cambian si la ventana es cambiada
de tamao, pero los tamaos de los botones si cambian.
El siguiente constructor crea un administrador de diseo de tipo BorderLayout sin espacios entre sus
componentes:
setLayout( new BorderLayout() );
Usando el siguiente constructor podemos indicarle los espacios entre los componentes especificados
por hgap y vgap:
BorderLayout( int hgap, int vgap );
Se deben agregar los componentes en las regiones especficas respetando maysculas y minsculas
ya que no es lo mismo add( boton, BorderLayout.CENTER ) que add( boton,
BorderLayout.center ) en el administrador de diseo , o de otra forma no sern visibles. Si se
quiere evitar esto se puede usar add ( boton, "center" ) .
Si se deja una regin sin utilizar, esta se comportar como si se hubiera preferido un tamao de 0 x 0.
La regin CENTER seguir apareciendo como fondo cuando incluso si no tiene componentes.

245

Solo se puede agregar un solo componente por cada una de las cinco regiones. Si se trata de agregar
mas de una, solo la ltima agregada ser la visible. Cuando deseamos agregar mas componentes por
regin usaremos la clase Panel, lo cual veremos despus.
Si quieres el cdigo de los programas de esta seccin dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.

EjemploBorderLayout.zip

package oscar230604;
import java.awt.*;
import java.awt.event.*;
/**
* <p>Ttulo: EjemploBorderLayout.java </p>
* <p>Descripcin: Te ensea a usar el FlowLayout</p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Oscar Alejandro Gonzlez Bustamante
* @version 1.0
*/
public class EjemploBorderLayout extends Frame {
Button button1 = new Button();
Button button2 = new Button();
Button button3 = new Button();
BorderLayout borderLayout1 = new BorderLayout();
Button button4 = new Button();
TextArea textArea1 = new TextArea();
public EjemploBorderLayout() {
try {
jbInit();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
void jbInit() throws Exception {
button1.setLabel("Aceptar");
button1.setLocale(java.util.Locale.getDefault());
button1.addActionListener(new EjemploBorderLayout_button1_actionAdapter(this));
button2.setLabel("Abrir");
button3.setLabel("Cerrar");
this.setSize( 400, 300 );
this.setBackground(Color.cyan);
this.setResizable(true);
this.setTitle("Ejemplo de BorderLayout - Curso de Java Bsico -");
this.setLayout(borderLayout1);
button4.setBackground(Color.red);
button4.setLabel("Aplicar");
borderLayout1.setHgap(20);
borderLayout1.setVgap(40);
textArea1.setColumns(20);
textArea1.setEditable(false);
textArea1.setEnabled(true);
textArea1.setFont(new java.awt.Font("Arial", 3, 12));
textArea1.setLocale(java.util.Locale.getDefault());
textArea1.setSelectionEnd(20);
textArea1.setSelectionStart(20);
textArea1.setText("\t Hola esto es un TextArea \n " +
"\t dentro de un Frame con un \n " +
"\t BorderLayout en la regin \n " +
"\t CENTER");
textArea1.setVisible(true);

246

59.
this.add(button1, BorderLayout.NORTH);
60.
this.add(button2, BorderLayout.WEST);
61.
this.add(button3, BorderLayout.SOUTH);
62.
this.add(button4, BorderLayout.EAST);
63.
this.add(textArea1, BorderLayout.CENTER);
64. }
65.
66. public static void main(String[] args) {
67.
EjemploBorderLayout ejemploBorderLayout = new EjemploBorderLayout();
68.
ejemploBorderLayout.setVisible( true );
69. }
70.
71. void button1_actionPerformed(ActionEvent e) {
72.
73. }
74. }
75.
76. class EjemploBorderLayout_button1_actionAdapter implements java.awt.event.ActionListener
{
77. EjemploBorderLayout adaptee;
78.
79. EjemploBorderLayout_button1_actionAdapter(EjemploBorderLayout adaptee) {
80.
this.adaptee = adaptee;
81. }
82. public void actionPerformed(ActionEvent e) {
83.
adaptee.button1_actionPerformed(e);
84. }
85. } // fin de EjemploBorderLayout

86.

En la figura siguiente podemos ver que al ejecutar el programa con el comando java
EjemploBorderLayout nos presenta una ventana con cuatro botones y un rea de texto en la
regin CENTER.

El GridLayout
Este administrador de diseo proporciona flexibilidad para colocar componentes en celdillas de
izquierda a derecha y de arriba a abajo en una rejilla al estilo de una hoja electrnica de clculo con
filas y columnas. Por ejemplo un GridLayout con tres renglones y dos columnas puede ser creado
mediante la sentencia new GridLayout ( 3, 2 ) lo que se traduce en 6 celdas.
Con un administrador de tipo GridLayout siempre se ignoran los tamaos preferidos para cada
componente. El ancho de todas celdas es idntico y es determinado mediante la divisin del ancho
disponible sobre el nmero de columnas, as como el alto de todas las celdas es tambin determinado
mediante el alto disponible entre el nmero de renglones.

247

El orden en el cual los componentes son agregados a la rejilla es determina la celda que ocupa. Los
renglones de celdas son llenados de izquierda a derecha, como un texto de una pgina que es llenada
con lneas de de arriba a abajo.
Veamos el siguiente ejemplo.
Si quieres el cdigo de los programas de esta seccin dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.

EjemploGridLayout.zip

package oscar230604;
import java.awt.*;
import javax.swing.*;
/**
* <p>Ttulo: EjemploGridLayout.java </p>
* <p>Descripcin: Te ensea a usar el FlowLayout</p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Oscar Alejandro Gonzlez Bustamante
* @version 1.0
*/
public class EjemploGridLayout extends Frame {
GridLayout gridLayout1 = new GridLayout();
Button button1 = new Button();
Button button2 = new Button();
Button button3 = new Button();
Button button4 = new Button();
Button button5 = new Button();
Button button6 = new Button();
public EjemploGridLayout() {
try {
jbInit();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
void jbInit() throws Exception {
button1.setLabel("UNO");
gridLayout1.setColumns(2);
gridLayout1.setHgap(20);
gridLayout1.setRows(3);
gridLayout1.setVgap(40);
this.setLayout(gridLayout1);
button2.setLabel("DOS");
button3.setLabel("TRES");
button4.setLabel("CUATRO");
button5.setLabel("CINCO");
button6.setLabel("SEIS");
this.setBackground(Color.red);
this.setTitle("Ejemplo de Frame con GridLayout");
this.add(button1, null);
this.add(button2, null);
this.add(button3, null);
this.add(button4, null);
this.add(button5, null);
this.add(button6, null);
}

248

56. public static void main(String[] args) {


57.
EjemploGridLayout ejemploGridLayout = new EjemploGridLayout();
58.
ejemploGridLayout.setSize( 400, 400 );
59.
ejemploGridLayout.setVisible ( true );
60. }
61. } // fin de EjemploGridLayout

62.

En la figura siguiente podemos ver que al ejecutar el programa con el comando java
EjemploGridLayout nos presenta una ventana con 3 filas por 2 columnas o 6 celdas botones son
colocados en el orden en que se van agregando al contenedor y todos tienen los espacios
especificados de 20 unidades en horizontal y 40 en vertical.

11.5 Eventos
Cuando un usuario ejecuta una accin en una interface grfica, como dar clic al ratn sobre un botn o
presionar una tecla, esto provoca un evento. Los eventos son objetos que describen que ha
sucedido. Hay diferentes clases de eventos para describir diferentes categoras de acciones por parte
del usuario.

Fuentes de eventos

249

Una fuente de un evento es el generador de un evento, as por ejemplo, el clic del ratn sobre un
componente botn genera un ActionEvent con el botn como origen o fuente del evento. La
instancia de un ActionEvent es un objeto que contiene informacin acerca de los eventos que
acaban de darse. Este contiene:
getActionCommand() - Devuelve el nombre del comando asociado con la accin.
getModifiers() - Regresa cualquier modificador que se haya dado durante la accin.
Manejadores de eventos
Un manejador de evento es un mtodo que recibe un objeto de tipo evento y decide y procesa la
interaccin con el usuario.
11.5.1 El modelo de delegacin de eventos
El modelo de delegacin de eventos aparece con la versin JDK 1.1. Con este modelo los eventos
son enviados a el componente desde donde el evento fue originado, pero cada componente propaga el
evento a un o mas clases llamadas oyentes ( listeners ).
Los oyentes contienen manejadores de eventos que reciben y procesan el evento. De esta forma, el
manejador del evento puede ser un objeto separado de el componente. Los oyentes son clases que
implementan la interface EventListener.

Los eventos son objetos que reportan solamente a los oyentes registrados. Cada evento tiene una
interface oyente correspondiente que le indica cuales son los mtodos adecuados que deben ser
definidos dentro de la clase para recibir tales tipos de eventos. La clase que implementa la interface
define todos esos mtodos y pueden ser registrados como un oyente.
Los componentes que no tienen oyentes registrados no son propagados.
Por ejemplo, veamos el siguiente cdigo de un simple Frame con un simple botn:
Si quieres el cdigo de los programas de esta seccin dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.

PruebaBoton.zip

import java.awt.*;
import java.awt.event.*;
/**
* <p>Ttulo: PruebaBoton.java </p>
* <p>Descripcin: Te ensea a usar delegacin de eventos</p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Oscar Alejandro Gonzlez Bustamante

250

10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.

* @version 1.0
*/
public class PruebaBoton
extends Frame {
Button button1 = new Button();
FlowLayout flowLayout1 = new FlowLayout();
public PruebaBoton() {
try {
jbInit();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
void jbInit() throws Exception {
button1.setLabel("Botn");
button1.setActionCommand("Dame clic y vers que bonito!");
// registrar un oyente al botn
button1.addActionListener(new PruebaBoton_button1_actionAdapter(this));
this.setBackground(Color.blue);
this.setTitle("Frame con botn");
this.setLayout(flowLayout1);
this.add(button1, null);
}
public static void main(String[] args) {
PruebaBoton pruebaBoton = new PruebaBoton();
pruebaBoton.setSize(300, 100);
pruebaBoton.setLocation(300, 200);
pruebaBoton.setVisible(true);
pruebaBoton.button1.setSize(50, 50);
}
void button1_actionPerformed(ActionEvent e) {
System.out.println("" + e.getActionCommand());
}
} // fin de la clase PruebaBoton
// La clase PruebaBoton_button1_actionAdapter es la clase manejadora en la
// cual el evento es delegado.
class PruebaBoton_button1_actionAdapter
implements java.awt.event.ActionListener {
PruebaBoton adaptee;
PruebaBoton_button1_actionAdapter(PruebaBoton adaptee) {
this.adaptee = adaptee;
}

public void actionPerformed(ActionEvent e) {


adaptee.button1_actionPerformed(e);
}
65. } // fin de la clase PruebaBoton_button1_actionAdapter

La figura siguiente muestra la ejecucin del programa anterior en JBuilder X ( versin de prueba ).
Cuando el usuario le da clic al botn, se dispara el evento y escribe en la ventana de mensajes "
!Dame clic y vers que bonito! "

251

Este ejemplo tiene las siguientes caractersticas:


La clase Button tiene un mtodo addActionListener ( ActionListener )
La interface ActionListener define un mtodo actionPerformed, el cual recibe un ActionEvent.
Una vez creado, un objeto Button puede tener un objeto registrado como un oyente ( listener ) para
el ActionEvents a travs del mtodo addActionListener(). El oyente registrado es instanciado
desde una clase que implementa la interface ActionListener.
Cuando al el objeto Button se le da clic con el ratn, un ActionEvent es enviado. El ActionEvent
es recibido a travs de el mtodo actionPerformed() para cualquier ActionListener que sea
registrada sobre el objeto Button a travs de su mtodo addActionListener().
El mtodo getActionCommand() de la clase ActionEvent regresa el nombre del comando asociado
con esta accin. En la lnea 29 la accin del comando para este botn es establecida con "Dame clic y
vers que bonito!" .
11.5.2 Categoras de eventos
Los eventos no son accidentalmente manejados. Los objetos que quieren ser odos por un evento en
particular sobre un componente GUI deben registrarse a si mismos con tal componente.
Cuando un evento ocurre, solo los objetos que fueron registrados recibirn el mensaje del evento

252

ocurrido.
El modelo de delegacin es bueno por la distribucin del trabajo entre las clases.
Los eventos no tienen por que estar relacionados a un componente AWT. Este modelo de eventos
provee soporte para JavaBeans.
La siguiente figura muestra las categoras de los eventos.

El mecanismo general para recibir eventos de los componentes ha sido descrito en el contexto de un
simple tipo de evento. Muchas de las clases de eventos estn en el paquete java.awt.event , pero
otras existen en cualquier otra parte en el API.
Para cada categora de eventos, hay una interface que tiene que ser implementada por la clase de
objetos que quieren recibir los eventos. Esta interface demanda que uno o mas mtodos sean
definidos. Aquellos mtodos son llamados cuando un suceso o evento en particular surge. La
siguiente tabla lista estas interfaces por categorias.
Categora
Action
Item
Mouse

Nombre de la Interface
ActionListener
ItemListener
MouseListener

Mtodos
actionPerformed( ActionEvent )
itemStateChanged( ItemEvent )
mousePressed( MouseEvent )
mouseReleased( MouseEvent )
mouseEntered( MouseEvent )

253

Mouse
Motion
Key

MouseMotionListener

Focus

FocusListener

Adjustment

AdjustmentListener

Component

ComponentListener

Window

WindowListener

Container

ContainerListener

Text

TextListener

mouseExited( MourseEvent )
mouseClicked( MouseEvent )
mouseDragged( MouseEvent )
mouseMoved( MouseEvent )
keyPressed( KeyEvent )
keyReleased( KeyEvent )
keyTyped( KeyEvent )
focusGained( FocusEvent )
focusLost( FocusEvent )
adjustmentValueChanged( AdjustmentEvent

KeyListener

)
componentMoved( ComponentEvent )
componentHidden( ComponentEvent )
componentResized( ComponentEvent )
componentShown( ComponentEvent )
windowClosing( WindowEvent )
windowOpenend( WindowEvent )
windowIconified( WindowEvent )
windowDeiconified( WindowEvent )
windowClosed( WindowEvent )
windowActivated( WindowEvent )
windowDeactivated( WindowEvent )
componentAdded( ContainerEvent )
componentRemoved( ContainerEvent )
textValueChanged( TextEvent )

11.5.3 Implementando mltiples interfaces


Los oyentes de eventos del paquete AWT permiten mltiples oyentes que pueden ser invocados por el
mismo componente. Es posible programar cdigo para manejar mltiples eventos en un solo mtodo
que lo maneje. Sin embargo, a veces un diseo dentro de una aplicacin requiere muchas partes no
relacionadas en el mismo programa para reaccionar a el mismo evento. Esto puede suceder si, por
ejemplo, un sistema de ayuda sensible a contexto es agregado a un programa existente.
El mecanismo oyente permite agregar llamadas a un mtodo addXxxListener() tantas veces como
sea necesario, y usted puede especificar muchos diferentes oyentes como su diseo lo requiera.
Todos estos oyentes registrados tienen sus mtodos manejadores que los invocan cuando un evento
suceda.
Adaptadoras de Eventos
Es mucho trabajo implementar todos los mtodos en cada una de las interfaces oyentes,
particularmente para el caso de la interface MouseListener y WindowListener.
Por ejemplo, la interface MouseListener declara los mtodos siguientes:

public
public
public
public
public

void
void
void
void
void

mouseClicked( MouseEvent evento )


mouseEntered( MouseEvent evento )
mouseExited( MouseEvent evento )
mousePressed( MouseEvent evento )
mouseReleased( MouseEvent evento )

Como una conveniencia, el lenguaje de programacin Java provee de clases adaptadoras que
implementan cada interface conteniendo mas de un mtodo. Los mtodos en estas clases
adaptadoras estn vacios.

254

As , las clases oyentes que usted define pueden extenderse en clases adaptadoras y sobrescribir solo
los mtodos que usted necesite.
Ejemplo:
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.

ManejadorClicRaton.zip

import java.awt.*;
import java.awt.event.*;
/**
* Programa de Java que te ensea a utilizar clases adaptadoras
* del paquete java.awt. Este demuestra el uso de los
* multiples eventos de la clase MouseEvent con
* la clase adaptadora MouseAdapter
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ManejadorClicRaton.java
*/
public class ManejadorClicRaton extends MouseAdapter {
// necesitamos el manejador mouseClick, asi que usamos
// entonces el adaptador para evitar tener que escribir todos los
// mtodos manejadores de eventos
public void mouseClicked( MouseEvent e ) {
// Aqu programamos el evento del clic del ratn
}
} // fin de la clase ManejadorClicRaton

Hay que notar que esto es una clase, no una interface. Esto significa que es posible extender
solamente a otra clase. Debido a que los oyentes son interfaces, usted puede implementar muchas
otras mas clases.
11.5.5 Manejo de eventos usando clases internas
Es posible implementar manejadores de eventos como clases internas ( como se ve en la lnea 27, 3439) . Esto permite el acceso a los datos privados de las clases externas ( lnea 38 ). Por ejemplo:

Si quieres el cdigo de este programa dale clic aqu

PruebaInterna.zip

1. import java.awt.*;
2. import java.awt.event.*;

255

3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.

/**
* Programa de Java que te ensea a utilizar clases adaptadoras pero como
* clases internas.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: PruebaInterna.java
*/
public class PruebaInterna {
private Frame f;
private TextField tf;
public PruebaInterna() {
f = new Frame("Ejemplo de Manejo de eventos con clases internas");
tf = new TextField( 30 );
} // fin del constructor
public void lanzaFrame() {
Label etiqueta = new Label(" Da clic o arrastra el ratn ");
// agrega componentes al Frame
f.add( etiqueta, BorderLayout.NORTH );
f.add( tf, BorderLayout.SOUTH );
// agrega un oyente que use una clase interna
f.addMouseMotionListener( new MiRatonseMueveOyente() );
f.addMouseListener( new ManejadorClicRaton() );
// Tamao del frame y hacerlo visible
f.setSize( 300, 200 );
f.setVisible( true );
} // fin del mtodo lanzaFrame()
class MiRatonseMueveOyente extends MouseMotionAdapter {
public void mouseDragged( MouseEvent e ) {
String s = "Ratn arrastrandose: X = " + e.getX() +
" Y = " + e.getY();
tf.setText ( s );
} // fin del mtodo mouseDragged()
} // fin de la clase interna adaptadora MiRatonseMueveOyente
public static void main( String[] argumentos ) {
PruebaInterna obj = new PruebaInterna();
obj.lanzaFrame();
} // fin del main()
} // fin de la clase PruebaInterna

11.5.5 Manejo de eventos usando clases internas annimas.


(fecha de ltima modificacin de sta pgina:

11.5.5 Manejo de eventos usando clases internas annimas.


Es posible incluir la definicin completa de una clase en el mbito de una expresin. Esta situacin
define lo que es conocido como clases internas annimas y crea la instancia de una de ellas. Las
clases annimas internas son generalmente utilizadas con el manejo de eventos en AWT ; por ejemplo:

256

Si quieres el cdigo de este programa dale clic aqu


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.

PruebaAnonima.zip

import java.awt.*;
import java.awt.event.*;
/**
* Programa de Java que te ensea a utilizar clases internas annimas para
* manejar eventos en las AWT
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: PruebaAnonima.java
*/
public class PruebaAnonima {
private Frame f;
private TextField tf;
public PruebaAnonima() {
f = new Frame("Ejemplo de Manejo de eventos con clases internas annimas");
tf = new TextField( 30 );
} // fin del constructor
public void lanzaFrame() {
Label etiqueta = new Label(" Da clic o arrastra el ratn ");
// agrega componentes al Frame
f.add( etiqueta, BorderLayout.NORTH );
f.add( tf, BorderLayout.SOUTH );
// agrega un oyente que use una clase interna annima
f.addMouseMotionListener( new MouseMotionAdapter() {
public void mouseDragged( MouseEvent e ) {
String s = "Ratn arrastrandose: X = " + e.getX() +
" Y = " + e.getY();
tf.setText ( s );
}
} ); // <-- observe que hay que cerrar el parntesis
f.addMouseListener( new ManejadorClicRaton() );
// Tamao del frame y hacerlo visible
f.setSize( 300, 200 );
f.setVisible( true );
} // fin del mtodo lanzaFrame()
public static void main( String[] argumentos ) {

40.
PruebaAnonima obj = new PruebaAnonima();
41.
obj.lanzaFrame();
42.
} // fin del main()
43. } // fin de la clase PruebaAnonima

257

nombre de PruebaAnonima$1.class que es as para este caso en particular.


11.6 Uso de AWT con applets
Como hemos visto las AWT proveen los componentes bsicos para una GUI o Interface Grfica de
Usuario y son utilizados en las aplicaciones y los applets de Java, en particular en el caso de los
applets podemos utilizar casi todas las clases AWT para los Frame, Dialog, Window, Container,
etc. , excepto la clase Menu. En la siguiente seccin presentamos un ejemplo que utiliza
ampliamente las clases e interfaces de este paquete en un graficador de funciones.
11.6.1 Ejemplo de un graficador de funciones

Se muestra un programa que utiliza arreglos, y la clase java.awt.Graphics para crear un graficador
de funciones.

Si quieres obtener elcdigo clic con el botn derecho aqu ProyGraf.zip


Si quieres ver enejecucin el programa dale clic aqu seleccionador.htm

Figura. Muestra la ejecucin del programa


1.
2.
3.
4.
5.
6.

/**
* Programa de Java que ejemplifica el uso
* de una java.awt y java.awt.event
* dentro de un applet. En particular te
* ensea a utilizar algunos mtodos de la
* clase Graphics para dibujar figuras

258

7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.

* geomticas, texto, etc.g ).


* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ProyGraf.java
*/
import java.awt.*;
import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ProyGraf extends Applet implements ActionListener {
/* VARIABLES PARA LA INTERFACE */
Button b;
Choice tg;
Panel panelarriba;
TextArea lt;
Font fuente;
MyCanvas can = new MyCanvas();
String creditos1;
static int fun; /* indica que funcin se va a graficar */
public void init()
{
setBackground(new Color(255, 255, 255)); //combinacin (rojo,verde,azul) RGB
// CREACION DE PANELES
panelarriba = new Panel();
panelarriba.setLayout(new GridLayout(1,2));
creditos1 = new String("PROYECTO DE GRAFICACIN \n"+
"Programa elaborado por : \n" +
"Oscar Alejandro Gonzalez Bustamante \n" +
"Ejemplifica el uso de la API awt de Java \n"+
"en especial los metodos de la clase Graphics \n" +
"Este programa te ensea a utilizar los mtodos" +
"de la clase Graphics ms utilizados");
lt = new TextArea(creditos1, 2, 25,TextArea.SCROLLBARS_BOTH);
setLayout(new BorderLayout());

// CREA CAMPO LA FUNCIN QUE EL USUARIO ESCOGE PARA GRAFICAR


tg = new Choice();
tg.addItem("f(x)=x*x"); //parabola
tg.addItem("f(x)=8*x"); //linea
tg.addItem("f(x)=x*x*x"); //circulo (pendiente)
tg.addItem("f(x)=sin(10*x)+ cos(3*x)"); //sinuidal
tg.addItem("f(x)=sin(x)"); //seno
tg.addItem("f(x)=4*sin(10*x)"); //sinuidal
tg.addItem("f(x)=exp(-x/20.0) * sin( 50*x)"); //movimiento armnico simple

// CREACION DEL BOTON DE ACTIVACION DE LA GRAFICACION


b =new Button("Graficar");
b.addActionListener(this); // ponemos atencion o escuchamos el evento generado
por b
66.
// AGREGA COMPONENTES A LOS PANELES
67.
fuente = new java.awt.Font("Arial", Font.BOLD, 12);
68.
setFont(fuente);
69.

259

70.
panelarriba.add(lt);
71.
add(panelarriba,BorderLayout.NORTH);
72.
add(tg,BorderLayout.WEST);
73.
add(can,BorderLayout.CENTER);
74.
add(b,BorderLayout.SOUTH);
75.
76. } // fin init
77.
78. // EJECUTA ACCIONES VIA BOTON
79. public void actionPerformed(ActionEvent e){
80.
81.
// EJECUTA EL GRAFICADOR
82.
if(e.getActionCommand().equals("Graficar"))
83.
{
84.
85.
// OBTIENE EL TIPO DE FUNCIN QUE SE VA A GRAFICAR
86.
int tipofun = tg.getSelectedIndex();
87.
switch (tipofun)
88.
{
89.
case 0: fun = 1; break; //parabola f(x)=x*x
90.
case 1: fun = 2; break; //linea
f(x)=8*x;
91.
case 2: fun = 3; break; //circulo (pendiente) f(x)=x*x + y*y
92.
case 3: fun = 4; break; //sinuidal f(x)=sin(10*x)+ cos(3*x)
93.
case 4: fun = 5; break; //seno f(x)=sin(x)
94.
case 5: fun = 6; break; //sinuidal f(x)=4*sin(10*x)
95.
case 6: fun = 7; break; //movimiento armonico simple f(x)=exp(-x/20.0) *
sin( 50*x)
96.
default : fun = -1; break;
97.
} //fin del switch
98.
99.
can.setFun(fun);
100.
101.
} //fin del if
102.
103.
can.repaint();
104.
105.
106. } // fin actionPerformed
107.
108.
109. } // fin ProyGraf
110.
111.
112. class MyCanvas extends java.awt.Canvas {
113.
114.
/* VARIABLES PARA EL GRAFICADOR */
115. static final int M = 720;
116. static final String TITULO = "GRAFICAS DE FUNCIONES DE OSCARIN";
117. static final String EJEX = "Absisas eje x";
118. static final String EJEY = "Ordenadas eje y";
119. static double x[] = new double[M];
120. static double y[] = new double[M];
121. static int xi[] = new int[M];
122. static int yi[] = new int[M];
123. static double ymax,ymin,yrango;
124. static double xmax,xmin,xrango;
125.
126. int fx;
127.
128. public void setFun(int funcion) { fx = funcion; }
129.
130. public int getFun() { return fx; }
131.
132.

260

133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.

public void paint(Graphics lg)


{
int i,domi,j,k,p,ydiv;
/*area rectangular donde se va a graficar la funcin */
int x1=60, y1=30, x2=610, y2=400;
/*para determinar el origen de los ejes x,y para las coordenadas normalizadas*/
int xorigen,yorigen;
/* para obtener el indice del arreglo para los valores del origen */
int indxor=0, indyor=0;
double ymax, ymin, yrango, xmax, xmin, xrango;
Font f;
FontMetrics fm;
String s;
lg.drawRect(x1,y1,x2,y2); /* dibuja borde */
lg.setColor(new Color(00,21,00)); /* establece color verde muy obscuro */
lg.fillRect(x1+1,y1+1,x2-1,y2-1); /* dibuja borde */
lg.setColor(Color.blue); /* establece color */
domi=-360;
for (i=0; i<M;i++)
{

//se maneja localidades del 0 a M para el arreglo

x[i]=i+domi; // para que grafique de -360 , 0 , 360 en el dominio


if (i+domi == 0) indxor = i; /* para obtener la cordenada x cuando es 0 u
origen */
160.
switch (getFun() ) {
161.
case 1 : y[i]= x[i]*x[i]; break;
162.
case 2 : y[i]= 8*x[i]; break;
163.
case 3 : y[i]= x[i]*x[i]*x[i]; break; // debe ser el circulo x*x + y*y
164.
case 4 : y[i]=
Math.sin(10*x[i]*Math.PI/180.0)+Math.cos(3*x[i]*Math.PI/180.0); break;
165.
case 5 : y[i]= Math.sin(x[i]*Math.PI/180.0); break;
166.
case 6 : y[i]= 4*Math.sin(10*x[i]*Math.PI/180.0); break;
167.
case 7 : y[i]= Math.exp(-x[i]/20.0) * Math.sin( 50*x[i]*Math.PI/180.0);
break;
168.
default : y[i] = 0.0;
169.
} /* switch(fun) */
170.
171.
if ( y[i] < 0.0 ) indyor = i; /* cuando la yi es negativa atraviesa el eje x */
172.
else
173.
if ( y[i] == 0.0) indyor = i; /* cuando la yi es igual a cero */
174.
175. } /* for */
176.
177.
178. f = new Font("Courier", Font.BOLD, 18);
179. fm = getFontMetrics(f);
180. lg.setFont(f);
181. int xtit = ( getSize().width - fm.stringWidth(TITULO)) / 2;
182. lg.drawString(TITULO, xtit ,20);
183. int xejx =( getSize().width - fm.stringWidth(EJEX)) / 2;
184. lg.drawString(EJEX, xejx ,getSize().height - 20);
185. int yejy =( getSize().height - EJEY.length()*fm.getHeight()) / 2;
186.
187. for ( ydiv=0; ydiv < EJEY.length(); ydiv++)
188.
{
189.
lg.drawString(""+EJEY.charAt(ydiv), 20, yejy + fm.getHeight()*ydiv);
190.
}
191.
192. ymax= y[0];
193. ymin= y[0];

261

194. xmax= x[0];


195. xmin= x[0];
196. for (i=0; i<M; i++)
197. {
198. if (y[i]>ymax) ymax = y[i];
199. if (y[i]<ymin) ymin = y[i];
200. if (x[i]>xmax) xmax = x[i];
201. if (x[i]<xmin) xmin = x[i];
202. }
203. yrango = ymax - ymin;
204. xrango = xmax - xmin;
205.
206. /* coordenada x para el origen ya normalizada */
207. xorigen = (int) ( x1 + Math.floor( ((x[indxor]-xmin) / xrango) * (x2-x1)) );
208. /* coordenada y para el origen ya normalizada */
209. yorigen = (int) ( y2 - Math.floor( ((y[indyor]-ymin) * (y2-y1)) / yrango) );
210.
211. for (i=0; i<M; i++)
212.
{ /* conversin de los datos para graficarse por pantalla */
213.
yi[i] = (int) ( y2 - Math.floor( ((y[i]-ymin) * (y2-y1)) / yrango) );
214.
xi[i] = (int) ( x1 + Math.floor( ((x[i]-xmin) / xrango) * (x2-x1)) );
215.
}
216.
217.
/* dibuja lineas del eje y o ordenadas y el eje x absisas */
218.
lg.setColor(Color.WHITE);
219.
lg.drawLine(xorigen,y1,xorigen,y1+y2); /* eje de las ordenadas */
220.
lg.drawLine(x1,yorigen,x1+x2,yorigen); /* eje de las absisas */
221.
222.
lg.setColor(new Color(255,255,0)); /* establece color amarillo */
223.
224.
int pts = xi.length;
225.
lg.drawPolyline(xi, yi, pts);
226.
227.
228. } //fin del paint()
229.
230. } /* fin de MyCanvas */

231.

12. Bases de Datos con Java


Introduccin
En esta parte del curso se analizar como es posible crear aplicaciones con bases de datos con el
lenguaje de programacin Java, en particular se vern los siguientes tpicos:

El uso de la los puentes o drivers de conexin con los manejadores de bases de datos,
puentes 1 y 4, esto es, el puente ODBC-JDBC y el puente java nativo JDBC

El uso de las clases e interfaces del paquete java.sql.* , para la interaccin con bases
de datos, mediante sentencias de SQL estndar con DDL y DML.

Programas ejemplo de aplicaciones con MySQL , Access de Microsoft y SQL-Server


2000 de Microsoft, con el manejo de las AWT y aplicaciones de consola.

Una vez aclarado esto, dale clic a siguiente

para entrar al curso de bases de datos con

262

Java
Base de Datos con Java
Objetivo: El participante obtendr el los conocimientos necesarios, para
crear programas de Java que interacten con Bases de Datos, conocer las
clases e interfaces disponibles en el API JDBC para ello.
ODBC (Open Database Conectivity) es un standar que permite que una
aplicacin sobre Windows pueda comunicarse con diferentes sistemas
manejadores de bases de datos.
Java utiliza la interfaz JDBC para comunicarse con las Bases de Datos y tiene
la misma funcin que el ODBC la tiene para Windows. JDBC , est
compuesto por un nmero determinado de clases que permiten a cualquier
programa escrito en Java acceder a una base de datos.

Puente 1. JDBC-ODBC
Java puede acceder a la base de datos mediante un puento o driver o controlador JDBC apropiado que
pueda utilizar las clases que permiten el acceso a la base de datos. Existen 4 tipos de drivers.
Puente 1. JDBC-ODBC: Los controladores de este tipo utilizan el sistema de pasarela o puente. Un
ejemplo es el JDBC-ODBC. No es la mejor solucin porque en muchos casos es necesario instalar un
software especfico en el cliente adems de ser algo lento en los accesos a la base de datos.

Utiliza la estandarizacin ODBC para su funcionamiento que es el que poseen la


mayora de los SGBD.

Este controlador convierte todas las llamadas de JDBC a ODBC realizando el proceso
inverso para la obtencin de resultados.

Su principal inconveniente radica en que al realizar una llamada de JDBC a ODBC, ste
ltimo debe realizar una llamada a la librera nativa del fabricante del SGBD,
disminuyendo claramente la velocidad del controlador

Al utilizar ODBC como puente se crea una doble capa, y a su vez creamos una
aplicacin dependiente de la plataforma, ya que ODBC est definido para Windows.

Sun incluye el controlador en el JDK para popularizar el JDBC mediante el ODBC.

263

Puente 2. Java Nativo


Este tipo de controlador se conoce como API nativas, esto es, el controlador contiene cdigo Java
mediante el cual se realizan las llamadas a los mtodos nativos de la base de datos en C o C++ que
realizan en acceso a la base de datos. Algunas veces es necesario instalar un software cliente para
utilizar este tipo de controladores.

Es 100% nativo, este controlador se brinca la capa ODBC que se genera con el JDBC ODBC, por tanto, ste controlador realiza invocaciones a las libreras nativas del
sistema gestor de la base de datos de forma directa.

Al ser 100% Java necesita utilizar libreras nativas, por sta razn no podremos utilizar
ste tipo de controlador para nuestros applets.

Puente 3. 100% Java / Protocolonativo


Losdrivers o controladores JDBC de este tipo se comunican con una aplicacinintermedia en el
servidor utilizando sockets que trasladan las peticiones delprograma cliente a una API especfica del
controlador. Este tipo de drivertiene la ventaja de no utilizar ningn software en el cliente.
Este controlador est diseado 100% en Java y utiliza el protocolonativo de red para comunicarse con
el SGBD , por tanto, se independizatotalmente de la plataforma.
Su nico inconveniente es la de crear una dependencia con un tipo deservidor de un SGBD. Ej. el
protocolo de red que sigue el MS SQL Server notiene nada que ver con el que utiliza Oracle.

264

Puente 4.100% Java /Protocolo independiente


Los controladores o driver deste tipo utilizan protocolos de red que estn incluidos en el SGBD (
Sistema deGestin de Bases de Datos ), y por lo tanto los drivers se comunican de formadirecta con la
base de datos, utilizando tambin sockets de Java. Es el mejorde los 4 drivers ya que esta escrito por
completo en Java. La mayora de estoscontroladores son provistos por el fabricante del SGBD.

Es el controlador ms independiente de la plataforma de los cuatrovistos.

Este controlador traduce las ordenes JDBC directamente al protocolode red


que implementa o emplea el SGBD

Ejemplo JDBC-ODBC con AWT yAccess


Ejemplode bases de datos en java utilizando el puente JDBC -ODBC:
Ejemplo de Datos personales con basede datos(Fuente: Manual avanzado de Java - Felipe Lima Daz Anaya Multimedia)

265

Ejemplo del CURP con base dedatos


Solo elcdigo
datospersonales.java
Cdigo y la base de datos
datospersonales.zip
Solo elcdigo
Curp2.java
Cdigo y la base dedatos
Curp2.zip
Ejecucin:
Para ejecutar el ejemploteclee:
java DatosPersonales
Salida:
Al dar clic en el botnCrear

Al dar clic en el botn Insertar

Al dar clic al botn Incluir se limpian loscampos y puedes insertar otro registro.

266

Al darle clic al botn Terminar desaparece elcuadro de dilogo Insertar datos.


Si le das clic al botn Ver puedes ver losregistros incluidos en la base de datos:

Dale clic al botn de Terminar y luego al deCerrar para finalizar.


Si checas la base de datos Datospersonales.dbm y ves la tabla te dars cuenta que se insertaron
dosregistros:

267

Nota: Sivuelves a correr el programa y le das clic al botn Crear, los registros seborrarn y se crear
otra vez la tablaDATOSPERSONALES.

Como obtener un origen de datosODBC


1. Ir al Panel de control y ubicar el origende datos ODBC que tiene el nombre orgenes de datos ODBC

2. Junto a la ficha Controladores seleccionarla ficha DNS de usuario. Darle clic al botn de Agregar...
para agregar elorigen de datos "Personal" .
Aparecern los controladores ODBC que seencuentran ya instalados, en ste caso se escogera el
controlador "MicrosoftAccess Driver".

268

3. Una vez elegido el tipo de controladoraparecer una pantalla con el cuadro de dialogo Configuracin de ODBCMicrosoft Access - , en ste cuadro insertars el nombre del origen de datos
(Personal ) y seleccionars la base de datos "Datospersonales.mdb", da clic enAceptar .

Cmo funciona el API JDBC.

Cmo funciona el API JDBC.

( Esta parte coinicide con la parte de


Aplicaciones de bases de datos con JDBC. - para el curso de Servlets y JSP )
La arquitectura de JDBC est basada en un conjunto de interfaces y clases de Java que permiten
conectarse con un motor de base de datos no importando de que tipo sea, crear y ejecutar sentencias
de SQL , recuperar y modificar datos de una base de datos. Esta tecnologa se detalla con
profundidad en la direccin web: http://java.sun.com/jdbc/.
Caractersticas ms importantes de sta API JDBC son:

Posibilidad de utilizar el lenguaje SQL ( Structured Query Languaje )


Acceso sencillo a todas las funciones de SQL.

269

Los resultados devueltos por SQL pueden ser tratados como objetos, de
manera tal que ,si hay errores puedan ser tratados como excepciones.

En la siguiente figura se ven las operaciones que pueden realizarse en una base de datos. Cada uno de
los rectngulos representa una clase o interfaz de JDBC que tiene un rol en el acceso a una base de
datos relacional. Todo el trabajo con el JDBC comienza con la clase DriveManager, que es la que
establece las conexiones con las fuentes de datos, mediante los drivers o controladores JDBC.

Los drivers de bases de datos JDBC se definen mediante clases que implementan la interfaz Driver.
Cada driver sabe cmo convertir peticiones SQL para una base de datos concreta. Si no disponemos
del driver adecuado, no podemos conectarlos a una base de datos, y el JDBC depende de las
implementaciones concretas de cada fabricante. Por lo tanto, lo primero que debe llevar a cabo un
programa es cargar el driver adecuado para que el cdigo de Java pueda comunicarse con la base de
datos.

2. Junto a la ficha Controladores seleccionarla ficha DNS de usuario. Darle clic al botn de Agregar...

270

para agregar elorigen de datos "Personal" .


Aparecern los controladores ODBC que seencuentran ya instalados, en ste caso se escogera el
controlador "MicrosoftAccess Driver".

3. Una vez elegido el tipo de controladoraparecer una pantalla con el cuadro de dialogo Configuracin de ODBCMicrosoft Access - , en ste cuadro insertars el nombre del origen de datos
(Personal ) y seleccionars la base de datos "Datospersonales.mdb", da clic enAceptar .

Funcionamiento de un programa de Java con JDBC.


Luego entonces, podemos describir el funcionamiento de un programa de Java con JDBC con los
siguientes pasos:

Importar las clases necesarias


Cargar el Driver JDBC
Identificar el origen de datos
Crear un objeto Connection
Crear un objeto Statement
Ejecutar una consulta con el objeto Statement - mtodo executeUpdate()
Ejecutar una consulta con el objeto Statement - mtodo executeQuery()
Liberar el objeto ResultSet
Liberar el objeto Statement
Liberar el objeto Connection.

271

Uso de un archivo de propiedades


Uso de preparedSatement

Desarrollo de aplicaciones con el API JDBC.

Importar las clases necesarias.

Siempre que se crea un programa en java para manejo de bases de datos importamos el paquete:

import java.sql.*;
recuerda que debe ser la primera instruccin dentro del archivo fuente.

Cargar el Driver.

Para conseguir una conexin con la base de datos utilizamos el mtodo Class.forName() que nos
permite cargar el Driver al crear una instancia de la clase Driver de forma dinmica. A veces se
necesita el mtodo newInstance() para asegurarse de que se esta registrando el driver de la
siguiente manera:

Class.forName("com.mysql.jdbc.Driver").newInstance();
Al hacer esto, ya esta disponible el driver JDBC para ser utilizado por el resto de los objetos necesarios
para acceder a la base de datos

Identificar el origen de datos.

Lo siguiente es construir la URL en la que se define la forma de conexin a la base de datos, el


servidor en el que esta, el nombre de la misma y un usuario con clave son necesarios para acceder a la
base de datos.
La sintaxis que se utiliza (para el caso de MySQL ) para construir la URL que servir para la conexin a
la base de datos es:

jdbc:mysql://[<servidor>][:puerto]/<nombre_basededatos>[?param1=valor
1][&param2=valor2]...[&paramN=valorN]

Los parmetros son:


Nombre
user
password
autoReconnect
maxReconnects
initialTimeout
maxRows

Uso
Nombre del usuario para acceder la
la base de datos
Contrasea de acceso a la base de
datos
Reintenta conectar de nuevo si la
conexin se rompe
Nmero de veces que se debe de
internar reconectar
Segundos de espera entre las
diferentes reconexiones
Nmero mximo de tuplas a devolver
( 0 significa todas )

Valor por omisin


ninguno
ninguno
false
3
2
0

272

useUnicode

Utiliza Unicode cuando est


manejando datos de tipo
StringcharacterEncoding Mapa
Unicode a utilizar cuando ninguno se
enven datos de tipo String

Un ejemplo : si quieres el cdigo descrgalo aqu


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
La salida del

false

Conectate.java

import java.sql.*;
public class Conectate {
public static void main ( String args[] ) throws Exception {
Connection con = null;
try {
String url = "jdbc:mysql://barbanegra/test";
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url,"","");
if ( con != null ) {
System.out.println("Se ha establecido una conexin a la base
de datos ");
}
}
finally {
if ( con != null ) {
try {
con.close();
} catch( Exception e ) {
System.out.println(
e.getMessage());
}
}
}
}
}
programa es:

Se ha establecido una conexin a la base de datos

Crear un objeto Connection

Instanciamos un objeto de la clase Connection, en el ejemplo anterior en la lnea 8 se realiza esto


mediante el mtodo getConnection() de la clase DriveManager, as:
con = DriverManager.getConnection(url,"","");
esto puede variar, as si yo quisiera conectarme a una base de datos llamada ejedgsca, con usuario
root y contrasea oagb2003, construyo la cadena conString as:
String connString = "jdbc:mysql://barbanegra/ejedgsca?user=root&password=oagb2003";
y luego creamos la conexin:
Connection conn = DriverManager.getConnection( connString );
El primer dato, jdbc, especifica la forma de conexin a la base de datos, mysql es el nombre del
fabricante o manejador de base de datos, barbanegra es el nombre de mi computadora, pero puedes
poner en su lugar el nombre de tu computadora, o poner localhost o 127.0.0.1 . El nombre

273

ejedgsca es el nombre de la base de datos que creamos para este ejercicio, y el usuario y contrasea
son opcionales, depende si quieres tener seguridad en tu base de datos, y eso lo estableces desde el
manejador de base de datos.

Crear un objeto Statement

Una vez creada la conexin a la base de datos, podemos crear sentencias o ejecutar consultas desde
nuestro programa de Java para interactuar con la base de datos. Podemos crear consultas que
modifiquen la base de datos sin devolver ningn resultado, p. ej: INSERT, ALTER, DELETE, CREATE,
DROP, o UPDATE.
El cdigo en cuestin debe presentar una estructura similar a sta, ver ejemplo:
Statement stmt;
stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO interes (interes_nombre, interes_url," +
"interes_tipo) VALUES ('" + args[0] + "', '" + args[1] + "', '" + args[2] +"')");
El mtodo createStatement() crea un canal abierto a travs del cual se pueden ejecutar consultas.

Objeto Statement - mtodo executeUpdate()

Ejecutar una consulta con el objeto Statement - mtodo executeUpdate()


El mtodo executeUpdate() es el que realmente ejecuta la consulta en la base de datos, mientras
que el mtodo close() permite liberar los recursos asignados a la conexin abierta.
El ejemplo a continuacin inserta tuplas a una tabla llamada interes perteneciente a la base de datos
ligas.
Ejemplo: si quieres el cdigo descrgalo aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.

Insertame.java

import java.sql.*;
public class Insertame {
public static void main ( String args[] ) throws Exception {
Connection con = null;
Statement stmt = null;
try {
String url = "jdbc:mysql://barbanegra/ligas";
String usuario = "yomismo";
String contrasea = "santoysea";
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url,usuario,contrasea);
if ( con != null )
System.out.println("Se ha establecido una conexin a la base de datos " +
"\n " + url );
stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO interes (interes_nombre, interes_url," +
"interes_tipo) VALUES ('" + args[0] + "', '" + args[1] + "', '" + args[2] +"')");
System.out.println("Los valores han sido agregados a la base de datos ");

274

23.
}
24.
catch( SQLException e ) {
25.
e.printStackTrace();
26.
}
27.
28.
finally {
29.
if ( con != null ) {
30.
try {
31.
con.close();
32.
stmt.close();
33.
} catch( Exception e ) {
34.
System.out.println( e.getMessage());
35.
}
36.
}
37.
}
38.
}
39.
}
Ejemplo de ejecucin del programa:
C:\j2sdk141\ejemplos\bdmysql>javac Insertame.java
C:\j2sdk141\ejemplos\bdmysql>java Insertame UNAM http://www.unam.mx educativo
Se ha establecido una conexin a la base de datos
jdbc:mysql://barbanegra/ligas
Los valores han sido agregados a la base de datos
C:\j2sdk141\ejemplos\bdmysql>java Insertame IPN http://www.ipn.mx educativo
Se ha establecido una conexin a la base de datos
jdbc:mysql://barbanegra/ligas
Los valores han sido agregados a la base de datos
C:\j2sdk141\ejemplos\bdmysql>java Insertame "Aeropuertos y Servicios Auxiliares" http://www.asa.gob.mx
gobierno
Se ha establecido una conexin a la base de datos
jdbc:mysql://barbanegra/ligas
Los valores han sido agregados a la base de datos

Objeto Statement - mtodo executeQuery().

Ejecutar una consulta con el objeto Statement - mtodo executeQuery()

Las consultas de recuperacin de tuplas o registros se ejecutan con el mtodo executeQuery() .


Este mtodo devuelve un objeto ResultSet, el cual puede usarse para acceder a cada una de los
registros devueltos:

Connection con = null;


Statement stmt = null;
ResultSet rs = null;
try {
...
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url,usuario,contrasea);
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT interes_nombre, interes_url, interes_tipo FROM interes

275

LIMIT 5");
Ya creado el objeto ResultSet, la forma mas fcil de conseguir esto consiste en usar un bucle

while y el mtodo next() , as:

while ( rs.next() ) {
/* Haga algo con los resultados */
}

Para recuperar los valores de los campos de una tabla el procedimiento consiste en manejar los
resultados mediante la asignacin de los valores de las columnas a variables, en funcin del tipo de
valor. Hay funciones para distintos tipos, as getInt() recupera un valor entero, getDoble()
recupera un valor double, y getString() se encarga de la manipulacin del texto. Todos estos
mtodos aceptan tanto el nmero ( indexado a partir del 1 ) as como el nombre de la columna como
argumento:
while ( rs.next() ) {
String inom = rs.getString("interes_nombre");
String iurl = rs.getString("interes_url");
String itip = rs.getString("interes_tipo");
System.out.println("Sitio Web "+ (i++) + ":\n"
+ inom + "\n"
+ iurl + "\n"
+ itip + "\n\n" );
}
Ejemplo: si quieres el cdigo descrgalo aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.

Seleccioname.java

import java.sql.*;
public class Seleccioname {
public static void main ( String args[] ) throws Exception {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
String url = "jdbc:mysql://barbanegra/ligas";
String usuario = "yomismo";
String contrasea = "santoysea";
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url,usuario,contrasea);
if ( con != null )
System.out.println("Se ha establecido una conexin a la base de datos " +
"\n " + url );
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT interes_nombre, interes_url, interes_tipo FROM interes
LIMIT 5");

22.
23.
24.
25.
26.
27.
28.
29.

System.out.println("Los valores han sido agregados a la base de datos ");


int i=1;
while ( rs.next() ) {
String inom = rs.getString("interes_nombre");
String iurl = rs.getString("interes_url");
String itip = rs.getString("interes_tipo");
System.out.println("Sitio Web "+ (i++) + ":\n"
+ inom + "\n"

276

30.
+ iurl + "\n"
31.
+ itip + "\n\n" );
32.
}
33.
}
34.
catch( SQLException e ) {
35.
e.printStackTrace();
36.
}
37.
38.
finally {
39.
if ( rs != null ) {
40.
try {
41.
rs.close();
42.
} catch( SQLException e ) {
43.
System.out.println( e.getMessage());
44.
e.printStackTrace();
45.
}
46.
}
47.
if ( stmt != null ) {
48.
try {
49.
stmt.close();
50.
} catch( SQLException e ) {
51.
System.out.println( e.getMessage());
52.
e.printStackTrace();
53.
}
54.
}
55.
if ( con != null ) {
56.
try {
57.
con.close();
58.
} catch( SQLException e ) {
59.
System.out.println( e.getMessage());
60.
e.printStackTrace();
61.
}
62.
}
63.
64.
}
65.
}
66.
}
La salida al ejecutar este programa es:
Se ha establecido una conexin a la base de datos
jdbc:mysql://barbanegra/ligas
Los valores han sido agregados a la base de datos
Sitio Web 1:
UNAM
http://www.unam.mx
educativo
Sitio Web 2:
IPN
http://www.ipn.mx
educativo
Sitio Web 3:
Aeropuertos y Servicios Auxiliares
http://www.asa.gob.mx
gobierno

Liberar objetos ResultSet, Statement y Connection


Liberar objetos ResultSet, Statement y Connection
Siempre que se trabaja con bases de datos, al finalizar la interaccin con ella, hay que cerrar los
conjuntos de resultados, sentencias y conexiones empleados, en todos los casos utilizamos el mtodo

277

close(), y hay que verificar si en ese proceso hubo alguna excepcin, porque el mtodo close(),
puede reportar algn evento de error y hay que capturarlo.

Liberar el objeto ResultSet

En el ejemplo anterior de la lnea 39 hasta la lnea 45 liberamos el objeto ResultSet .


38.
39.
40.
41.
42.
43.
44.
45.

finally {
if ( rs != null ) {
try {
rs.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}

Liberar el objeto Statement

Posteriormente en el mismo ejemplo anterior de la lnea 47 hasta la lnea 54 liberamos el objeto


Statement .
47.
48.
49.
50.
51.
52.
53.
54.

if ( stmt != null ) {
try {
stmt.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
}

Liberar el objeto Connection.

Finalmente en el mismo ejemplo anterior de la lnea 47 hasta la lnea 54 liberamos el objeto


Connection .
55.
56.
57.
58.
59.
60.
61.

if ( con != null ) {
try {
con.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
Liberar objetos ResultSet, Statement y Connection

Liberar objetos ResultSet, Statement y Connection


Siempre que se trabaja con bases de datos, al finalizar la interaccin con ella, hay que cerrar los
conjuntos de resultados, sentencias y conexiones empleados, en todos los casos utilizamos el mtodo
close(), y hay que verificar si en ese proceso hubo alguna excepcin, porque el mtodo close(),
puede reportar algn evento de error y hay que capturarlo.

Liberar el objeto ResultSet

278

En el ejemplo anterior de la lnea 39 hasta la lnea 45 liberamos el objeto ResultSet .


38.
39.
40.
41.
42.
43.
44.
45.

finally {
if ( rs != null ) {
try {
rs.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}

Liberar el objeto Statement

Posteriormente en el mismo ejemplo anterior de la lnea 47 hasta la lnea 54 liberamos el objeto


Statement .
47.
48.
49.
50.
51.
52.
53.
54.

if ( stmt != null ) {
try {
stmt.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
}

Liberar el objeto Connection.

Finalmente en el mismo ejemplo anterior de la lnea 47 hasta la lnea 54 liberamos el objeto


Connection .
55.
56.
57.
58.
59.
60.
61.

if ( con != null ) {
try {
con.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}

Uso de un archivo de propiedades.

Un archivo de propiedades contiene los parmetros necesarios para la conexin a la base de datos.
Bsicamente es un archivo de texto cuyas entradas responden al formato nombre=valor.
Normalmente, este archivo se guarda con la extensin .properties cuando se utiliza en Java.
Una vez creado el archivo de propiedades, podemos usar la clase ResourceBundle del paquete
java.util.*; para acceder a l, asi:
ResourceBundle bundle = ResourceBundle.getBundle( "NombreDelArchivoDePropiedades" );
String nomb = bundle.getString("nombre");
Veamos un ejemplo:

279

1. Cree un nuevo archivo de texto con un editor de texto


2. Escriba en l, los valores de Driver, URL, User, y Password.
Driver=com.mysql.jdbc.Driver
URL=jdbc:mysql://barbanegra/ligas
User=yomismo
Password=oscar
3. Este archivo de propiedades tiene los cuatro parmetros de acceso, Tambin
opcionalmente se puede aadir el nombre del host correspondiente al URL , no es
necesario poner comillas para especificar los valores de los parmetros.
4. Guarde el archivo como ligas.propierties.
Conviene guardar este archivo de propiedades en la misma carpeta o directorio donde estn los scripts
o programas de Java que hacen uso del mismo.
5. Modificaremos el archivo Conectate.java y a la nueva versin le daremos el nombre de
Conectate2.java. Esto lo puedes hacer con tu herramienta de desarrollo IDE de Java
que ests utilizando.
6. Hay que importar las clases del paquete java.util.*; , y haz los cambios necesarios.
Aqu tienes a continuacin el cdigo:
Ejemplo: si quieres el cdigo descrgalo aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.

Conectate2.java

import java.sql.*;
import java.util.*;
public class Conectate2 {
public static void main ( String args[] ) throws Exception {
Connection con = null;
ResourceBundle bundle = ResourceBundle.getBundle( "ligas" );
try {
String url = bundle.getString("URL");
Class.forName( bundle.getString("Driver") ).newInstance();
con = DriverManager.getConnection( url,
bundle.getString("User"),
bundle.getString("Password") );
if ( con != null ) {
System.out.println("Se ha establecido una conexin a la base de datos ");
}
}
finally {
if ( con != null ) {
try {
con.close();
} catch( Exception e ) {
System.out.println( e.getMessage());
}
}
}
}

32.
}
La salida de ste programa es:
C:\j2sdk141\ejemplos\bdmysql>java Conectate2
Se ha establecido una conexin a la base de datos

280

Uso de PreparedStatement.

Es otra forma de lanzar consultas sobre una base de datos pero de tal manera que stas sean
dinmicas. Para esto hay que especificar despus de que se haga la consulta , una serie de
parmetros mediante los mtodos de la interface PreparedStatement, veamos el siguiente ejemplo:
String valor1 = "UNAM";
String valor2 = "educativo";
String query = "SELECT interes_nombre, interes_url, interes_tipo FROM
interes" +
" WHERE interes_nombre = ? AND interes_tipo = ?";
PreparedStatement pstmt = con.prepareStatement( query );
pstmt.setString( 1 , valor1 ); // el 1 indica que es el 1er. parmetro y
// establece ese valor al RecordSet
pstmt.setString( 2, valor2 ); // el 2 indica que es el 2do. parmetro y
// establece es valor al
RecordSet
rs = pstmt.executeQuery();
El smbolos de interrogacin ? notifican al objeto ResultSet rs, que le sern enviados una serie de
valores que sern remplazados por stos smbolos , con el fin de completar la consulta y que sta
pueda ser ejecutada con el mtodo executeQuery().
Para establecer los valores utilizamos mtodos setXxx() , as para el primero de los valores, la
columna interes_nombre se utiliza el mtodo setString( 1, valor1 ) y para el segundo el mtodo
setString( 2, valor2 ), porque ambos son de tipo varchar en la base de datos. Pero si fueran de
otro tipo usaramos setInt( ), setDouble( ), setFloat( ), setBoolean( ), setDate( ), etc..
Una vez establecidos todos los valores de los parmetros, se puede ejecutar la consulta como se ha
hecho hasta ahora, porque la interface PreparedStatement tambin dispone de los mismos
mtodos que Statement para ejecutar las consultas de la base de datos, al heredar de Statement.
Ejemplo: si quieres el cdigo descrgalo aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.

PreparaUnStatement.java

/** Programa de java que ejemplifica como utilizar los contenidos


import java.sql.*;
public class PreparaUnStatement {
public static void main ( String args[] ) throws Exception {
Connection con = null;
ResultSet rs = null;
PreparedStatement pstmt = null;
try {
String url = "jdbc:mysql://barbanegra/ligas";
String usuario = "root";
String contrasea = "";
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url,usuario,contrasea);
if ( con != null )
System.out.println("Se ha establecido una conexin a la base de datos " +
"\n " + url );

281

22.
String valor = "tecnologa";
23.
24.
String query = "SELECT interes_nombre, interes_url, interes_tipo FROM interes" +
25.
" WHERE interes_tipo = ?";
26.
28.
System.out.println("Los registros de la base de datos que concuerdan con: \n"
29.
+ query + "\n donde el valor de ? es: "
30.
+ valor + "\n son los siguientes : \n" );
31.
32.
pstmt = con.prepareStatement( query );
33.
34.
pstmt.setString( 1 , valor ); // el 1 indica que es un parmetro
35.
36.
rs = pstmt.executeQuery();
37.
38.
int i=1;
39.
while ( rs.next() ) {
40.
String inom = rs.getString("interes_nombre");
41.
String iurl = rs.getString("interes_url");
42.
String itip = rs.getString("interes_tipo");
43.
System.out.println("Sitio Web "+ (i++) + ":\n"
44.
+ inom + "\n"
45.
+ iurl + "\n"
46.
+ itip + "\n\n" );
47.
}
48.
pstmt.clearParameters();
49.
}
50.
catch( SQLException e ) {
51.
e.printStackTrace();
52.
}
53.
54.
finally {
55.
if ( rs != null ) {
56.
try {
57.
rs.close();
58.
} catch( SQLException e ) {
59.
System.out.println( e.getMessage());
60.
e.printStackTrace();
61.
}
62.
}
63.
if ( pstmt != null ) {
64.
try {
65.
pstmt.close();
66.
} catch( SQLException e ) {
67.
System.out.println( e.getMessage());
68.
e.printStackTrace();
69.
}
70.
}
71.
if ( con != null ) {
72.
try {
73.
con.close();
74.
} catch( SQLException e ) {
75.
System.out.println( e.getMessage());
76.
e.printStackTrace();
77.
}
78.
}
79.
80.
}
81.
}
82.
}
La salida del programa es:
C:\j2sdk141\ejemplos\bdmysql>java PreparaUnStatement

282

Se ha establecido una conexin a la base de datos


jdbc:mysql://barbanegra/ligas
Los registros de la base de datos que concuerdan con:
SELECT interes_nombre, interes_url, interes_tipo FROM interes WHERE interes_tipo = ?
donde el valor de ? es: tecnologa
son los siguientes :
Sitio Web 1:
Sun
http://www.sun.com
tecnologa
Sitio Web 2:
nasa
http://www.nasa.gov
tecnologa
Sitio Web 3:
microsoft
http://www.microsoft.com
tecnologa

La interface PreparedStatement tambin dispone de un mtodo llamado clearParameter() que es


usado para liberar los ltimos parmetros utilizados y dejar libre el paso a otros. Su uso no es
obligado, pero es de gran ayuda cuando se utiliza la misma consulta en situaciones diferentes y con
valores de parmetros diferentes, ya que al ejecutar ste mtodo se asegura que los valores utilizados
en la primera consulta no son utilizados en la segunda, si previamente se utiliza ste mtodo.

13. Aplicaciones Web con tecnologa Java


Objetivo: Java comprende un conjunto de tecnologas que han revolucionado el desarrollo de los
sistemas informticos y que pueden ser empleadas en el desarrollo de sistemas de alto
rendimiento y complejidad.
Un tipo particular de aplicaciones que han tenido un amplio crecimiento son las relacionadas con
el manejo de bases de datos y la generacin de contenido dinmico para la puesta en marcha de
sitios Web. Con la combinacin de las herramientas JSP y JDBC se pueden crear para los
usuarios de Internet una gran variedad de servicios, como; catlogos en lnea, portales, tiendas
virtuales, herramientas de comercio electrnico y en general, cualquier sistema que requiera del
manejo de la informacin a travs del Web.
Todas estas aplicaciones pueden ser desarrolladas e implementadas con estas tecnologas que son
basadas en Java, esto es, son un subconjunto del lenguaje de programacin Java, y obtener
buenos resultados en el consumo de recursos, tiempos y desarrollo y confiabilidad del producto
final.
1.Tecnologas para Generar Pginas Dinmicas
Objetivo: Java comprende un conjunto de tecnologas que han revolucionado el
desarrollo de los sistemas informticos y que pueden ser empleadas en el desarrollo de
sistemas de alto rendimiento y complejidad.
Un tipo particular de aplicaciones que han tenido un amplio crecimiento son las
relacionadas con el manejo de bases de datos y la generacin de contenido dinmico
para la puesta en marcha de sitios Web. Con la combinacin de las herramientas JSP y
JDBC se pueden crear para los usuarios de Internet una gran variedad de servicios,
como; catlogos en lnea, portales, tiendas virtuales, herramientas de comercio
electrnico y en general, cualquier sistema que requiera del manejo de la informacin a
travs del Web.
Todas estas aplicaciones pueden ser desarrolladas e implementadas con estas

283

tecnologas que son basadas en Java, esto es, son un subconjunto del lenguaje de
programacin Java, y obtener buenos resultados en el consumo de recursos, tiempos y
desarrollo y confiabilidad del producto final.

Indice

1.Tcnologas paraGenerar Pginas Dinmicas


1. Qu es unServlet?
2. Qu es JSP?
3. JSP o Servlets?
4. Aplicaciones de bases de datos con JDBC.
5. Ejemplo JDBC conJSP
2.Servidores Web con Soporte para JSP'S
1. ApacheTomcat.
1. Obtener elApache-Tomcat (para plataforma Windows ).
2. Instalacin yconfiguracin de Tomcat
3. Configurar lasvariables de ambiente para Apache-Tomcat
4. Arrancar elservidor Tomcat 4.1
5. Parar elservidor Tomcat 4.1
6. Arranque automtico del servidor Tomcat ( para Windows)
2. Resing Application Server. (enconstruccin)
3. Instalacin y configuracin de un servidor. (enconstruccin)
3.La Tecnologa JSP
1. ArquitecturaJSP.
2. Incorporarcontenido Java en una pgina HTML.
1. Declaraciones.
2. Expresiones.
3. Scriptlets.
3. Directivas.
1. Directiva page.
2. Directiva include.
4. Objetosimplcitos.
1. Objeto page.
2. Objetoconfig.
3. Objetorequest.
4. Objetosesin.
5. Objetoapplication.
5. Uso de JavaBeanscon JSP
1. Qu es unJavaBean?
2. Acceder alas propiedades de un JavaBean.
3. Establecer lapropiedades de un JavaBean.
4.La Tecnologa JDBC
1. El API JDBC
2. Tipos decontroladores.
3. Desarrollo de aplicaciones con el API JDBC.
1. Cargar elcontrolador JDBC.
2. Establecer unaconexin.
3. Enviar consultas.
4. Procesar losresultados.
5. Cerrar laConexin.

1.1 Qu es un Servlet?
Losservletsson clases de Javaque amplan la funcionalidad de un servidor Web mediante la
generacin dinmicade pginas Web. Un entorno de ejecucin denominadomotor
deservletsadministra la carga y descarga del servlet, y trabaja con elservidor Web HTTP para
dirigir las peticiones de los usuarios remotos(clientes) a los servlets y enviar la respuesta a los

284

clientes. Aparecen en1997 y poco a poco se han convirtiendo en el entorno dominante de


laprogramacin Java en servidor.
Los servlets nacen para cubrir laslimitaciones de los applets , a saber:

Limitacin al acceso de otro servidor que nosea el mismo en que se aloje el


applet.
Limitacin en el acceso a los servicios delservidor
Limitaciones de seguridad. (ingenierainversa para retocar el applet, para acceso
a la lgica del negocio del sistemaen cuestin)

El siguiente ejemplo de tu primer servlet, maneja el mtodo doGet paradar salida por el
navegador a los mensajes con el mtodo println del objetosalida de la clase PrintWriter.
Checa que cuando hagas un servlet debes importar javax.servlet.*; yjavax.servlet.http.* y tu
clase debe heredar de HttpServlet.
Ejemplo de tu primer servlet:Descrgalo dando clic aqu Checa1erServlet.java
package oscaruno;
import java.io.*;
import java.util.*;
importjavax.servlet.*;
import javax.servlet.http.*;

public classCheca1erServlet extends HttpServlet {


public void doGet( HttpServletRequestreq, HttpServletResponse res ) throws ServletException,
IOException{
PrintWriter salida;
res.setContentType("text/html");
salida =res.getWriter();
salida.println("<html>");
salida.println("<head><title>Checa MiServlet</title></head>");
salida.println("<body>");
salida.println("<h1>Estoes una prueba de un servlet , etc..</h1><br>");
salida.println("<h2>Bienvenido al curso deservlets y JSP de Oscarin , ao2003</h2><br>");
salida.println("<table border = 3 width =400><th>Te doy a fecha con newDate():</th><tr>");
salida.println("<td>Hola, hoy es: " +new Date() +"</td>");
salida.println("</tr></table>");
salida.println("</body></html>");
}
}// fin de Checa1erServlet

La salida es:

285

Ventajas de los Servlets vs CGI


Hoyen da las aplicaciones CGI tienden a desaparecer debido a los siguientesinconvenientes:
Como estan diseados para lenguajes interpretados como el PERLdisminuan el
rendimiento de los programas que se ejecutaban. Una alternativaera
compilarlos, pero no eran la mejor alternativa por la dependencia que segeneraba
con la plataforma en que se compilaban
Como todo programa CGI se ejecutaba como un proceso independiente,se puede
llegar a la conclusin, que el arranque de todo CGI requiere un tiempobastante
importante y que a al momento de realizar aplicaciones crticas conellos se hace
casi imposible.
Cuando se desea que un CGI invoque a otro CGI se tiene el problemade ejecucin
de dos procesos independientes, ademas la comunicacin entre ellosse deba
hacer mediante archivos, lo que da una idea del tiempo que tomabaacceder a
dichos archivos. Es por lo tanto una programacin muy difcil si loque se quera
lograr eran tiempos razonables a costa de la sobrecarga delservidor.
Caractersticas de los Servlets
I.
II.
III.
IV.
V.
VI.
VII.
VIII.
IX.

Las caractersticas que hacen que los servlets superen a los CGIson:
Son 100% puro Java, lo que los hacen multiplataforma
Es un Lenguaje Orientado a Objetos y por lo tanto poseen todas lascaractersticas
que se derivan de esto.
Puede utilizar todas las tecnologas de Java : clases dealmacenamiento, hilos o
threads, acceso a bases de datos, flujos de E/S, RMI,acceso a la red, etc.
No cargan al servidor con excesivo procesamiento de peticionesdebido a que en la
primera peticin, el servidor Web crea un proceso para elservlet, y en las
posteriores peticiones, crea hilos (threads) de ejecucin deeste proceso.
Son mucho ms rpidos que los CGI ya que estn precompilados ydebido al punto
anterior, no se generan procesos independientes cada vez que sesolicita una URL
( como suele suceder con CGI )
Son seguros ya que aplican el Security Manager de Java
La comunicacin con otros servlets es muy sencilla
Mediante el manejo de excepciones los errores pueden manejarsesencillamente
durante la ejecucin del servlet.

Veamos ahora un pequeo servlet que produce las tablastrigonomticas. Este nos servir de
referencia para cuando comencemos a ver laspginas JSP, ya que generaremos la misma tabla
trigonomtica que genera steservlet con una JSP, y analizaremos la relacin que hay entre un
servlet y unaJSP.
Ejemplo de un Servlet que produce una tabla de funcionesTrigonomtricas
Dale clic aqu para descargar el cdigo SenoServlet.java
/** Programa de java que ejemplifica el de unServlet que
* imprime una tabla trigonomtrica
* Fuente: Adaptado dellibro Manual de referencia JSP de Phil Hanna
* Capitulo 2. Editorial McGraw- Hill
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha :18/03/2003
* Archivo:SenoServlet.java
*/
packageoscaruno;
import java.io.*;
import java.text.*;

286

importjava.util.*;
import javax.servlet.*;
importjavax.servlet.http.*;
/**
* Imprime la tabla trigonomtrica del seno,coseno,
* tangente y cotangente
*/
public class SenoServlet extendsHttpServlet
{
private static final DecimalFormat FMT1
= newDecimalFormat("#0");
private static final DecimalFormat FMT2
= newDecimalFormat("#0.0000");
private static final String PAGE_TOP = ""
+"<HTML>"
+ "<HEAD>"
+ "<TITLE>Tablas trigonomtricas -Seno</TITLE>"
+ "</HEAD>"
+ "<BODY>"
+"<H3><CENTER>Tabla de la funcinSeno</CENTER></H3>"
+ "<TABLE ALIGN =\"CENTER\" BORDER=1CELLPADDING=3 CELLSPACING=0>"
+ "<TR>"
+ "<TH ALIGN=\"CENTER\">Grado</TH>"
+ "<TH ALIGN=\"CENTER\">Seno</TH>"
+ "<TH ALIGN=\"CENTER\">Coseno</TH>"
+ "<TH ALIGN=\"CENTER\">Tangente</TH>"
+ "<TH ALIGN=\"CENTER\">Cotangente</TH>"
+ "</TR>"
;
privatestatic final String PAGE_BOTTOM = ""
+ "</TABLE>"
+"</BODY>"
+ "</HTML>" ;
public voiddoGet(
HttpServletRequest request,
HttpServletResponse response)
throwsServletException,IOException
{
response.setContentType("text/html");
PrintWriter out =response.getWriter();
out.println(PAGE_TOP);
for (double gdo = 0;gdo<= 45; gdo += 1.0) {
out.println("<TR>");
out.println("<TDALIGN =\"CENTER\"><font face=\"Arial\" size=1>"
+ FMT1.format(gdo)+ "</font></TD>");
out.println("<TD ALIGN=\"CENTER\"><font face=\"Arial\" size=1>"
+FMT2.format(Math.sin(Math.toRadians(gdo))) + "</font></TD>"); //seno
out.println("<TD ALIGN =\"CENTER\"><font face=\"Arial\"size=1>"
+ FMT2.format(Math.cos( Math.toRadians(gdo)))+"</font></TD>"); // coseno
out.println("<TD ALIGN=\"CENTER\"><font face=\"Arial\" size=1>"
+ FMT2.format(Math.tan(Math.toRadians(gdo))) + "</font></TD>"); //tangente
out.println("<TD ALIGN =\"CENTER\"><font face=\"Arial\"size=1>"
+ FMT2.format(1/Math.tan( Math.toRadians(gdo))) +"</font></TD>"); // cotangente
out.println("</TR>");
}
out.println(PAGE_BOTTOM);
}
}

287

1.2 Qu es JSP?
Un JSP, ( del acrnimo en ingls JavaServerPages) es una pgina Java en Servidor y es una
plantilla para una pgina Web queemplea cdigo Java para generar un documento HTML
dinmicamente. Las JSP . LasJSP se ejecutan en un componente del servidor
denominadocontenedor deJSP, y este las traduce o convierte a servlets de Java equivalentes
ypor lo tanto, lo que se puede hacer con un JSP, tambin se puede hacer con unservlet, as que
tienen los JSP tienen las ventajas de un servlet asaber:

1.3JSP o Servlets?
Primeramente mencionaremos las ventajas de unServlet y JSP sobre los CGI y luego las Ventajas
de los JSP sobre losServlets.
Ventajas de los Servlets yJSP

Tienen un mejor desempeo y capacidad deadaptacin que los CGI, debido a que
se conservan en la memoria y manejanmltiples subprocesos.
No se requiere una configuracin especial porparte del cliente.
Soportan sesiones HTTP, lo que hace posiblela programacin de aplicaciones.
Pueden acceder a la tecnologa disponible enJava para manejar hilos o treads,
sockets o trabajo en red, conectividad conbases de datos y todo esto sin las
limitaciones de los applets delcliente.

Ventajas de los JSP


Se compilan automticamente cuando seanecesario

Su ubicacin en el espacio comn dedocumentos del servidor Web permiten


ubicarlas ms fcilmente que a losservlets
Las pginas JSP son similares a las de HTML,por lo tanto son mas compatibles con
las herramientas de desarrollo de Web (DreamWeaver , FrontPage, etc.).

288

1.4Aplicaciones de bases de datos con JDBC


Como ejemplo deun JDBC, aqu daremos las instrucciones para obtener el JDBC deMySQL y como
instalarlo en sistemas con plataforma Windows. Del sitio web http://www.mysql.com en la liga
de JDBC descargar el archivo compactado mysql-connector-java-3.0.8-stable.zip.

Al descomprimirlo aparece una carpeta con elmismo nombre y en esa carpeta hay varios archivos
y carpetas , ver siguientefigura:

Aqu tenemos dos archivos importantes:


README
contiene ayuda sobre el JDBCde MySQL
mysql-connector-java-3.0.8-stable-bin.jar
contiene las clases delpuente JDBC de MySQL
Se recomienda leer todo el archivo README. En lestn los requerimientos del JDBC de MySQL ,
la licencia, y los procedimientosde instalacin. Para los requerimientos tenemos los siguientes:
*Cualquier mquina virtual de Java que soporte JDBC-2.0 o ms reciente (JDK-1.2 omas reciente)
*Cualquier servidor MySQL que soporte la versin 9 o 10 de el protocoloMySQL.
Instalacin:
Una vez que se haya descomprimido el archivo dedistribucin mysql-connector-java-3.0.8stable.zip, para instalar el driver hay dos formas:
Ya sea copiando las carpetas "com" y "org" ytodos sus contenidos a cualquier parte que desee,
y poner dichos subdirectoriosen la variable de ambiente CLASSPATH , o..
Poner el archivo mysql-connector-java-3.0.7-stable-bin.jar en el classpath , esto es, hay
queagregar la ruta completa en la variable de ambiente CLASSPATH, o ponerlo
en$JAVA_HOME/jre/lib/ext.

289

Para el ejercicio optamos por la segundaforma.


Paso 12. Instalar el driver de JDBC de MySQL en lacarpeta %JAVA_HOME%\jre\lib\ext
Para mi computadora mi JAVA_HOME apunta a lacarpeta C:\j2sdk141 entonces hay que copiar
el archivo mysql-connector-java-3.0.7-stable-bin.jar en
C:\j2sdk141\jre\lib\ext
y en la variable de ambiente CLASSPATH hay queagregar la ruta:
%JAVA_HOME%\jre\lib\ext\mysql-connector-java-3.0.7-stable-bin.jar
o tambin
C:\j2sdk141\jre\lib\ext\mysql-connector-java-3.0.7-stable-bin.jar
Ver siguiente figura:

Una vez que ya se estableci en el casspath laruta de el driver de MySQL, haremos un programa
sencillo en Java paraprobarlo:
Paso 13. Escribir el siguiente programa enJava.Si no lo quieres escribir, descrgalo dando clic
aqu TablaGeneral2.java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.

importjava.sql.*;
/** Programade java que ejemplifica como utilizar los contenidos
de cualquiertabla dando su nombre con un parametro de entrada
al programael cual es convertido en maysculas
* @autor Oscar A. Gonzlez Bustamante
@version 1.0
Fecha :02/10/2003
Archivo:TablaGeneral2.java
*/
public classTablaGeneral2 {
publicstatic void main ( String argumentos[] ) {
if ( argumentos.length<1 ) {
System.out.println("Datos incompletos oinsufucientes");
return;

290

17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.

}
String varNombreTabla = argumentos[0];
//varNombreTabla = varNombreTabla.toUpperCase();
System.out.println("Mostrando la Tabla: " + varNombreTabla);
try {
/* cargar las clases del JDBC de MySQL */
Class.forName("com.mysql.jdbc.Driver").newInstance();
/* Establece la cadena para conectarse a la base de datoslocal */
String connString ="jdbc:mysql://barbanegra/ejedgsca?user=root";
System.out.println(" Intentando conectarse a: " + connString);
Connection conn = DriverManager.getConnection( connString);
/* Obtener el result set */
Statement stmt = conn.createStatement();
String varSQL = "SELECT * FROM " +varNombreTabla;
ResultSet rs = stmt.executeQuery( varSQL);
/* Obtiene los meta datos sobre el result set*/
ResultSetMetaData rsMeta =rs.getMetaData();
/* Despliega los nombres de las columnas como cadenas */
String varColNombres = "";
int varColCuenta = rsMeta.getColumnCount();
for ( int col = 1; col<= varColCuenta; col++ ){
varColNombres += rsMeta.getColumnName(col ) + " ";
}
System.out.println( varColNombres );
/* Despliega los valores de las columnas */
while ( rs.next() ) {
for ( int col = 1; col<= varColCuenta; col++ ){
System.out.print( rs.getString( col ) +" ");
}
System.out.println();
}
/* limpieza */
rs.close();
stmt.close();
conn.close();
}
catch ( Exception e ) {
e.printStackTrace();
}
}// findel main()
}// fin deTablaGeneral2

La salida delprograma es:


C:\j2sdk141\bin\java.execlasspath"C:\j2sdk141\jre\lib\rt.jar;C:\j2sdk141\lib\tools.jar;C:\j2sdk141\jre\lib\ext\mysqlconnector-java-3.0.8-stablebin.jar;C:\j2sdk141\ejemplos;C:\j2sdk141\ejemplos\bdmysql"TablaGeneral2 alumnox
Mostrando la Tabla: alumnox
Intentando conectarse a:jdbc:mysql://barbanegra/ejedgsca?user=root
al_id al_apellidos al_nombreal_cargo al_tratamiento al_exa1 al_exa2 al_exa3 al_promedio
al_calificacion
1 Davolio Nancy Representante deVentas Srta. 8 8.19 7.04 null null

291

2 Fuller Andrew Vicepresidentecomercial Dr. 8 9 6 null null


3 Leverling Janet Representantede Ventas Srta. 8 8 8 null null
4 Peacock Margaret Representantede Ventas Sra. 8.32 8 8 null null
5 Buchanan Steven Gerente deVentas Sr. 10 8 10 null null
6 Suyama Michael Representante deVentas Sr. 8 5 8 null null
7 King Robert Representante deVentas Sr. 8.91 8 9 null null
8 Callahan Laura Cordinadorventas interno Srta. 8 1.14 5.57 null null
9 Dodsworth Anne Representante deventas Srta. 8 7.5 8 null null
Finishedexecuting
Analisis del programaTablaGeneral2.java
En la Lnea 1
import java.sql.*;
importamos el paquete API declases necesario para el manejo de bases de datos en Java. Todos
los programasque utilizan puentes JDBC lo requieren.
De la lnea 13 a la 19 estamosprogramando que el programa reciba el nombre de la tabla como
primer argumento ,as cuando corremos el programa con: java TablaGeneral2 alumnosx el
nombrealumnosx es el primer argumento y se establece como valor para la
variable varNombreTabla.
13.
14.
15.
16.
17.
18.
19.

publicstatic void main ( String argumentos[] ) {


if ( argumentos.length<1 ) {
System.out.println("Datos incompletos oinsufucientes");
return;
}
String varNombreTabla = argumentos[0];

Dentro del try de la lnea 24 ala 30 utilizamos el mtodo de claseforName, de la claseClass del
paquete java.lang para cargar el controlador o driver JDBC de MySQL. Elargumento
deforName es el url del controlador o driver, el cual indicaque com.mysql es el nombre de la
empresa u organizacin que desarrollo eldriver, jdbc.Driver indica que es un puente de tipo jdbc o
puente 4.
23.
24.
25.
26.
27.
28.
29.
30.

/* cargar las clases del JDBC de MySQL */


Class.forName("com.mysql.jdbc.Driver").newInstance();
/* Establece la cadena para conectarse a la base de datoslocal */
String connString ="jdbc:mysql://barbanegra/ejedgsca?user=root";
System.out.println(" Intentando conectarse a: " + connString);
Connection conn = DriverManager.getConnection( connString);

Una vez cargado el driver, se establece laconexin a la base de datos local. Para conectarse a la
base de datos, senecesita usar el url JDBC con el siguiente formato:
jdbc:mysql://[hostname][,failoverhost...][:port]/[dbname][?param1=value1][&param2=value2]....
.
Los parmetros son:

292

NombreUsoValor poromisinuserNombre del usuario paraacceder la la base de


datosningunopasswordContrasea de acceso a labase de datosningunoautoReconnectReintenta
conectar denuevo si la conexin se rompefalsemaxReconnectsNmero de veces que sedebe de
internar reconectar3initialTimeoutSegundos de espera entrelas diferentes
reconexiones2maxRowsNmero mximo de tuplas adevolver ( 0 significa todas
)0useUnicodeUtiliza Unicode cuandoest manejando datos de tipo StringcharacterEncoding Mapa
Unicode a utilizarcuando ninguno se enven datos de tipo Stringfalse
pero para nuestro ejemplo concreto la cadenaes:
String connString ="jdbc:mysql://barbanegra/ejedgsca?user=root";

barbanegraes el nombre de mi computadora,pero puedes poner en su lugar el nombre de tu


computadora, o poner localhost o 127.0.0.1 . El nombreejedgsca es elnombre de la base de

datos que creamos para este ejercicio, y el usuario ycontrasea son opcionales, depende si
quieres tener seguridad en tu base dedatos, y eso lo estableces desde el motor de MySQL con el
comando mysqladmin ocon el monitor de mysql.
En la lnea 30 utilizas el mtodo getConnection de la claseConnectionpara establecer la
conexina la base de datos y se utiliza la variable connString como suargumento.
De la lnea 33 a la 35 estamos creado un objetode la clase Statement, el cul nos sirve para
crear una sentencia deSQL. El mtodoexecuteQuery utiliza la cadena varSQL para realizar
unaconsulta de todas las tuplas o registros de la tabla alumnox , estas tuplas estn contenidas
en rsque es un objeto de la claseResultSetysirve para manejar conjuntos de registros de una
consultadeterminada.
32.
33.
34.
35.

/* Obtener el result set */


Statement stmt = conn.createStatement();
String varSQL = "SELECT * FROM " +varNombreTabla;
ResultSet rs = stmt.executeQuery( varSQL);

En la lnea 38 utilizamos el mtodogetMetaDatade la claseResultSet para obtener los


metadatos dela consulta, y este mtodo regresa una instancia de la claseResultSetMetaData.
En la lnea 42 obtenemos el nmero de columnas con elmtodogetColumnCount() de la
claseResultSetMetaData, para queposteriormente en el ciclo for de las lneas 43 y 44
obtengamos el nombre de loscampos de la consulta con el mtodogetColumnName, haciendo
unaconcatenacin de esos nombres en la variable String varColNombres.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.

/* Obtiene los meta datos sobre el result set*/


ResultSetMetaData rsMeta =rs.getMetaData();
/* Despliega los nombres de las columnas como cadenas */
String varColNombres = "";
int varColCuenta = rsMeta.getColumnCount();
for ( int col = 1; col<= varColCuenta; col++ ){
varColNombres += rsMeta.getColumnName(col ) + " ";
}
System.out.println( varColNombres );

Luego en la lnea 49 mediante el mtodonext()delRecodSetmovemos el puntero del cursor que


apunta a la tuplaactual, para que en el ciclo for anidado en las lneas 50 y 51 obtengamos elvalor
de las columnas como String con el mtodogetString( )del RecordSete imprimamos su valor
con el mtodo print().
48. /* Despliega los valores de las columnas */

293

49.
50.
51.
52.
53.
54.

while ( rs.next() ) {
for ( int col = 1; col<= varColCuenta; col++ ){
System.out.print( rs.getString( col ) +" ");
}
System.out.println();
}

Finalmente cerramos la el objetoConnection pero antes tambin tenemos que cerrar los flujos
delStatementyRecordSeten el orden inverso en que se instanciaron:
56.
57.
58.
59.

/* limpieza */
rs.close();
stmt.close();
conn.close();

1.4.1 Ejemplo JDBC con JSP

LA TECNOLOGA JDBC
Estatecnologa nos permite mediante programas de Java o desde una JSP , realizarconexiones a
una base de datos y ejecutar sentencias de SQL para hacer consultassobre ella . Esta tecnologa
se detalla con profundidad en la direccinweb: http://java.sun.com/jdbc/.
El API JDBC
El API JDBC es una tecnologaestndar creada por Sun y su uso permite al desarrollador de
pginas de Java yJSP tener conexin con un motor de base de datos no importando de que
tiposea.
Caractersticas ms importantesde sta API JDBC son:

Posibilidad de utilizar el lenguaje SQL ( StructuredQuery Languaje )

Acceso sencillo a todas las funciones deSQL.

Losresultados devueltos por SQL pueden ser tratados como objetos, de manera
tal que ,
si hay errores puedan ser tratados comoexcepciones.

El API JDBC de Sun esta inspirado en lafilosofa del estndar ODBC ( Open Data Base
Conectivity ) creado porMicrosoft. Esta filosofa se basa en crear un estndar para el uso de
cualquierbase de datos utilizando el lenguaje Java. Es por esto que Sun creo unaespecie de
pasarela o puente entre JDBC y ODBC . Este puente se encarga derealizar la conversin de las
llamadas del JDBC a ODBC de forma totalmentetransparente para el programador. EL puente
JDBC-ODBC no es la solucin masadecuada, ya que hay un proceso de conversin de una API a
otra y es motivo demal rendimiento en una aplicacin cuando se hace uso masivo de consultas en
unabase de datos.
Tipos decontroladores.
Existen cuatro puentesdiferentes de controladores o driver JDBC definidos en la especificacin
JDBC deSun.

294

Puente 1. Los controladores de este tipo utilizan elsistema de pasarela o puente.


Un ejemplo es el JDBC-ODBC. No es la mejorsolucin porque en muchos casos
es necesario instalar un software especfico enel cliente adems de ser algo lento
en los accesos a la base dedatos.

Puente 2. Este tipo de controlador se conoce como APInativas, esto es, el


controlador contiene cdigo Jva mediante el cual serealizan las llamadas a los
mtodos nativos de la base de datos en C o C++ querealizan en acceso a la base
de datos. Algunas veces es necesario instalar unsoftware cliente para utilizar este
tipo de controladores.

Puente 3. Los drivers o controladores JDBC de estetipo se comunican con una


aplicacin intermedia en el servidor utilizandosockets que trasladan las peticiones
del programa cliente a una API especficadel controlador. Este tipo de driver tiene
la ventaja de no utilizar ningnsoftware en el cliente.

Puente 4. Los controladores o driver de ste tipoutilizan protocolos de red que


estn incluidos en el SGBD ( Sistema de Gestinde Bases de Datos ), y por lo
tanto los drivers se comunican de forma directacon la base de datos, utilizando
tambin sockets de Java. Es el mejor de los 4drivers ya que esta escrito por
completo en Java. La mayora de estoscontroladores son provistos por el
fabricante delSGBD.

Desarrollo de aplicaciones con el API JDBC.


Una de las ventajas de utilizarun API JDBC es que todas sus funciones son las mismas,
independientemente de labase de datos a utilizar, as se programa una vez para cualquier
manejador debase de datos, y se puede hacer una aplicacin para MySQL y luego llevarla a
unservidor de produccin con una motor de base de datos ms poderoso, como SQLServer o
Postgres.
Cargar elcontrolador JDBC.
El primer paso es conectarnuestro programa de Java con el servidor en que esta situada nuestra
base dedatos. En muchas ocasiones se necesitar de un nombre de usuario y contraseapara
poder acceder a la base de datos.
Cuando usamos Tomcat , parallevar a cabo la conexin con la base de datos, necesitamos que el
driver JDBC,que puede ser una archivo .jar o .class, se incluya en el CLASSPATH delentorno en
que se vaya a utilizar. En este caso ese archivo debe copiarse a lacarpeta lib, dentro de la
carpeta en que est instalado el intrprete depginas JSP. ver figura, tenemos el API JDBC de
MySQL en el archivomysql-connector-java-3.0.9-stable-bin.jar.

295

Figura: Si el sistema operativoutilizado es Windows 98/ME/NT/2000/XP se recomienda poner el


archivo .jardentro de la carpeta lib
Por supuesto , se tiene quedetener y reiniciar el servidor Tomcat, para que tome en cuenta ese
cambio. Yaque arrancamos de nuevo el servicio para que tome los cambios realizados, eldriver
JDBC para la base de datos MySQL ya esta disponible para ser utilizadodesde cualquier JSP.
Establecer unaconexin.
Seguiremos con el ejemplo de MySQL . Paraconseguir una conexin con la base de datos
utilizamos el mtodoClass.forName()que nos permite crear una instancia de una clasede forma
dinmica. A veces se necesita el mtodo newInstance() para asegurarse de que se esta
registrando el driver de la siguientemanera:

Class.forName("com.mysql.jdbc.Driver").newInstance();
Al hacer esto, ya esta disponible el driver JDBC para ser utilizado por el resto de los objetos
necesarios para acceder a la basede datos.
Lo siguiente es construir la URL en la que sedefine la forma de conexin a la base de datos, el
servidor en el que esta, elnombre de la misma y un usuario con clave son necesarios para acceder
a la basede datos.
La sintaxis que se utiliza para construir la URLque servir para la conexin a la base de datos es:
jdbc:mysql://[<servidor>][:puerto]/<nombre_basededatos>[?param1=valor1][&param2=valor2].
..[&paramN=valorN]
Los parmetros son:
NombreUsoValor poromisinuserNombre del usuario paraacceder la la base de
datosningunopasswordContrasea de acceso a labase de datosningunoautoReconnectReintenta

296

conectar denuevo si la conexin se rompefalsemaxReconnectsNmero de veces que sedebe de


internar reconectar3initialTimeoutSegundos de espera entrelas diferentes
reconexiones2maxRowsNmero mximo de tuplas adevolver ( 0 significa todas
)0useUnicodeUtiliza Unicode cuandoest manejando datos de tipo StringcharacterEncoding Mapa
Unicode a utilizarcuando ninguno se enven datos de tipo Stringfalse
pero para nuestro ejemplo concreto la cadenaes:
String connString ="jdbc:mysql://barbanegra/ejedgsca?user=root";
El primer dato,jdbc, especifica la formade conexin a la base de datos,mysql es el nombre del
fabricante omanejador de base de datos,barbanegraes el nombre de mi computadora,pero
puedes poner en su lugar el nombre de tu computadora, o poner localhost o 127.0.0.1 . El
nombreejedgsca es elnombre de la base de datos que creamos para este ejercicio, y el usuario
ycontrasea son opcionales, depende si quieres tener seguridad en tu base dedatos, y eso lo
estableces desde el motor de MySQL con el comando mysqladmin ocon el monitor de mysql.
Enviarconsultas.
Una vez creada la conexin a la base de datos,podemos crear sentencias o ejecutar consultas
desde nuestro programa de Javapara interactuar con la base de datos. Podemos crear consultas
que modifiquen labase de datos sin devolver ningn resultado, p. ej: INSERT, ALTER,
DELETE,CREATE, DROP, o UPDATE.
El cdigo en cuestin debe presentar unaestructura similar a sta, ver ejemplo:
Statement stmt;
stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO interes (interes_nombre,interes_url," +
"interes_tipo) VALUES ('" + args[0] + "', '" +args[1] + "', '" + args[2] +"')");
El mtodocreateStatement()crea uncanal abierto a travs del cual se pueden ejecutar
consultas.
Ejecutar una consulta con el objeto Statement- mtodo executeUpdate()
El mtodoexecuteUpdate()es el querealmente ejecuta la consulta en la base de datos, mientras
que el mtodoclose()permite liberar los recursos asignados a la conexinabierta.
El ejemplo a continuacin inserta tuplas a unatabla llamada interesperteneciente a la base de
datosligas.
Ejecutar una consultacon el objeto Statement - mtodo executeQuery()
Las consultas de recuperacin de tuplas oregistros se ejecutan con el mtodoexecuteQuery().
Este mtododevuelve un objeto ResultSet, el cual puede usarse para acceder acada una de los
registros devueltos:
Connectionconn= null;
Statement stmt = null;
ResultSet rs =null;
try {
/* cargar las clases del JDBC deMySQL */
Class.forName("com.mysql.jdbc.Driver").newInstance();
/* Establece la cadena para conectarse a la base dedatos local */

297

String connString = "jdbc:mysql://barbanegra/ejedgsca?user=root";


conn = DriverManager.getConnection( connString );
/* Obtener el result set */
stmt = conn.createStatement();
String varSQL = "SELECT * FROM " + varNombreTabla;
rs = stmt.executeQuery( varSQL );
/* Obtiene los meta datos sobre el result set*/
ResultSetMetaData rsMeta = rs.getMetaData();
Procesar losresultados.
Ya creado el objeto ResultSet, la forma mas fcilde conseguir esto consiste en usar un
buclewhiley el mtodonext(), as:
while ( rs.next() ){
/* Haga algocon los resultados */
}
Para recuperar los valores de los campos de unatabla el procedimiento consiste en manejar los
resultados mediante laasignacin de los valores de las columnas a variables, en funcin del tipo
devalor. Hay funciones para distintos tipos, as getInt()recupera un valor
entero,getDoble()recupera unvalor double, ygetString()se encarga de la manipulacin
deltexto. Todos estos mtodos aceptan tanto el nmero ( indexado a partir del 1 )as como el
nombre de la columna como argumento:
<%
/* Despliega losvalores de las columnas */
while ( rs.next()) {
%><TRvalign="top"><%
for ( int col = 1; col<= 10;col++ ) {
%><TD bordercolor="#C0C0C0"><font size="2" face="Arial,
Helvetica,sans-serif" color="#000000"
><%= rs.getString( col )%><BR></font></TD>
<% }
}
Ejemplo 2: Vamosa mostrar el cdigo de una JSP, que hace un select sobre la tablaalumnoxde la
base de datosejedgsca. En la figura siguiente vemos sus campos yel tipo de ellos:

298

Cdigo delEjemplo2:Teclear elsiguiente cdigo. Puedes descargarlo dndole clic con el botn
derecho aqu TablaGeneral2.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
1.
2.
<!-- Ejemplo de Acceso a una Basede Datos desde una Pgina JSP -->
3.
<@ page import="java.sql.*"%>
4.
<HTML>
5.
<HEAD>
6.
<TITLE>Desplegando unatabla usando el JDBC y MySQL</TITLE>
7.
<meta name="author" content="Oscar Alejandro Gonz&aacute;lezBustamante">
8.
<meta name="keywords" content="JSP, JDBC, MySQL, Acceso aDatos">
9.
<metaname="description" content="Un ejemplo de despliegue de una tabla usandoJSP">
10.
</HEAD>
11.
<BODY>
12.
<H2>Ejemplo de Acceso a unabase de Datos usando JSP y MySQL</H2>
13.
<% String varNombreTabla =request.getParameter("Tabla");%>
14.
<H3>Mostrando los datos desdeMySQL de la base de datos ejedgsca</H3>
15.
<%
16.
try {
17.
/* cargar las clases del JDBC de MySQL */
18.
Class.forName("com.mysql.jdbc.Driver").newInstance();
19.
20.
/* Establece lacadena para conectarse a la base de datos
21.
local */
22.
23.
String connString ="jdbc:mysql://barbanegra/ejedgsca?user=root";
24.
Connection conn = DriverManager.getConnection( connString);
25.
26.
/* Obtener el result set*/
27.
Statement stmt = conn.createStatement();
28.
String varSQL = "SELECT * FROM " + varNombreTabla;
29.
ResultSet rs = stmt.executeQuery( varSQL );
30.
/* Obtiene losmeta datos sobre el result set */
31.
ResultSetMetaData rsMeta =rs.getMetaData();
32.
%>
33.
<TABLE BORDER=1 bgcolor="#FFFFFF" cellspacing="5"><fontface="Arial, Helvetica, sansserif" color="#000000">
34.
<caption><B><%= varTablaNombre%></B></caption></font>
35.
<THEAD>
36.
<TR><%
37.
/* Despliega los nombres de las columnas como cadenas */
38.
String varColNombres ="";
39.
int varColCuenta = rsMeta.getColumnCount();
40.
for ( int col = 1; col<= varColCuenta; col++ ){
41.
%><THbgcolor="C0C0C0" bordercolor="#000000"><font size="2" FACE
="Arial"color="#000000"
42.
><%= rsMeta.getColumnName( col )%></font>&nbsp;</TH>
43.
<%}%>
44.
</TR>
45.
</THEAD>
46.
<tbody><%
47.
/* Despliega los valores de las columnas */
48.
while ( rs.next() ) {
49.
%><TRvalign="top"><%
50.
for ( int col = 1; col<= 10;col++ ) {
51.
%><TD bordercolor="#C0C0C0"><font size="2" face="Arial, Helvetica,sansserif" color="#000000"
52.
><%= rs.getString( col )%><BR></font></TD>
53.
<% }
54.
}
55.
/* limpieza */
56.
rs.close();
57.
stmt.close();
58.
conn.close();

299

59.
60.
61.
62.
63.
64.
65.
66.
67.
68.

}
catch ( ClassNotFoundException e ) {
out.println("Excepcindel Driver: " + e );
}%>
</tr>
</tbody>
<tfoot></tfoot>
</TABLE>
</BODY>
</HTML>

2. Servidores Web con Soporte para JSP.


Qu es lo que usted necesita paraejecutar un servlet ( tambin una JSP)
1. - Un programa servidor Web para HTTP . Pueden ser los ms utilizados o populares como el
Apache HTTP server, o el IISque viene en el sistema operativo Windows NT 4.0 o Windows 2000
Server, oincluso en la versin profesional de Windows XP.
2. Servidores que soportan losservlets
SoftwareDesarrollado por la empresasitio WebComentario Apache TomcatThe Apache
SoftwareFoundationhttp://www.apache.orgEs uno de los desarrollos desoftware para manejo de
servlets ms popular. Actualmente esta en la versin 4.0y es el resultado del proyecto
Jakarta Java Web ServerSun Microsystemshttp://wwws.sun.com/software/jwebserverEs el servidor
Web de Sundesarrollado totalmente en Java. Actualmente en la versin 1.1.3. La empresa
Sunanunci en 1999 que ya no esta en desarrollo activo porque se esta concentrandoen el
servidor Netscape/I-Planet, pero an puede obtener una versin gratuitasin vencimiento para
propsitos educativos JRunMacromedia productshttp://www.macromedia.com/es/software/jrun/Es
un servidor Web y ademspermite ejecutar servlets como si fuese un aadido del IIS, Apache,
Nescape,etc. Actualmente esta en la vesin 3.0 Resing serverMacromedia
productshttp://www.macromedia.com/es/software/jrun/Es un servidor Web y ademspermite
ejecutar servlets como si fuese un aadido del IIS, Apache, Nescape,etc. Actualmente esta en la
vesin 3.0 Resin Server 2.1Caucho Technology
http://www.caucho.com/Es un servidor
comercial de laempresa Caucho developer. Puede utilizarse para desarrollo de JSP's,
paradesarrolladores o estudiantes. Tambin puede adquirirse la licencia para usocomercial

300

mediante pago. Hay mas ejemplos de servidores en el librode Martin Hall- Servlets y JavaServer
pages.enhttp://www.moreservlets.com/
3.-Los paquetes de clases servlet:
javax.servlet
javax.servlet.http
sepueden encontrar en:
http://java.sun.com/products/servlet/download.html
otambin se pueden conseguir en:
La API con el paquete de clasesCore Servlets y JavaServer Pages.
2.1 Apache Tomcat
Aqu veremos como instalar y configurar elservidor webJakarta-Tomcat distribuido libremente
por la organizacinApache. Tomcat es un mas de los proyectos de apache.org y es
unaimplementacin oficial de referencia de la especificacin Servlet 2.3 yJavaServerPages 1.2.
Pero antes de entrar en la instalacin y configuracin deTomcatnecesitamos conocer el concepto
deAplicacin Webycontenedor.
Concepto deAplicacin Web. Esteconcepto fue introducido en la versin 2.2 de la especificacin
de servlet, ysegn esta especificacin , una aplicacin web es una coleccin de servlets,paginas
JSP, clases Java, archivos de descripcin de la aplicacin, documentosestticos HTML , XHTML,
imgenes, etc. y otros recursos que pueden serempaquetados y ejecutados en distintos servidores
de diferentes proveedores. Esto es, una aplicacin web se podra definir coma la capa web de
cualquieraplicacin.
Concepto decontenedor. El contenedores el que contiene o alberga una aplicacin web y no es
mas que la estructura dedirectorios en donde estn colocados todos los archivos necesarios para
laejecucin de la aplicacin web. Es lgico entonces que el primer paso en eldesarrollo de
cualquier aplicacin web consiste en crear la estructura dedirectorios en donde se colocaran los
componentes. En el caso de Tomcat, eldirectorio a partir del cual se instala cualquier aplicacin
web debe ser TOMCAT-HOME/webapps, en dondeTOMCAT-HOMEes una variable queapunta
al directorio de instalacin de Tomcat.
Una vez aclarado estos conceptos vamos a verlo que tenemos que hacer para descargar, instalar y
configurar elApache-Tomcat.

2.1.1 Obtener el Apache-Tomcat (para plataforma Windows )


Puedes conseguirlo en el sitio web de ApacheSoftware Fundation en:
http://www.apache.org
En la liga Jakarta de Apache project daleclic y entras a:
http://jakarta.apache.org/
que es la URL del proyecto Apache-Tomcat. Ahora tienes que buscar la liga Binaries (Binarios) de
downloads (descargas)para poder descargar o bajar a tu computadora el archivo binario ( es
unaaplicacin ejecutable para instalar el Tomcat en tu PC con sistema operativoWindows ), al
darle clic entras a otra pagina donde esta una lista de softwarelibre que se puede descargar.

301

Ah encontraras otra liga llamada Tomcat4.1.24 que te lleva a la pagina de descarga de la versin
Apache Tomcat 4.1.24que es la que se descargara para este curso porque es la mas reciente.
Para esto tienes que dar clic a la carpetabin/ que es donde se aloja el archivo binario que
queremos descargar y es laliga jakarta-tomcat-4.1.24.exe para bajar el archivo del mismo nombre
con untamao de 8.5 Mb. (ver la siguiente figura)

Una vez terminado este proceso de descarga,procederemos a su instalacin .

3: La Tecnologa JSP
Mecanismo de funcionamiento de unaJSP
Una JSP atraviesa por etapas de evolucin detres pasos, en su cdigo :
1. Cdigo fuente JSP. Esescrito por el programador o desarrolador de JSP. Esta
en un archivo de textocon extensin.jsp y se compone de una mezcla de cdigo
HTML,instrucciones enlenguaje Java, directivasJSP y acciones que describen cmo
generar una pagina Web para responder a unasolicitud por parte del cliente.
2. Cdigo fuente Java. El contenedor de JSP traduce el cdigofuente JSP a
cdigo fuente de un servlet Java equivalente. Este cdigo fuente se guarda en un
rea de trabajo y puede ser tilenelproceso de depuracin de errores.
3. Clase Java compilada. Como sucede con cualquier otro programa deJava, el
servlet generado se compila en byte code (cdigo de bytes )resultando en un
archivo.classque esta listo para ser cargado yejecutado por el servidor.
Gestin de las JSP por elcontenedor

302

El contenedor de las JSP gestionaautomticamente cada una de stas etapas de la pgina JSP.
Por ejemplo comorespuesta a una peticin HTTP, el contenedor comprueba si el archivo
fuente.jspha tenido modificaciones desde que el cdigo fuente.javasecompil por ltima vez.
Tambin el contenedor determina primeramente el nombre de la clase correspondiente al
archivo.jsp. Si la clase noexiste o es anterior al archivo.jsp esto significa que el cdigo
fuenteJSP ha cambiado desde que fue compilado por ltima vez, luego entonces elcontenedor
crea el cdigo fuente Java para un servlet actualizado equivalente ylo compila. Si no hay an
una instancia o ejemplar del servlet enfuncionamiento, el contenedor carga la clase servlet y crea
un ejemplar. Finalmente el contenedor lanza un subproceso para que gestione la peticin
HTTPactual del ejemplar encargado. Ver la siguiente figura:

3.1 Arquitectura JSP


Pararevisar este tema veremos un ejemplo:
Ejemplo de un JSP que produceuna tabla de funciones trigonomtricas
Para obtener el cdigo da cliccon el botn derecho aqu SenoJSP.jsp
Para ver como corre el programa dale clic aqu (ejecucin)
<%-Esto es un programaque ejemplifica la creacin de una
tabla de funciones trigonometricas con unaJSP.
--%>

303

<%@ page session="false"%>


<%@ page import="java.io.*,java.text.*,java.util.*"%>
<%-- Imprime tabla de funcionestrigonometricas, seno, coseno
tangente y cotangente --%>
<%!
private static finalDecimalFormat FMT1
= new DecimalFormat("#0");
private static finalDecimalFormat FMT2
= new DecimalFormat("#0.0000");
%>
<HTML>
<HEAD>
<TITLE>Tablastrigonomtricas - Seno - conJSP</TITLE>
</HEAD>
<BODY>
<H3><center>Tablade Funciones Trigonomtricas</center></H3>
<TABLE ALIGN=CENTER BORDER=1 CELLPADDING=3 CELLSPACING=0>
<TR>
<TH ALIGN=CENTER>Grado</TH>
<TH ALIGN =CENTER>Seno</TH>
<THALIGN =CENTER>Coseno</TH>
<TH ALIGN=CENTER>Tangente</TH>
<TH ALIGN=CENTER>Cotangente</TH>
</TR>
<%
for (double gdo = 0; gdo<=45; gdo += 1.0) {%>
<TR>
<TD ALIGN=\"CENTER\"><div align="left"><font face=\"Arial\" size=1>
<%= FMT1.format(gdo)%></font></div></TD>
<TD ALIGN =\"CENTER\"><fontface=\"Arial\" size=1>
<%=FMT2.format(Math.sin(Math.toRadians(gdo)))%></font></TD><!-- seno -->
<TD ALIGN =\"CENTER\"><fontface=\"Arial\" size=1>
<%= FMT2.format(Math.cos(Math.toRadians(gdo)))%></font></TD><!-- coseno-->
<TD ALIGN =\"CENTER\"><font face=\"Arial\"size=1>
<%=FMT2.format(Math.tan( Math.toRadians(gdo)))%></font></TD><!-- tangente -->
<TD ALIGN=\"CENTER\"><font face=\"Arial\" size=1>
<%= FMT2.format(1/Math.tan(Math.toRadians(gdo)))%></font></TD><!-- cotangente-->
</TR>
<%
}
%>
</TABLE>
</BODY>
</HTML>

304

Para poderestablecer la relacin entre las pginas JSP y servlets hay que observar elcdigo fuente
generado por el contenedor JSP. Este cdigo difiere de uncontenedor a otro y la tcnica de
implementacin que se adopte. Si se comparaeste cdigo generado por el contenedor, y el
ejemplo de un Servlet que produceuna tabla de funciones trigonomtricas que se vio
anteriormente nos daremoscuenta que ste es un tanto automatizado o mecnico, como si
hubiera sidogenerado por un programa - y as a sido, en efecto - , pero an lo podemosreconocer
como un servlet.
package org.apache.jsp;
importjava.io.*;
import java.text.*;
import java.util.*;
importjavax.servlet.*;
import javax.servlet.http.*;
importjavax.servlet.jsp.*;
import org.apache.jasper.runtime.*;
publicclass SenoJSP$jsp extends HttpJspBase {
// begin[file="/oscaruno/SenoJSP.jsp";from=(8,3);to=(13,0)]
private static finalDecimalFormat FMT1
= new DecimalFormat("#0");
private static finalDecimalFormat FMT2
= new DecimalFormat("#0.0000");
// end
static{
}
public SenoJSP$jsp( ) {
}
private static boolean_jspx_inited = false;
public final void _jspx_init() throwsorg.apache.jasper.runtime.JspException {
}
public void_jspService(HttpServletRequest request, HttpServletResponse response)

305

throwsjava.io.IOException, ServletException {
JspFactory _jspxFactory =null;
PageContext pageContext = null;
ServletContext application =null;
ServletConfig config = null;
JspWriter out = null;
Object page =this;
String _value = null;
try {
if (_jspx_inited == false){
synchronized (this) {
if (_jspx_inited == false){
_jspx_init();
_jspx_inited = true;
}
}
}
_jspxFactory =JspFactory.getDefaultFactory();
response.setContentType("text/html;ISO-8859-1");
pageContext= _jspxFactory.getPageContext(this, request, response,
"", false, 8192,true);
application = pageContext.getServletContext();
config =pageContext.getServletConfig();
out = pageContext.getOut();
// HTML //begin[file="/oscaruno/SenoJSP.jsp";from=(3,4);to=(4,0)]
out.write("\r\n");
//end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(4,27);to=(5,0)]
out.write("\r\n");
//end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(5,54);to=(6,0)]
out.write("\r\n");
//end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(7,31);to=(8,0)]
out.write("\r\n");
//end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(13,2);to=(29,0)]
out.write("\r\n<HTML>\r\n<HEAD>\r\n<TITLE>Tablastrigonomtricas - Seno conJSP</TITLE>\r\n</HEAD>\r\n<BODY>\r\n<H3><center>Tablade Funciones
Trigonomtricas</center></H3>\r\n<TABLE ALIGN=CENTER BORDER=1 CELLPADDING=3
CELLSPACING=0>\r\n<TR>\r\n<TH ALIGN=CENTER>Grado</TH>\r\n<TH ALIGN
=CENTER>Seno</TH>\r\n<THALIGN =CENTER>Coseno</TH>\r\n<TH
ALIGN=CENTER>Tangente</TH>\r\n<TH ALIGN=CENTER>Cotangente</TH>\r\n</TR>\r\n\r\n");
// end
//begin [file="/oscaruno/SenoJSP.jsp";from=(29,2);to=(30,47)]
for (doublegdo = 0; gdo<= 45; gdo += 1.0) {
// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(30,49);to=(33,9)]
out.write("\r\n \t<TR>\r\n<TD ALIGN =\\\"CENTER\\\"><divalign=\"left\"><font face=\\\"Arial\\\"
size=1>\r\n ");
//end
// begin[file="/oscaruno/SenoJSP.jsp";from=(33,12);to=(33,30)]
out.print(FMT1.format(gdo) );

306

// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(33,32);to=(35,9)]
out.write("</font></div></TD>\r\n<TD ALIGN=\\\"CENTER\\\"><font face=\\\"Arial\\\" size=1>\r\n ");
//end
// begin[file="/oscaruno/SenoJSP.jsp";from=(35,12);to=(35,58)]
out.print(FMT2.format(Math.sin(Math.toRadians(gdo))) );
// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(35,60);to=(37,9)]
out.write("</font></TD><!-- seno -->\r\n<TD ALIGN=\\\"CENTER\\\"><font face=\\\"Arial\\\" size=1>\r\n
");
//end
// begin[file="/oscaruno/SenoJSP.jsp";from=(37,12);to=(37,58)]
out.print(FMT2.format(Math.cos( Math.toRadians(gdo))) );
// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(37,60);to=(39,9)]
out.write("</font></TD><!-- coseno -->\r\n<TD ALIGN=\\\"CENTER\\\"><font face=\\\"Arial\\\"
size=1>\r\n ");
//end
// begin[file="/oscaruno/SenoJSP.jsp";from=(39,12);to=(39,58)]
out.print(FMT2.format(Math.tan( Math.toRadians(gdo))) );
// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(39,60);to=(41,9)]
out.write("</font></TD><!-- tangente -->\r\n<TD ALIGN=\\\"CENTER\\\"><font face=\\\"Arial\\\"
size=1>\r\n ");
//end
// begin[file="/oscaruno/SenoJSP.jsp";from=(41,12);to=(41,58)]
out.print(FMT2.format(1/Math.tan( Math.toRadians(gdo))));
// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(41,60);to=(43,9)]
out.write("</font></TD><!-- cotangente -->\r\n</TR>\r\n");
// end
// begin[file="/oscaruno/SenoJSP.jsp";from=(43,11);to=(45,9)]
}
//end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(45,11);to=(49,0)]
out.write("\r\n</TABLE>\r\n</BODY>\r\n</HTML>\r\n");
//end
} catch (Throwable t) {
if (out != null&&out.getBufferSize() != 0)
out.clearBuffer();
if (pageContext != null)pageContext.handlePageException(t);
} finally {
if (_jspxFactory != null)_jspxFactory.releasePageContext(pageContext);
}
}
}

3.2 Incorporar contenido Java en una pgina HTML


En una archivo .jsp se pueden tenerelementos JSP, datos de plantilla fijos o cualquier
combinacin de ambos. Loselementos JSP son instrucciones dadas al contenedor de JSP sobre el
cdigo agenerar y sobre cmo debe operar. Estos elementos tienen etiquetas especficasde
comienzo y fin que los identifican en el proceso de compilacin de JSP.

307

Los datos plantilla ( generalmente HTML) sontodo aquello que el contenedor de JSP no
reconoce. Estos pasan a travs delcontenedor sin sufrir modificaciones, as que el HTML
finalmente generadocontiene los datos de plantilla tal y como estaban codificados en el
archivo.jsp.
Hay tres tipos de elementos JSP:

Elementos de secuencias de comandos (scripts)que incluyen


expresiones, scriplets y declaraciones.
Directivas.
Acciones

Por el momento vamos a examinar lassecuencias de comandos o scripts:


Una declaracin permite notificar alintrprete de Java que se van a definir nuevas variables o
mtodos en el archivode la clase generada. Las declaraciones contienen instrucciones o sentencias
enlenguaje Java con la sintaxis siguiente:
<%! sentencia; [sentencias; ... ]%>
las secciones de la declaracin se puedenusar para declarar clases o variables de instancia,
mtodos o clases internas. Para declarar tanto una variable como un mtodo se utiliza el smbolo
"!". Las declaraciones son creadas e inicializadas cuando elusuario accede a la pgina JSP y su
mbito es de tipo "class" , es decir queestn disponibles en toda la clase que genera despus de
la solicitar una pginaJSP. Cualquier declaracin hecha al comienzo de una pgina puede ser
utilizadaal final de la misma.
Ejemplo de una JSP con declaracin.
Si quieres obtener el cdigo del archivo dale clic con el botn derechoaqu Declaracion1JSP.jsp
Si quieres ver la ejecucin del programa dale clic aqu (ejecucin)
<html>
<head><title>Pgina JSP conDeclaraciones</title></head>
<body>
<%! int i=0;%><%-- estoes una declaracin --%>
El valor de<b>i</b>es :<h1><%= i%></h1><br>
Procedemosa incrementar el valor de i
<%i++;%><br>
Vemos el nuevovalor de<b>i</b>que es:<h1><%= i%></h1>
</body>
</html>Salida en el navegador:

308

Si se hace la prueba de quitar el smbolo "!"en la declaracin de<%! i %> as:


<%int i=0;%><%-- estoya no es una declaracin porque falta "!" --%>
y hacemos y cargamos de nuevo la pgina .jspvarias veces, podremos comprobar como el valor
de "i"siempre se inicializa a 0 por lo que cada vez que se accede a la pgina elresultado siempre
ser 1.
Esto implica que el uso del smbolo "!" para declarar la variable "i"permite que slo sea declarada
una sola vez, por eso, cuando se vuelve arecargar la pgina JSP, se lee su ltimo valor y se
incrementa de nuevo. Si seomite esta declaracin, la variable ser inicializada cada vz que se
acceda ala pgina web.
Salida del JSP sin la declaracin:

3.2.3 Scriptlets

309

Un scriptlet es un conjunto de instruccioneso sentencias de Java incluidas en una pgina HTML.


Estas instrucciones sedistinguen del HTML porque estn colocadas entre los marcadores<%
y %>para que el intrprete de JSP sepa que debe procesar todo el cdigo que seencuentre
dentro de esas etiquetas. Su sintaxis es:
<% sentencias; [sentencias; ...]%>
El siguiente scriptlet produce una tabla de caracteresASCII
Si quieres obtener el cdigo del archivo dale clic con el botn derechoaqu Tabla_ASCII.jsp
Si quieres ver la ejecucin del programa dale clic aqu (ejecucin)
<%-Programa escrito porOscar Alejandro Gonzlez Bustamente
Fecha: 08:mayo:2003
--%>
<HTML>
<BODY>
<CENTER>
<H3>Tablade caracteres ASCII</H3>
<TABLE BORDER="3" CELLPADDING="0"CELLSPACING="0" width="1000">
<%
StringBuffer sb = newStringBuffer();
int col = 0;
while ( col<16){
sb.append("<TD>");
sb.append("<TABLE BORDER='1' CELLPADDING='0'CELLSPACING='0'>");
sb.append("<TR>");
sb.append("<TH>HEX</TH>");
sb.append("<TH>DEC</TH>");
sb.append("<TH>CAR</TH>");
sb.append("</TR>");
introw = 0;
while ( row<= 16){
sb.append("<TR>");

310

sb.append("<TH>");
sb.append(Integer.toHexString(row+ col*16));
sb.append("</TH>");
sb.append("<TH>");
sb.append((row +col*16));
sb.append("</TH>");
char c = (char)(row +col*16);
sb.append("<TD>");
sb.append(c);
sb.append("</TD>");
sb.append("</TR>");
row++;
}
sb.append("</TABLE>");
sb.append("</TD>");
col++;
}
out.println(sb);
%>
</TABLE>
</CENTER>
</BODY>
</HTML>

La salida del JSP Tabla_ASCII.jsp es:

3.3 Directivas
Son etiquetas que seutilizan en una pgina JSP cuya principal caracterstica es incluir el smbolo@
en su sintaxis, que tiene la siguiente forma:
<%@ nombre_directiva [ atributo_i = "valor_i" ] %>
Su mbito es de tipopage ( pgina ) , esto es, su accin slo ocurrir en la pgina en la que
hansido utilizadas, adems no devuelven ningn valor al cliente como lasexpresiones o los

311

scriptlets, salvo lo generado por su ejecucin. Laespecificacin JSP 1.1 describe tres directivas
estndar disponibles en todoslos entornos JSP que son: page, include y taglib
3.3.1 Directiva page
Se utiliza para definir atributos globalesque deben ser aplicados a la pgina JSP completa, y a
cualquier archivo ,excepto los de contenido dinmico, que se haya incluido en sa pgina con
ladirectiva include o la accin jsp:include. Su sintaxis es lasiguiente:
<%@ page [languaje= "java" ] [extends= "paquete.clase" ]
[import="{paquete.clase | paquete.*},..." ]
[session="true| false" ] [buffer="none |8kb| tamao kb" ]
[autoFlush="true| false" ] [isThreadSafe="true| false" ]
[info="mensaje"] [errorPage="URLrelativa" ]
[contentType="{tipoMime [ ;charset=juegoCaracteres ] |text/html;
charset=ISO-8859-1}" ] [isErrorPage="true |false" ]
[pageEncoding="{juegoCaracteres |ISO-8859-1}" ]
los valores en rojo son por default, lostrminos opcionales se sitan entre corchetes y la barra
vertical indica quecualquiera de los valores puede ser utilizado. Los atributos de la directiva
sedetallan a continuacin:
languaje ="java"
Define el lenguaje que se utilizar en losscriptlets o trozos de cdigo que se colocan en
la pgina JSP o en cualquierarchivo que se incluye en la pgina mendiante la directiva
o la accincorrespondiente. Actualmente, la especificacin JSP 1.2 permite
asignarsolamente el valorjavapara esteatributo.
extends="paquete.clase"
Especifica el nombre de una clase, totalmentecualificada, que se pueda extender en el
archivo JSP. Notifica a la clasegenerada despus de solicitar la pgina JSP si hereda
de una superclase. Pordefecto este valor no es utilizado.
import="{paquete.clase | paquete.*},..."
Permite especificar una lista de paquetes oclases, separados por comas, que pueden
ser invocados en los scriptlets,expresiones, declaraciones, etiquetas que se utilicen
dentro de la pginaJSP. Este atributo debe aparecer antes de cualquiera de las clases
que seimporten.
Los paquetes que se importan por default son :
java.lang.*, javax.servlet.*,javax.servlet.jsp.* y javax.servlet.http.*;
sesion="true| false"
Cuando se realiza una peticin por parte de uncliente al servidor web, ste le asigna
un identificador a esa sesin para poderreferirse a la conexin HTTP que se ha
establecido. Si se indica true (elvalor por defecto si no se especifica el atributo en la
directiva) el objetosessionse puede utilizar y se refiere a la sesin actual o a
cualquiernueva sesin que se establezca, si se indica false como valor de este
atributo,el objeto session no se podr utilizar en la pgina JSP.
buffer="none|8kb|tamaokb"
Especifica el tamao del buffer utilizado por unobjeto implcitooutpara enviar el
resultado de la salida compilada dela pgina JSP al navegador cliente. Puede indicarse
que no se use, en cuyo casola salida es enviada directamente a travs del
objetoPrintWriter; o untamao especfico, siendo el valor por defecto 8 kb.
autoFlush="true| false"

312

Controla el buffer de salida. Si el valor estrue, su valor por defecto, cuando el buffer
de salida est completo, sedescargar hacia el navegador; si su valor es false el buffer
no se descarga,con lo que se genera una excepcin de buffer completo cuando el
buffer estlleno. Este atributo no puede ser false cuando el valor del atributo buffer
esnone.
isThreadSafe="true|false"
Indica al motor JSP cmo se debe implementar laseguridad de las tareas. Si el valor
es true, el que toma por omisin, el motorpuede enviar mltiples solicitudes
concurrentes a la pgina JSP; es decir,varias tareas diferentes podran acceder a la
pgina JSP, por lo que esresponsabilidad del desarrollador sincronizar los mtodos
para proporcionarseguridad entre las tareas.
info="mensaje"
Indica un mensaje de texto, generalmente dedescripcin o informacin de copyright,
que ser incorporado a la pgina JSP yque, posteriormente, puede ser recuperado
invocando al mtodo getServletInfo().
errorPage="URL relativa"
Especifica una pgina JSP a la que se desva laejecucin cuando se produce una
excepcin en la pgina que no estcapturada.
Si la ruta comienza con una barra inclinada (/),la URL ser relativa a la raz de
documentos del servidor web, por lo que stees el encargado de la resolucin
completa de la direccin de la pgina de error;mientras si no comienza con la barra
inclinada, la ruta estar referenciada aldirectorio actual que de fine la directiva page.
contentType="{tipoMime [ ; charset=juegoCaracteres ] |text/html; charset=ISO8859-1}"
Indica el tipo mime y la modificacin del juegode caracteres que se enviar en la
respuesta que se genera hacia el cliente. Se puede utilizar cualquier tipo mime y
juego de caracteres soportado por elmotor JSP. Por defecto, se enva la pgina HTML
con el juego de caractereseuropeo normal.
isErrorPage="true |false"
Este atributo indica si la pgina JSP actual esuna pgina de error. Si el valor es true,
la pgina tendra acceso al objetoimplcito exception, que contiene una referencia a la
excepcin que haya lanzadoel motor JSP.
pageEncoding="{juegoCaracteres |ISO-8859-1}"
Indica el juego de caracteres que se utiliza enla propia pgina JSP. Por omisin, en
caso de que se haya especificado unvalor diferente para el atributo contentType, se
ser el valor depageEncoding, o bien ISO-8859-1 en cualquier otro caso.
Ejemplo:
Si quieres obtener el cdigo del archivo dale clic con el botn derechoaqu DirectivaPageJSP.jsp
Si quieres ver la ejecucin del programa dale clic aqu (ejecucin)

<%--JSP elaborada por: OscarA. Gonzlez B.


Archivo: DirectivaPageJSP.jsp
Fecha:19-mayo-2003
--%>
<%@page language ="java"

313

import = "java.util.Date , java.awt.*"


session = "true"
info ="Pgina JSP para ejemplificar la directiva page."
buffer = "32kb"
autoFlush = "true"
errorPage = "laregastesJSP.jsp"
isErrorPage ="false"
isThreadSafe = "false"
contentType = "TYPE=MIME text/html;charset=ISO-8859-1"
%>
<html>
<head><title>Pgina JSP conDirectiva page</title></head>
<body>
<%-- Da la fecha --%>
La fecha de hoy, generada atravs del objeto<i>Date</i>cargado a travs
del atributo<i>import</i>de la directiva<b>page</b>,
es:<font color=""#004080"><%= (new Date()).toLocaleString()%></font><br><br>
<%-- Da la informacin del valor del atributo info de ladirectiva page--%>
La informacin de la pgina que esta en elatributo<i>info</i>de la directiva
<b>page</b>, esrecuperada mediante la invocacin del mtodo<i>getServletInfo()</i>, es:
<font color="#0000ff#"><%= getServletInfo()%></font><br><br>
</body>
</html>
La salida de la JSP DirectivaPageJSP.jsp es:

3.3.2 Directiva include


Permite la inclusin en una pgina JSP entiempo de compilacin, de una pgina HTML, archivo de
cdigo Java, archivo detexto u otra pgina JSP. La pgina final que va a procesar el motor JSP
estaconformada por la pgina base ms el contenido del recurso que se hayaincluido. Esta
directiva puede ir situada en cualquier lugar de la pgina JSP. Al usar esta directiva se recomienda
especial cuidado en la colocacin de lasetiquetas HTML <html></html>, <body></body>,
etc..porque el archivo incluido podra entrar en conflicto con las etiquetassimilares del archivo JSP
original, por lo que hay que checar que estncorrectamente anidadas y no duplicadas.
Ejemplo:
Si quieres obtener el cdigo del archivo dale clic con el botn derechoaqu
DirectivaIncludeJSP.zip

314

Si quieres ver la ejecucin del programa dale clic aqu (ejecucin)


<%-- archivo:encabezado.html --%>
<font face="Arial" size="+5"color="#000080">Sitio web deGalletolandia</font>

<%-- Archivo:piedepagina.html --%>


<font color="#000000" style="Arial"size="+2">Comentarios a:
pupis@df1.telmex.net.mx</font>
<%-- Archivo: cuerpo.html--%>
<center><img border="0" src="imagenes/galletoas.gif"width="342"
height="141"></center>
<%--JSP elaborada por: OscarA. Gonzlez B.
Archivo: DirectivaIncludeJSP.jsp
Fecha: 19-mayo-2003
Propsito: Ejemplifica el uso de la directiva include
Esta pgina utilizatres archivos de inclusin que son:
encabezado.html, piedepagina.html, ycuerpo.html
--%>
<html>
<head><title>PginaJSP con Directiva include</title></head>
<body>
<%-- aqu vamos a incluir un archivo con una cabecera --%>
<center><%@ include file ="encabezado.html"%></center><br><br>
<center><font face = "Arial" size="+4"color="#800080">Bienvenidos al facinante mundo de
lasGalletas</font></center><br><br>
<%-- aqu vamos a incluir un archivo con una imgen --%>
<%@ include file ="cuerpo.html"%><br><br>
<%--aqu vamos a incluir un archivo con un pie de pgina--%>
<center><%@ include file ="piedepagina.html"%></center>
</body>
</html>

La salida de la JSP DirectivaIncludeJSP.jsp es:

315

3.4 Objetos implcitos


Existen unos objetosimplcitos o integrados que estn disponibles en todo momento para
elprogramador de pginas JSP. No hay necesidad de instanciarlos ya que estndisponibles en el
contenedor JSP. Estos objetos existen para hacer mssencilla la programacin de pginas JSP.
3.4.1 Objeto page
Es una instancia de la clasejava.lang.Object, y su mbito es de tipopage. Representa lainstancia
de una clase generada a partir de una pgina JSP, es decir la pginaJSP actual. Cuando se quiere
hacer referencia a esta pgina JSP se utiliza lapalabrathis.

3.4.2 Objeto config


Es una instancia de la clasejavax.servlet.ServletConfigy maneja todo lo relacionado a
laconfiguracin del servlet generado al solicitar la pgina JSP. Su mbito defuncionamiento es de
tipopage.

3.4.3 Objeto request


Es una instancia dejavax.servlet.ServletRequest y contiene informacin de datos enviadosal
servidor a travs de una pgina web. Por ejemplo el mtodogetParameter()del
objetorequestrecoge valores enviados pormedio de un formulario o una URL. As podemos
recuperar los valores o contenidode los campos de un frmulario de una pgina web, ejemplo:
<%
%>

String nombre = request.getParameter("nombre");

Este ejemplo podra recuperar el valor del campo nombre de lasiguiente URL.
http://localhost:8080/oscaruno/ObjetoRequestJSP.jsp?nombre=Oscarin
ya que su mbito de funcionamiento es de tiporequest.
3.4.4 Objeto sesin
Es una instancia de la clasejavax.servlet.http.HttpSesion. El cometido de este objeto es
manejartodas las acciones relacionadas a la sesin del usuario, por lo tanto su mbitode utilizacin
es de tipo sesin. Una sesin es creada automticamente ( amenos que se especifique lo
contrario ) cuando un usuario solicita una pginaJSP, y de esta manera podemos almacenar
informacin relativa a ese usuario.
Si por ejemplo deseamos almacenar un objetoen la sesin, para posteriormente poder recuperarlo
hacemos:
<%
HttpSession unaSesion = request.getSession();
unaSesion.setAttribute(usuario,"pancho_lopez");

316

%>
3.4.5 Objeto application
)
Es una instancia de la clasejava.servlet.ServletContext, y su mbito de utilizacin es de tipo
application. Representa la aplicacin web en el que se est ejecutando la pginaJSP.

3.5 Uso de JavaBeans con JSP


Introduccin
Aqu veremos que unJavaBean es un componente en de una JSP, y para esto tenemos
que entender que esun componente, porque uno de los objetivos de la POO es el de crear
componentesreutilizables, escalables e intercambiables entre diferentes aplicaciones,
ascomo sucede en otras industrias como la del hardware, electrnica, automotriz,etc.
El modelo decomponentes
El modelo de componentes se cre en EUA a finales del siglo XVIIIpor Eli Whitney cuando el
gobierno estadounidense le encarga la produccin de10,000 mosquetes. La industria de esa
poca era la manufactura y todo secreaba a mano, y las piezas de un mosquete no podan ser
utilizadas por otro,as que Whitney bas su sistema en partes intercambiables y denomin a
estasolucin el "Sistema Uniforme" y que ahora lo conocemos como modelo decomponentes.
Los equipos de desarrollo de software comenzaron a adoptar elmodelo de componentes con el
desarrollo de un "modelo de objetos" o "paradigmaorientado a objetos " en lenguajes de
programacin orientados a objetos como elC++ y Java. Las bibliotecas de lenguaje y las API
contribuyen al desarrollo deaplicaciones complejas y se necesita ser un experto en el lenguaje y
los mtodosde las API para unir dos o mas bibliotecas.
Para solucionar la comunicacin entre los componentes, actualmentese aplica otro modelo de
objetos en las grandes aplicaciones. Este modeloadems de utilizar todas las ventajas del modelo
de componentes, implementa laidea de interfaz. Este nuevo "modelo de componentes" crea un
conjuntoempaquetado de cdigo que se comunica con otros componentes a travs de unconjunto
de mtodos estndar llamados interfaces y la conexin de dos o masinterfaces de diferentes
componentes crea aplicaciones.
Esta arquitectura de componentes garantiza un alto nivel dereutilizacin e intercambiabilidad.
Estos componentes deberan comportarse dela misma forma en cualquier sitio y se pueden
conectar en donde seannecesarios.
El componente tambin permite la separacin de la lgica de laaplicacin o "lgica del negocio"
de la lgica de la presentacin, as losdiseadores del equipo de desarrollo continan trabajando
en la capa depresentacin, mientras los programadores experimentados pueden desarrollar
uncomponente sin repasar de nuevo todos los detalles complejos "reinventar larueda" de su
funcionamiento y , adems, compartindolo con sus colegas delequipo de trabajo.
El modelo decomponentes para JSP
Adicionalmente a otros aspectos , una pgina JSP utiliza el modelode componentes integrado en la
plataforma Java. La arquitectura de componentesJavaBeans se introdujo en la versin Java 1.1 y
se perfeccion en Java 1.2. Latecnologa JSP est diseada para obtener el mximo beneficio de
estaarquitectura de componentes de JavaBeans.

3.5.1 Qu es un JavaBean?
Son una adicin de programacin muy eficaz a Java, y su usocontribuye a migrar la programacin
Web a un modelo de componentes. LosJavaBeans actan como la capa de la aplicacin o lgica

317

de negocios, mientrasque las pginas de JSP actan como la lgica de presentacin, de esta
manera sepueden crear aplicaciones Web mas escalables y eficaces.
Un JavaBean es una clase de Java estndar que cumple una serie deconvenciones de
nomenclatura y diseo muy sencillos. Un JavaBean define susmtodos y objetos exportados en
una convencin de nomenclatura estndar que sepuede obtener fcilmente llamando a la
aplicacin. Esto proporciona una entrada( interfaz ) de programacin en el JavaBean sin entender
el funcionamientointerno del JavaBean.
Las Convenciones de los JavaBeans
El uso de convenciones de nomenclatura y diseo estndar, permitenque las aplicaciones
entiendan la lgica intrnseca de un JavaBean y lo puedanutilizar. El uso de una semntica y
reglas especficas permite que aplicacionescomo JSP analicen clases y mtodos disponibles para
obtener llamadas de mtodosy propiedades disponibles.
Hay tres requisitos de diseo para un JavaBean:
1. El constructor no necesita aceptar ningn parmetro.
Por definicin un JavaBean debe tener un constructor sin parmetrospara instanciar objetos.
Debido a que puede suceder que una aplicacin haga unallamada al bean y desconozca el
funcionamiento del bean, sera casi imposiblepara la aplicacin comprender los parmetros de
instanciacin especficosnecesarios. Es posible sobrecargar el constructor con varias firmas, pero
laetiqueta<jsp: useBean>predeterminada nicamente utilizar elconstructor sin parmetros. En
todas las clases de Java hay un constructor pordefault sin parmetros, esto es, el compilador de
Java crea un constructor sinparmentros y no inicializa valores, luego entonces un JavaBean
puede ser unaclase vaca y, a pesar de ello, ser correcto. Por ejemplo, un JavaBean vlidopuede
ser:
public class VacioBean() {}
2. El acceso al JavaBeans se realiza a travs de mtodos de
accesoespecficos.
Todo lo que un JavaBean muestre se le denominar propiedad, y no esms que una
representacin externa del estado interno del JavaBean. Parainteractuar con los valores de las
propiedades del JavaBean, habr mtodos deacceso que establecen un valor, o bien obtienen un
valor de una propiedadespecfica. No se recomienda que el acceso al estado interno del JavaBean
seadirecto porque violara la caracterstica de encapsulamiento del estado internodel objeto
necesario para crear componentes.
Con frecuencia una propiedad tiene mtodos de acceso que permitenconfigurar y obtener un
valor, no obstante, esto no es obligado y necesario queuna propidad deba tener ambos mtodos
de acceso ya que puede que solo tenga uno,o quizs algunas propiedades no tengan o permitan
mtodos de accesoalguno.
Los mtodos de acceso se crean siguiendo un formato de nomenclaturaconvenida para poder
obtener informacin del JavaBean sin un conocimientoespecfico del mismo.
Los mtodos que se utilizan para obtener datos se denominanmtodos de obtencinomtodos
accesoresy siguen esteformato:
public { Tipo-Objeto } get { Propiedad } ( )
El complemento de los anteriores se denominanmtodosmutadoresomtodos de
configuracinque permiten establecer datos enuna propiedad y siguen este formato:
public void set { Propiedad } ( { Tipo-Objeto })
3. Es preciso distribuir un JavaBean en un archivo JAR de maneraespecial.
Tcnicamente una clase no es un JavaBean hasta que sta se coloqueen un archivo JAR que
incluya una opcin determinada. Cada archivo de clase quesea un JavaBean se debe marcar con
el atributo Java-Bean: true en elarchivo. No obstante esto, es posible utilizar una clase como
un JavaBeanaunque no este dentro de un JAR.

318

3.5.2 Acceder a las propiedades de un JavaBean


Para acceder a laspropiedades de un JavaBean, esto es, al estado de los objetos que se crean de
laclase que es un JavaBean, utilizamos la etiqueta:
<jsp:getProperty name="nombreBean" property="nombrePropiedad"/>
donde nombreBean esta definido por la etiqueta <jsp:useBean> as;<jsp:useBean
id="nombreBean" class="dgsca.jb.BeanLigas"scope="session"/> define en la pgina JSP un alias
para el JavaBean dgsca.jd.BeanLigas el cual tiene un ambito de sesion. ElnombrePropiedad es
el identificador de uno de los atributos delJavaBean.
Para comprendermejor esto es necesario que revisemos lo que es la visibilidad , o mbito
dedichas propiedades.
La Visibilidad
Los JavaBean necesitan que todos los mtodos de acceso se declarencomo mtodospublic. El
contenedor de JSP nicamente puede identificarlas propiedades que sean mtodos de acceso
pblico, por lo que el resto demtodos de acceso no public no estarn disponibles para las
pginasJSP.
La visibilidad de los objetos y mtodos internos en el JavaBean estaal libre albedro del
programador, pero sin embargo,la finalidad delJavaBean consiste en encapsular la lgica de la
aplicacin o lgica delnegocio, y no tiene sentido que nada a parte de los mtodos de acceso
seanpblicos.
En un JavaBean por lo general, nicamente el constructor y losmtodos de acceso debern
serpublic. Probablemente el resto de objetosdeberan serprotectedoprivatey mostrar sus
propiedades atravs de mtodos de acceso public. Esto evitar que usuarios de un
JavaBeantengan acceso al mismo a travs de interfaces estandar y prevenir los posiblesproblemas
que se puedan producir en caso de que cambie la implementacin internadel JavaBean.
3.5.1 Establecer las propiedades de un JavaBean
El siguiente ejemplo muestra el uso de un Bean para acceder a losdatos de la tabla interesen la
base de datosligasen MySQL mediante JDBC y en donde se utilizan ampliamente la
etiqueta<jsp:setProperty>para establecer los valores de los atributos encapsulados del Bean.
Ejemplo:
Aqui tienes el cdigo de la JSP que utiliza el JavaBean
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.

<%@ page contentType="text/html; charset=ISO-8859-1" language="java"import="java.util.*,


java.io.*,
java.sql.*,
javax.servlet.*,
javax.servlet.http.*,
sun.jdbc.odbc.*,
java.lang.*,
dgsca.jb.*" %>
<jsp:useBeanid="bdatos"class="dgsca.jb.BeanLigas" scope="session"/>
<jsp:setPropertyname="bdatos"property="servidorBD" value="barbanegra"/>
<jsp:setPropertyname="bdatos"property="nombreBD" value="ligas"/>
<jsp:setPropertyname="bdatos"property="puertoBD" value="3306"/>
<jsp:setPropertyname="bdatos"property="usuarioBD" value="root"/>
<jsp:setPropertyname="bdatos"property="contraseaBD" value=""/>
<jsp:setPropertyname="bdatos"property="consultaBD" value="SELECT * FROM interes"/>
<HTML>
<HEAD>

319

20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.

<TITLE>Desplegando una tabla usando el JDBC y MySQL con unBean</TITLE>


<metaname="author" content="Oscar Alejandro Gonz&aacute;lezBustamante">
<metaname="keywords" content="JSP, JDBC, MySQL, Acceso a Datos">
<metaname="description" content="Un ejemplo de despliegue de una tabla usando JSP yun
Bean">
</HEAD>
<BODY>
<H2>Ejemplo de Acceso a una base de Datos usando JSP y MySQL con unBean</H2>
<Center><h3>Despliega valores establecidos en elBean</h3></Center>
<b>Servidor:</b><jsp:getPropertyname="bdatos"property="servidorBD"/>
<br>
<b>Base de Datos:</b><jsp:getPropertyname="bdatos"property="nombreBD"/>
<br>
<b>Puerto:</b><jsp:getPropertyname="bdatos" property="puertoBD"/>
<br>
<b>Usuario:</b><jsp:getPropertyname="bdatos"property="usuarioBD"/>
<br>
<b>Contrasea:</b><jsp:getPropertyname="bdatos"property="contraseaBD"/>
<br>
<b>Consulta:</b><jsp:getPropertyname="bdatos" property="consultaBD"/>
<hr>
<%
/* recoge el objeto ResultSet devuelto por el JavaBean */
bdatos.setResultado();
/* Obtiene los meta datos sobre el resultSet */
inti=1;
while (bdatos.siguiente() ) {
%>
<br>
<b>sitio de interes web no:<%= i++%></b>
<br>
<b>nombre:</b><%=bdatos.getinteresNombre()%>
<br>
<font size="2" face="Arial, Helvetica, sans-serif" color="#000000">
<b>url:</b>
<a href="<%=bdatos.getinteresUrl()%>"><%= bdatos.getinteresUrl()%></a>
</font>
<br>
<b>tipo:</b><%=bdatos.getinteresTipo()%>
<%
out.println("<p>");
}
bdatos.cerrarConexion();
%>
</BODY>
</HTML>

Acontinuacin se da el cdigo del JavaBean


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

packagedgsca.jb;
importjava.sql.*;
publicclass BeanLigas {
privateConnection con = null;
privateStatement stmt = null;
privateResultSet rs = null;
privateString datosPuente = "";
privateString servidorBD = "";
privateString nombreBD = "";
privateString puertoBD = "";
privateString usuarioBD = "";

320

12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.

privateString
privateString
privateString
privateString
privateString

contraseaBD = "";
consultaBD = "";
interesnombre = "";
interesurl = "";
interestipo = "";

publicResultSet getResultado() {
try{
datosPuente = "jdbc:mysql://" +
servidorBD +"/" +
nombreBD+ ":" +
puertoBD;
Class.forName("com.mysql.jdbc.Driver").newInstance();
con =DriverManager.getConnection( datosPuente,usuarioBD,contraseaBD );
if ( con!= null )
System.out.println("Se ha establecido una conexin a la base de datos "+
"\n " +datosPuente );
stmt =con.createStatement();
rs =stmt.executeQuery( consultaBD );
} catch(SQLException e ) {
System.out.println("Error: " + e.getMessage() );
e.printStackTrace();
}
finally{
returnrs;
}
}//findel mtodo getResultado
publicvoid setResultado() {
rs =getResultado();
}
publicboolean siguiente()
{boolean bandera = false;
try
{
if(rs.next() ) bandera= true;
elsebandera= false;
}
catch(SQLException e){
System.out.println("Error: " + e.getMessage() );
e.printStackTrace();
}
finally{
returnbandera;
}
}
publicvoid cerrarConexion() {
if ( rs!= null ) {
try{
rs.close();
} catch(SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
}
if ( con!= null ) {
try{

321

76. con.close();
77. } catch(SQLException e ) {
78. System.out.println( e.getMessage());
79. e.printStackTrace();
80. }
81. }
82. } //findel mtodo cerrarConexion()
83.
84. publicvoid setServidorBD( String servidorBD ) {
85. this.servidorBD = servidorBD;
86. }
87. publicString getServidorBD() {
88. returnservidorBD;
89. }
90.
91. publicvoid setNombreBD ( String nombreBD ) {
92. this.nombreBD = nombreBD;
93. }
94.
95. publicString getNombreBD () {
96. returnnombreBD;
97. }
98.
99. publicvoid setPuertoBD ( String puertoBD ) {
100. this.puertoBD = puertoBD;
101. }
102.
103. publicString getPuertoBD() {
104. returnpuertoBD;
105. }
106.
107. publicvoid setUsuarioBD ( String usuarioBD ) {
108. this.usuarioBD = usuarioBD;
109. }
110.
111. publicString getUsuarioBD() {
112. returnusuarioBD;
113. }
114.
115. publicvoid setContraseaBD ( String contraseaBD ) {
116. this.contraseaBD = contraseaBD;
117. }
118.
119. publicString getContraseaBD() {
120. returncontraseaBD;
121. }
122.
123. publicvoid setConsultaBD ( String consultaBD ) {
124. this.consultaBD = consultaBD;
125. }
126.
127. publicString getConsultaBD() {
128. returnconsultaBD;
129. }
130.
131. publicString getinteresNombre () {
132. try{
133. interesnombre = rs.getString("interes_nombre");
134. }
135. catch(SQLException sqle ) {
136. System.out.println("Error:" + sqle.getMessage() );
137. sqle.printStackTrace();
138. }
139. finally{

322

140. returninteresnombre;
141. }
142. }
143.
144. publicvoid setinteresNombre( String interesnombre ) {
145. this.interesnombre = interesnombre;
146. }
147.
148. publicString getinteresUrl () {
149. try{
150. interesurl = rs.getString("interes_url");
151. }
152. catch(SQLException sqle ) {
153. System.out.println("Error:" + sqle.getMessage() );
154. sqle.printStackTrace();
155. }
156. finally{
157. returninteresurl;
158. }
159. }
160.
161. publicvoid setinteresUrl( String interesurl ) {
162. this.interesurl = interesurl;
163. }
164.
165. publicString getinteresTipo() {
166. try{
167. interestipo= rs.getString("interes_tipo");
168. }
169. catch(SQLException sqle ) {
170. System.out.println("Error:" + sqle.getMessage() );
171. sqle.printStackTrace();
172. }
173. finally{
174. returninterestipo;
175. }
176. }
177.
178. publicvoid setinteresTipo( String interestipo ) {
179. this.interestipo = interestipo;
180. }
181.
182. }// fin del BeanLigas

4: La Tecnologa JDBC
Esta tecnologa nos permite mediante programas de Java o desde una
JSP , realizarconexiones a una base de datos y ejecutar sentencias de
SQL para hacer consultassobre ella . Esta tecnologa se detalla con
profundidad en la direccinweb: http://java.sun.com/jdbc/.

4.1 El API JDBC


El API JDBC es una tecnologaestndar creada por Sun y su uso permite al desarrollador de
pginas de Java yJSP tener conexin con un motor de base de datos no importando de que
tiposea.
Caractersticas ms importantesde sta API JDBC son:

Posibilidad de utilizar el lenguaje SQL ( StructuredQuery Languaje )

323

Acceso sencillo a todas las funciones deSQL.

Los resultados devueltos por SQL pueden ser tratadoscomo objetos, de manera
tal que ,
si hay errores puedan ser tratados comoexcepciones.

El API JDBC de Sun estainspirado en la filosofa del estndar ODBC ( Open Data Base
Conectivity )creado por Microsoft. Esta filosofa se basa en crear un estndar para el usode
cualquier base de datos utilizando el lenguaje Java. Es por esto que Suncreo una especie de
pasarela o puente entre JDBC y ODBC . Este puente seencarga de realizar la conversin de las
llamadas del JDBC a ODBC de formatotalmente transparente para el programador. EL puente
JDBC-ODBC no es lasolucin mas adecuada, ya que hay un proceso de conversin de una API a
otra yes motivo de mal rendimiento en una aplicacin cuando se hace uso masivo deconsultas en
una base de datos.

4.2 Tipos de controladores


Existen cuatro puentesdiferentes de controladores o driver JDBC definidos en la especificacin
JDBC deSun.

Puente 1. Los controladores de este tipo utilizan elsistema de pasarela o puente.


Un ejemplo es el JDBC-ODBC. No es la mejorsolucin porque en muchos casos
es necesario instalar un software especfico enel cliente adems de ser algo lento
en los accesos a la base dedatos.

Puente 2. Este tipo de controlador se conoce como APInativas, esto es, el


controlador contiene cdigo Jva mediante el cual serealizan las llamadas a los
mtodos nativos de la base de datos en C o C++ querealizan en acceso a la base
de datos. Algunas veces es necesario instalar unsoftware cliente para utilizar este
tipo de controladores.

Puente 3. Los drivers o controladores JDBC de estetipo se comunican con una


aplicacin intermedia en el servidor utilizandosockets que trasladan las peticiones
del programa cliente a una API especficadel controlador. Este tipo de driver tiene
la ventaja de no utilizar ningnsoftware en el cliente.

Puente 4. Los controladores o driver de ste tipoutilizan protocolos de red que


estn incluidos en el SGBD ( Sistema de Gestinde Bases de Datos ), y por lo
tanto los drivers se comunican de forma directacon la base de datos, utilizando
tambin sockets de Java. Es el mejor de los 4drivers ya que esta escrito por
completo en Java. La mayora de estoscontroladores son provistos por el
fabricante delSGBD.

4.3 Desarrollo de aplicaciones con el API JDBC


Una de las ventajas de utilizarun API JDBC es que todas sus funciones son las mismas,
independientemente de labase de datos a utilizar, as se programa una vez para cualquier
manejador debase de datos, y se puede hacer una aplicacin para MySQL y luego llevarla a
unservidor de produccin con una motor de base de datos ms poderoso, como SQLServer o
Postgres.

324

4.3.1 Cargar el controlador JDBC

El primer paso es conectarnuestro programa de Java con el servidor en que esta situada nuestra
base dedatos. En muchas ocasiones se necesitar de un nombre de usuario y contraseapara
poder acceder a la base de datos.
Cuando usamos Tomcat , parallevar a cabo la conexin con la base de datos, necesitamos que el
driver JDBC,que puede ser una archivo .jar o .class, se incluya en el CLASSPATH delentorno en
que se vaya a utilizar. En este caso ese archivo debe copiarse a lacarpeta lib, dentro de la
carpeta en que est instalado el intrprete depginas JSP. ver figura, tenemos el API JDBC de
MySQL en el archivomysql-connector-java-3.0.9-stable-bin.jar.

Figura: Si el sistema operativoutilizado es Windows 98/ME/NT/2000/XP se recomienda poner el


archivo .jardentro de la carpeta lib
Por supuesto , se tiene quedetener y reiniciar el servidor Tomcat, para que tome en cuenta ese
cambio. Yaque arrancamos de nuevo el servicio para que tome los cambios realizados, eldriver
JDBC para la base de datos MySQL ya esta disponible para ser utilizadodesde cualquier JSP.

4.3.2 Establecer una conexin

4.3.2.Establecer una conexin.


Seguiremos con el ejemplo deMySQL . Para conseguir una conexin con la base de datos
utilizamos el mtodoClass.forName()que nos permite crear una instancia de una clasede forma
dinmica. A veces se necesita el mtodo newInstance() para asegurarse de que se esta
registrando el driver de la siguientemanera:

325

Class.forName("com.mysql.jdbc.Driver").newInstance();
Al hacer esto, ya estadisponible el driver JDBC para ser utilizado por el resto de los
objetosnecesarios para acceder a la base de datos.
Lo siguiente es construir laURL en la que se define la forma de conexin a la base de datos, el
servidor enel que esta, el nombre de la misma y un usuario con clave son necesarios paraacceder
a la base de datos.
La sintaxis que se utiliza paraconstruir la URL que servir para la conexin a la base de datoses:
jdbc:mysql://[<servidor>][:puerto]/<nombre_basededatos>[?param1=valor1][&param2=valor2].
..[&paramN=valorN]
Los parmetrosson:
NombreUsoValor por omisinuserNombre del usuario paraacceder la la base de
datosningunopasswordContrasea de acceso a labase de datosningunoautoReconnectReintenta
conectar denuevo si la conexin se rompefalsemaxReconnectsNmero de veces que sedebe de
internar reconectar3initialTimeoutSegundos de espera entrelas diferentes
reconexiones2maxRowsNmero mximo de tuplas adevolver ( 0 significa todas
)0useUnicodeUtiliza Unicode cuandoest manejando datos de tipo StringcharacterEncoding Mapa
Unicode a utilizarcuando ninguno se enven datos de tipo Stringfalse
pero paranuestro ejemplo concreto la cadena es:
String connString ="jdbc:mysql://barbanegra/ejedgsca?user=root";
El primer dato,jdbc,especifica la forma de conexin a la base de datos,mysql es el nombredel
fabricante o manejador de base de datos,barbanegraes el nombre demi computadora, pero
puedes poner en su lugar el nombre de tu computadora, oponer localhost o 127.0.0.1 . El
nombreejedgsca esel nombre de la base de datos que creamos para este ejercicio, y el usuario
ycontrasea son opcionales, depende si quieres tener seguridad en tu base dedatos, y eso lo
estableces desde el motor de MySQL con el comando mysqladmin ocon el monitor de mysql.

4.3.3 Enviar consultas

4.3.3.Enviar consultas.
Una vez creada la conexin a labase de datos, podemos crear sentencias o ejecutar consultas
desde nuestroprograma de Java para interactuar con la base de datos. Podemos crear
consultasque modifiquen la base de datos sin devolver ningn resultado, p. ej: INSERT,ALTER,
DELETE, CREATE, DROP, o UPDATE.
El cdigo en cuestin debepresentar una estructura similar a sta, ver ejemplo:
Statement stmt;
stmt = con.createStatement();
stmt.executeUpdate("INSERT INTOinteres (interes_nombre, interes_url," +
"interes_tipo) VALUES ('" + args[0]+ "', '" + args[1] + "', '" + args[2] +"')");

326

El mtodocreateStatement()crea un canal abierto a travs del cual se pueden ejecutar


consultas.
Ejecutar una consulta con el objetoStatement- mtodo executeUpdate()
El mtodoexecuteUpdate()es el que realmente ejecuta la consulta en la base de datos,
mientrasque el mtodoclose()permite liberar los recursos asignados a laconexin abierta.
El ejemplo a continuacin insertatuplas a una tabla llamada interesperteneciente a la base de
datosligas.
Ejecutar una consulta con el objeto Statement - mtodoexecuteQuery()
Las consultas de recuperacinde tuplas o registros se ejecutan con el
mtodoexecuteQuery(). Este mtodo devuelve un objeto ResultSet, el cual puede usarsepara
acceder a cada una de los registros devueltos:
Connection con = null;
Statement stmt =null;
ResultSet rs =null;
try {

...
Class.forName("com.mysql.jdbc.Driver").newInstance();
con =DriverManager.getConnection(url,usuario,contrasea);

stmt =con.createStatement();
rs =stmt.executeQuery("SELECT interes_nombre, interes_url, interes_tipo
FROMinteres LIMIT 5");

4.3.4 Procesar los resultados

4.3.4.Procesar los resultados.


Ya creado el objeto ResultSet,la forma mas fcil de conseguir esto consiste en usar un
buclewhiley el mtodonext(), as:
while ( rs.next() ) {
/* Haga algocon los resultados */
}
Para recuperar los valores delos campos de una tabla el procedimiento consiste en manejar los
resultadosmediante la asignacin de los valores de las columnas a variables, en funcindel tipo de
valor. Hay funciones para distintos tipos, as getInt()recupera un valor
entero,getDoble()recupera un valor double, ygetString()se encarga de la manipulacin del
texto. Todos estos mtodos aceptan tanto elnmero ( indexado a partir del 1 ) as como el
nombre de la columna comoargumento:
while ( rs.next() ) {
String inom =rs.getString("interes_nombre");
String iurl =rs.getString("interes_url");
String itip =rs.getString("interes_tipo");
System.out.println("Sitio Web "+ (i++) + ":\n"

327

+ inom + "\n"
+iurl + "\n"
+itip + "\n\n" );

Ejemplo1:
Si quieres obtener el cdigo del archivo dale clic con el botn derechoaqu TablaGeneral2.jsp
Si quieres ver la ejecucin del programa dale clic aqu (enconstruccin)
1.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2.
<!-- Ejemplo de Acceso a una Base de Datos desdeuna Pgina JSP -->
3.
<@ page import="java.sql.*" %>
4.
<HTML>
5.
<HEAD>
6.
<TITLE>Desplegando una tablausando el JDBC y MySQL</TITLE>
7.
<meta name="author" content="Oscar AlejandroGonz&aacute;lez Bustamante">
8.
<meta name="keywords" content="JSP, JDBC, MySQL,Acceso a Datos">
9.
<meta name="description" content="Unejemplo de despliegue de una tabla usando JSP">
10.
</HEAD>
11.
<BODY>
12.
<H2>Ejemplo de Acceso a una base de Datos usando JSP yMySQL</H2>
13.
<% String varNombreTabla = request.getParameter("Tabla");%>
14.
<H3>Mostrando los datos desde MySQL de la base de datos ejedgsca</H3>
15.
<%
16.
try {
17.
/* cargar las clases del JDBC deMySQL */
18.
Class.forName("com.mysql.jdbc.Driver").newInstance();
19.
20.
/* Establece la cadenapara conectarse a la base de datos
21.
local */
22.
23.
String connString ="jdbc:mysql://barbanegra/ejedgsca?user=root";
24.
Connection conn =DriverManager.getConnection( connString );
25.
26.
/* Obtener el result set */
27.
Statement stmt =conn.createStatement();
28.
String varSQL = "SELECT * FROM " +varNombreTabla;
29.
ResultSet rs = stmt.executeQuery( varSQL);
30.
/* Obtiene los meta datossobre el result set */
31.
ResultSetMetaDatarsMeta = rs.getMetaData();
32.
%>
33.
<TABLE BORDER=1 bgcolor="#FFFFFF"cellspacing="5"><font face="Arial, Helvetica, sansserif"color="#000000">
34.
<caption><B><%= varTablaNombre%></B></caption></font>
35.
<THEAD>
36.
<TR><%
37.
/* Despliega los nombres delas columnas como cadenas */
38.
String varColNombres ="";
39.
int varColCuenta =rsMeta.getColumnCount();
40.
for ( int col = 1; col<=varColCuenta; col++ ) {
41.
%><TH bgcolor="C0C0C0"bordercolor="#000000"><font size="2" FACE
="Arial"color="#000000"
42.
><%= rsMeta.getColumnName( col )%></font>&nbsp;</TH>
43.
<%}%>
44.
</TR>
45.
</THEAD>
46.
<tbody><%
47.
/* Despliega los valores delas columnas */
48.
while ( rs.next() ) {
49.
%><TRvalign="top"><%
50.
for ( int col =1; col<= 10; col++ ) {
51.
%><TD bordercolor="#C0C0C0"><font size="2" face="Arial, Helvetica, sansserif"color="#000000"

328

52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.

><%= rs.getString( col )%><BR></font></TD>


<% }
}
/* limpieza */
rs.close();
stmt.close();
conn.close();
}
catch ( ClassNotFoundException e ){
out.println("Excepcin del Driver: " + e);
}%>
</tr>
</tbody>
<tfoot></tfoot>
</TABLE>
</BODY>
</HTML>

Ejemplo 2:
Si quieres obtener el cdigo del archivo dale clic con el botn derechoaqu
TablaGeneral4Ligas.jsp
Si quieres ver la ejecucin del programa dale clic aqu (enconstruccin)
1.

<%@ pagecontentType="text/html; charset=ISO-8859-1"


language="java"import="java.util.*,

2.
java.io.*,
3.
java.sql.*,
4.
javax.servlet.*,
5.
javax.servlet.http.*,
6.
sun.jdbc.odbc.*,
7.
java.lang.*"%>

329

8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.

<HTML>
<HEAD>
<TITLE>Desplegando una tabla usando el JDBC yMySQL</TITLE>
<meta name="author" content="Oscar Alejandro
Gonz&aacute;lezBustamante">
<meta name="keywords" content="JSP, JDBC, MySQL,Acceso a Datos">
<meta name="description" content="Un ejemplo de despliegue de unatabla
usando JSP">
</HEAD>
<BODY>
<H2>Ejemplo de Acceso a una base de Datos usando JSP yMySQL</H2>
<%
String varNombreBase =request.getParameter("Bd");
String varNombreTabla =request.getParameter("Tabla");
%>
<H3>Mostrando los datos desde MySQL de la base de datos ejedgsca</H3>
<%
try {
/* cargar las clases del ODBC-JDBC deMySQL
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); */
Class.forName("com.mysql.jdbc.Driver").newInstance();
/* Connection conn =DriverManager.getConnection(
"jdbc:odbc:cursojsp2003" ); */
String connString ="jdbc:mysql://barbanegra/"+ varNombreBase
+"?user=root";
Connection conn =DriverManager.getConnection( connString );
/* Obtener el result set*/
Statement stmt = conn.createStatement();
String varSQL = "SELECT * FROM " +varNombreTabla;
ResultSet rs = stmt.executeQuery( varSQL);
/* Obtiene los meta datossobre el result set */
ResultSetMetaData rsMeta = rs.getMetaData();
%>
<TABLE BORDER=1 bgcolor="#FFFFFF"cellspacing="5"><font face="Arial,
Helvetica, sans-serif"color="#000000">
<caption>Base de datos:<B><%=
varNombreBase%></B>Tabla:<B><%=varNombreTabla%></B></caption></font
>
<THEAD>
<TR><%
/* Despliega los nombres de las columnascomo cadenas */
String varColNombres = "";
int varColCuenta = rsMeta.getColumnCount();
for ( int col = 1; col<= varColCuenta; col++ ){
%><TH bgcolor="C0C0C0"bordercolor="#000000"><font size="2"
FACE ="Arial"color="#000000">
<%= rsMeta.getColumnName( col
)%></font>&nbsp;</TH>
<%}%>
</TR>
</THEAD>
<tbody><%
/* Despliega los valores de las columnas*/
while ( rs.next() ) {
%><TRvalign="top"><%
for ( int col = 1; col<=varColCuenta; col++ ) {
if ( !rsMeta.getColumnName(col ).equals( "interes_url" ) ) {%>
<TD bordercolor="#C0C0C0">

330

63.

<font size="2" face="Arial,Helvetica, sans-serif"


color="#000000">

64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.

<%= rs.getString( col )%><BR></font></TD>


<%} else {%>
<TD bordercolor="#C0C0C0">
<fontsize="2" face="Arial, Helvetica, sansserif"color="#000000">
<a href="<%= rs.getString( col )%>"><%= rs.getString( col
)%></a>
<BR></font></TD>
<%}%>
<% }
}
/*limpieza */
rs.close();
stmt.close();
conn.close();
}
catch ( ClassNotFoundException e ) {
out.println("Excepcin del Driver: " + e);
}%>
</tr>
</tbody>
<tfoot></tfoot>
</TABLE>
</BODY>
</HTML>

4.3.5 Cerrar la Conexin


4.3.5 Cerrar la Conexin
Siempre que se trabaja con bases de datos, al finalizar la interaccin con ella, hay que cerrar los
conjuntos de resultados, sentencias y conexiones empleados, en todos los casos utilizamos el
mtodo close(), y hay que verificar si en ese proceso hubo alguna excepcin, porque el mtodo
close(), puede reportar algn evento de error y hay que capturarlo.

331

Liberar el objeto ResultSet

En el ejemplo de la lnea 39 hasta la lnea 45 liberamos el objeto ResultSet .


38.
39.
40.
41.
42.
43.
44.
45.

finally {
if ( rs != null ) {
try {
rs.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}

Liberar el objeto Statement

Posteriormente en el mismo ejemplo de la lnea 47 hasta la lnea 54 liberamos el objeto


Statement .
47.
48.
49.
50.
51.
52.
53.
54.

if ( stmt != null ) {
try {
stmt.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
}

Liberar el objeto Connection.

Finalmente en el mismo ejemplo de la lnea 47 hasta la lnea 54 liberamos el objeto Connection


.
55.
56.
57.
58.
59.
60.
61.

if ( con != null ) {
try {
con.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}

14. Utileras de Java


Ultima fecha en que se actualiz esta pgina: May 27, 2005 5:00 PM
14. Utileras de Java.
En Java varias clases e interfaces utilitarias vienen en el paquete java.util. Algunas importantes
son la clase Vector, la interfaz Enumeration, la clase Stack, la clase Hashtable, la clase
Properties y la clase BitSet .
Utilizamos la clase Vector para crear objetos tipo arreglos que pueden aumentar o disminuir de
tamao en forma dinmica, segn cambien los requerimientos de almacenamiento en un
programa en tiempo de ejecucin.

332

La interfaz Enumeration permite iterar a travs de los elementos de un contenedor como es el


caso de un objeto Vector.
La clase Stack es una subclase de Vector y ofrece operaciones convencionales de pila como son
el push y el pop, asi como otras mas.
En cuanto a la clase Hashtable nos proporciona una estructura para almacenar datos con llaves
en tablas y para recuperar estos datos. La clase Properties nos da el soporte para las tablas de
hash persistentes, esto es, tablas de hash que pueden escribirse en un archivo mediante un flujo
de salida y que pueden leerse de un archivo mediante un flujo de entrada.
Con las colecciones, tendremos un marco de trabajo para manipular grupos de objetos llamados
colecciones. Los objetos de tipo Vector, Stack y Hashtable son colecciones.
La clase BitSet nos permite crear objetos de tipos arreglos de bits para establecer y obtener
valores de bits individuales.
En Java tenemos libreras para manejo de funciones y constantes matemticas, desde la
trigonometra mas bsica dentro de la clase Math (dentro del paquete java.lang ) , hasta el
soporte aritmtico de precisin arbitrario de las clases BigInteger y BigDecimal ( ambas, en el
paquete java.math ).
Finalmente se describe la capacidad de internacionalizacin y cambio de formato que se necesita
para mostrar adecuadamente fechas y nmeros de diferentes pases. Mediante la clase
DateFormat , nos aseguraremos de que las fechas se muestren de manera acorde al pas
destino, y con la clase NumberFormat , nos ayudar para el trabajo con nmeros, ya que
permite mostrar smbolos monetarios, o formatear un nmero para que tenga una cantidad
determinada de decimales, ( ambas clases pertenecen al paquete java.text ). Depende del
programador averiguar y calcular los cambios de moneda vigentes en el mercado

333

You might also like