Вы находитесь на странице: 1из 63

Extreme Guide: Usando Java

Extreme Guide:
Usando Java

Usa

Be free… I'm free, I use Linux… Close your Windows, open your mind!!!

Editorial Mi-K-sita
1ª Edición (en español)
Ejemplares impresos: 1

Derechos reservados

Queda totalmente aprobada cualquier copia parcial o completa de la


presente guía, aún sin el consentim u autor.
Extreme Guide
© Copylef t 2008 by

Ver 200804
Extreme Guide: Usando Java Introducción

Introducción • En una de ellas tenemos abi t H puntando al fichero


packages.html de la documenta e Java, para poder tener
La presente guía, Extreme Guide: Usando Java, no es más que eso: una al momento la información sob tros de llamada, valores
guía práctica para el seguimiento del lenguaje de programación Java. Es de retorno y la información d as funciones que estemos
más una recompilación, comparación y reforzamiento de la programación utilizando.
orientada a objetos. • Los que estén desarr Windows, podrán disponer de la
documentación del AP desde el sistema de ayuda de Windows
Se sobreentenderá que ya usted cuenta con un lenguaje de programación si han descargado esta ntación en formato WinHelp.
denominado Java (provisto por la empresa Sun Microsystem), instalado en • Tendremos a tra ventana con un editor, donde iremos
el computador, en el cual realizará las prácticas recomendadas en esta escribie e nuestra aplicación Java. En Windows son muy
guía. En caso de no contar con esto se le recomienda su adquisición e utilizad ad y Diva. Aunque en estos momentos, quien
instalación a la brevedad posible, ya que sin él no podrá seguir con los tiene p suficiente en su ordenador, está programando Java
ejercicios propuestos en la presente guía. desde el Java Workshop de Sun.
• ventana más donde tendremos acceso al prompt del sistema
En esta guía presentaremos una visión general del lenguaje de
der invocar al compilador y a las demás herramientas del JDK.
programación Java, así como también trataremos algunas características
avanzadas del lenguaje.
ue tengan algo de dinero podrán estar utilizando alguno de los
nos shareware que ya hay disponibles como JCreator, IntelliJ Idea,
No obstante, y para que todos tengamos una idea general de lo que
RadJa, Kawa o JavaMaker.
Java, haremos una serie de aclaraciones o indicaciones, para q
que no esté muy decidido a aprender Java, pueda tener ele
Los que sí disponen de poder adquisitivo suficiente habrán empezado con
juicio y de comparación para tomar esa decisión. Por ello, ha
el Symantec Café de Symantec, porque ahora estarán trabajando con
introducción más extensa de lo que sería habitual en una
Borland C++ 5.0, que soporta Java, o estarán entusiasmados con el Visual
J++ de Microsof t, o estarán deseando ver ya en sus pantallas el Borland
En el planteamiento inicial se supone que ust o esto,
Lat te.
tiene experiencia en algún lenguaje de prog (como puede ser
C++, C# o algún otro lenguaje similar), y de y entiende la
Y los enamorados de OS2, que en su versión 4.0 ya incluye una Máquina
programación orientada a objetos. Intentarem tos conocimientos
Virtual Java (JVM) en su kernel, se lo pasarán en grande con el IBM
sean suficientes.
VisualAge for Java.

El entorno de desarrollo habitual e que trabajamos con el JDK


Los objetivos que nos hemos marcado, para que tú, cuando llegues al final
(los pobres sin tener para compra ientas comerciales), consiste
de la guía, seas capaz de crear aplicaciones autónomas en Java, enfocadas
en tener abiertas sobre el escri pantalla, ya sea en Solaris,
en las estructuras de datos.
Windows o Linux, varia samos para lo siguiente (si
contamos con algun merciales no tendrán que tener todas
Intentaremos cumplir lo que acabamos de prometer, aunque también
estas ventanas abie
pedimos paciencia, ya que Java, en este momento, es un lenguaje con una
Ver 200804 2
Extreme Guide: Usando Java Introducción

notable vitalidad, que todavía estamos aprendiendo nosotros. Por otro


lado, no es nada sencillo el hacerse entender, por lo que tenemos que dar
varias vueltas a cada uno de los conceptos que escribimos para
cerciorarnos de que tú, que lo lees, comprendas exactamente lo que te
queremos transmitir.

Además, tampoco esperes que te proporcionemos ungüentos milagrosos,


que por arte de magia traspasen el conocimiento. El estudio de Java no
será sino el examen de una particular forma de ver las cosas, con un poco
de estructuración en la presentación; el resto es, como siempre, tarea del
programador. Es decir, uno puede aprender a construir una aplicación, o
dejar que alguna de las herramientas la construyan automáticamente,
pero... la inteligencia de esa pieza siempre dependerá de la habilidad y
experiencia del programador respecto del lenguaje usado y de sus
recursos. En fin, una buena aplicación será únicamente resultado del
trabajo de un buen programador Java.

Bueno, no queda más que encender la computadora y empezar a trabajar,


esperando que la presente guía les sirva de ayuda.

Bue

Ver 200804 3
Extreme Guide: Usando Java Java

1.2. Historia
Java
Java comenzó como un proyecto lla y su objetivo inicial era
1. Java crear un lenguaje que fuera capaz d en electrodomésticos que
tuvieran microprocesadores, pe uenta que ese tipo de
Para trabajar, o programar, en el entorno denominado Java debemos tecnología estaba aún muy lejos existir.
empezar por iniciar dicha aplicación. Para esto sigamos los siguientes
pasos: El proyecto dio como resu enguaje muy parecido a C / C++, al cual
le llamaron "Oak" (en refe roble que se encontraba en el exterior
Java es un lenguaje de programación orientado a objetos desarrollado por de las oficinas de osystems), por James Gosling en junio de 1.991,
Sun Microsystems a principios de los años 1990. Las aplicaciones Java están para usarse de receptor digital externo, pero descubrieron
típicamente compiladas en un bytecode1 , aunque la compilación en código que ya ex e con este nombre. Luego alguien sugirió el
máquina nativo también es posible. En el tiempo de ejecución, el nombre de cree que es por un tipo de café y otros piensan que son
bytecode es normalmente interpretado o compilado a código nativo para siglas) y fue ese nombre el que quedó.
la ejecución, aunque la ejecución directa por hardware del bytecode por
un procesador Java también es posible. La implementación pública fue Java v1.0 en 1.995. Prometía
na vez, ejecutar en cualquier parte" ("write once, run
El lenguaje en sí mismo toma mucha de su sintaxis de C y C++, pero tiene here"), proporcionando ningún coste extra en el tiempo de ejecución
un modelo de objetos más simple y elimina herramientas de bajo ni l s plataformas populares. Era bastante seguro y su seguridad era
como punteros. JavaScript , un lenguaje interpretado2 , comparte configurable, permitiendo restringir el acceso a archivos o a una red.
nombre similar y una sintaxis similar, pero no está dir
relacionado con Java. Los principales navegadores web pronto incorporaron la capacidad de
ejecutar "applets11" Java seguros dentro de páginas web. Java adquirió
Sun Microsystems proporciona una implementación GNU3 popularidad rápidamente. Con la llegada de "Java 2", las nuevas versiones
License de un compilador Java y una máquina e a las tuvieron múltiples configuraciones pensadas para diferentes tipos de
especificaciones del Java Community Process eca de plataformas. Por ejemplo, J2EE12 era para aplicaciones de empresa y la
clases que se requiere para ejecutar los prog va no es sof tware versión reducida J2ME13 era para aplicaciones para móviles. J2SE era la
libre4 . designación para la Edición Estándar. En 2.006, las nuevas versiones "J2"
fueron renombradas a Java EE, Java ME y Java SE, respectivamente.
1.1. Generalidades
En 1.997, Sun se dirigió al cuerpo de estándares ISO / IEC JTC1 y más tarde
Paradigma: Orientado a o a Ecma International para formalizar Java, pero pronto se retiró del
Apareció en: 1990s proceso. Java permanece como un estándar de facto propietario que está
Diseñado por: Sun Microsyst controlado a través del Java Community Process. Sun hace disponibles la
Tipo de dato: Fuert mayoría de sus implementaciones Java sin cargo alguno, generando los
Implementaciones: do por: Objective-C5 , C++, Smalltalk6 , ingresos con productos especializados como el Java Enterprise System. Sun
do: C#8 , J#9 , JavaScript 10 . distingue entre su Sof tware Development Kit (SDK) y su Java Runtime
Ver 200804 4
Extreme Guide: Usando Java Java

Environment (JRE) que es un subconjunto del SDK, siendo la principal • macros (#define)
distinción que en el JRE no está presente el compilador. • necesidad de liberar memoria (f )

El 13 de noviembre de 2.006, Sun liberó partes de Java como sof tware Aunque, en realidad, lo que hace las palabras reservadas
libre de código abierto, bajo la GNU General Public License (GPL). La (struct , typedef), ya que las clase do.
publicación del código fuente completo bajo la GPL se esperaba que
ocurriera en la primera mitad de 2.007. Además, el intérprete com ue hay en este momento es muy
pequeño, solamente ocup de RAM.
1.3. Características
b. Orientado a o
Las características principales que nos ofrece Java respecto a cualquier
otro lenguaje de programación, son: Java imple ología básica de C++ con algunas mejoras y
elimina alg as para mantener el objetivo de la simplicidad del
a. Simple lenguaje. Java trabaja con sus datos como objetos y con interfaces a esos
ob oporta las tres características propias del paradigma de la
Java ofrece toda la funcionalidad de un lenguaje potente, pero sin las ori a objetos: encapsulación, herencia y polimorfismo. Las
características menos usadas y más confusas de éstos. C++ es un lenguaje e objetos son llamadas, como en C++, clases y sus copias,
que adolece de falta de seguridad, pero C y C++ son lenguajes más cias. Estas instancias, como en C++, necesitan ser construidas y
difundidos, por ello Java se diseñó para ser parecido a C++ y así facili idas en espacios de memoria.
un rápido y fácil aprendizaje.
Java incorpora funcionalidades inexistentes en C++ como por ejemplo, la
Java elimina muchas de las características de otros lenguajes resolución dinámica de métodos. Esta característica deriva del lenguaje
para mantener reducidas las especificaciones del lenguaje Objective C, propietario del sistema operativo Next . En C++ se suele
características muy útiles como el Garbage Collecto or de trabajar con librerías dinámicas (DLLs) que obligan a recompilar la
memoria dinámica). No es necesario preocupa ria, el aplicación cuando se retocan las funciones que se encuentran en su
reciclador se encarga de ello, y como es un oridad, interior. Este inconveniente es resuelto por Java mediante una interfaz
cuando entra en acción, permite liberar bloque moria muy grandes, específica llamada RTTI (RunTime Type Identification) que define la
lo que reduce la fragmentación de la memoria. interacción entre objetos excluyendo variables de instancias o
implementación de métodos. Las clases en Java tienen una representación
Java reduce en un 50% los errores más comunes de programación con en el runtime que permite a los programadores interrogar por el tipo de
lenguajes como C y C++ al eliminar muchas de las características de éstos, clase y enlazar dinámicamente la clase con el resultado de la búsqueda.
entre las que destacan:
c. Distribuido
• aritmética de puntero
• no existen referencia Java se ha construido con extensas capacidades de interconexión TCP / IP.
• registros (struct Existen librerías de rutinas para acceder e interactuar con protocolos como
• definición de ti ht tp y f tp. Esto permite a los programadores acceder a la información a
Ver 200804 5
Extreme Guide: Usando Java Java

través de la red con tanta facilidad como a los ficheros locales. Java en sí Linux, Irix, Aix, Mac, Apple y probablemen grupos de desarrollo
no es distribuido, sino que proporciona las librerías y herramientas para trabajando en el porting a otras plataformas
que los programas puedan ser distribuidos, es decir, que se corran en
varias máquinas, interactuando. f. Seguro

d. Robusto La seguridad en Java tiene dos En el lenguaje, características


como los punteros o el ca ue hacen los compiladores de C y
Java realiza verificaciones en busca de problemas tanto en tiempo de C++ se eliminan para p acceso ilegal a la memoria (ambos
compilación como en tiempo de ejecución. La comprobación de tipos en lenguajes permiten un a ecto a la memoria del computador).
Java ayuda a detectar errores, lo antes posible, en el ciclo de desarrollo. Cuando se usa ara crear un navegador, se combinan las
Java obliga a la declaración explícita de métodos, reduciendo así las característ e con protecciones de sentido común aplicadas
posibilidades de error. Maneja la memoria para eliminar las al propio na
preocupaciones por parte del programador de la liberación o corrupción de
la misma. El lenguaje C, por ejemplo, tiene lagunas de seguridad importantes, como
son res de alineación. Los programadores de C utilizan punteros en
También implementa los arrays auténticos, en vez de listas enlazadas de co con operaciones aritméticas. Esto le permite al programador
punteros, con comprobación de límites, para evitar la posibilidad de tero referencie a un lugar conocido de la memoria y pueda
sobrescribir o corromper memoria resultado de punteros que señalan a (o restar) algún valor, para referirse a otro lugar de la memoria. Si
zonas equivocadas. Estas características reducen drásticamente el tiem programadores conocen nuestras estructuras de datos pueden
de desarrollo de aplicaciones en Java. extraer información confidencial de nuestro sistema.

Además, para asegurar el funcionamiento de la aplicación, r Otra laguna de seguridad u otro tipo de ataque, es el Caballo de Troya. Se
verificación de los bytecodes, que son el resultado de la compila presenta un programa como una utilidad, resultando tener una
programa Java. Es un código de máquina virtual que es in por el funcionalidad destructiva. Por ejemplo, en Linux se visualiza el contenido
intérprete Java. No es el código máquina dire por el de un directorio con el comando ls. Si un programador deja un comando
hardware, pero ya ha pasado todas las fases isis de destructivo bajo esta referencia, se puede correr el riesgo de ejecutar
instrucciones, orden de operadores, etc., y ya enerada la pila de código malicioso, aunque el comando siga haciendo la funcionalidad que se
ejecución de órdenes. le supone, después de lanzar su carga destructiva. Después de que el
caballo de Troya haya enviado por correo el / etc / shadow a su creador,
e. Arquitectura neutral ejecuta la funcionalidad de ls presentando el contenido del directorio. Se
notará un retardo, pero nada inusual.
Para establecer Java como parte a red, el compilador Java
compila su código a un fichero ormato independiente de la El código Java pasa muchos tests antes de ejecutarse en una máquina. El
arquitectura de la máqui tará. Cualquier máquina que código se pasa a través de un verificador de bytecodes que comprueba el
tenga el sistema de ejecu e ejecutar ese código objeto, formato de los fragmentos de código y aplica un probador de teoremas
sin importar en m máquina en que ha sido generado. para detectar fragmentos de código ilegal (código que falsea punteros,
Actualmente existe ime para Solaris, SunOS, Windows, viola derechos de acceso sobre objetos o intenta cambiar el tipo o clase de
Ver 200804 6
Extreme Guide: Usando Java Java

un objeto). una instancia de un objeto. Por tanto, ning o se crea y almacena


en memoria, sin que se validen los privile acceso. Es decir, la
Si los bytecodes pasan la verificación sin generar ningún mensaje de error, seguridad se integra en el momento n, con el nivel de detalle
entonces sabemos que: y de privilegio que sea necesario

• El código no produce desbordamiento de operandos en la pila. Dada pues, la concepción del , y si todos los elementos se
• El tipo de los parámetros de todos los códigos de operación son mantienen dentro del es por Sun, no hay peligro. Java
conocidos y correctos. imposibilita, también, ab fichero de la máquina local (siempre
• No ha ocurrido ninguna conversión ilegal de datos, tal como convertir que se realizan operacio archivos, éstas trabajan sobre el disco
enteros en punteros. duro de la máqui nde partió la aplicación), no permite ejecutar
• El acceso a los campos de un objeto se sabe que es legal: public, ninguna ap e una plataforma e impide que se utilicen otros
private, protected. ordenadore es decir, nadie puede utilizar nuestra máquina
• No hay ningún intento de violar las reglas de acceso y seguridad para hace nes o realizar operaciones con otra. Además, los
establecidas. intérpretes que incorporan los navegadores de la web son aún más
res
El Cargador de Clases (classloader) también ayuda a Java a mantener su
seguridad, separando el espacio de nombres del sistema de ficheros local condiciones (y dentro de la filosofía de que el único ordenador
del de los recursos procedentes de la red. Esto limita cualquier aplicación o es el que está apagado, desenchufado, dentro de una cámara
del tipo Caballo de Troya, ya que las clases se buscan primero entre zada en un bunker y rodeado por mil soldados de los cuerpos
locales y luego entre las procedentes del exterior. especiales del ejército), se puede considerar que Java es un lenguaje
seguro y que los applets y aplicaciones están libres de virus.
Las clases importadas de la red se almacenan en un espacio d
privado, asociado con el origen. Cuando una clase del espacio d g. Portable o independiente de la plataforma
privado accede a otra clase, primero se busca en las c finidas
(del sistema local) y luego en el espacio de no e hace Más allá de la portabilidad básica por ser de arquitectura independiente,
la referencia. Esto imposibilita que una clase su nida. Java implementa otros estándares de portabilidad para facilitar el
desarrollo. Los enteros son siempre enteros y además, enteros de 32 bits
En resumen, las aplicaciones de Java resultan e mente seguras, ya en complemento a 2. Además, Java construye sus interfaces de usuario a
que no acceden a zonas delicadas de memoria tema, con lo cual través de un sistema abstracto de ventanas de forma que las ventanas
evitan la interacción de ciertos virus. Java no posee una semántica puedan ser implantadas en entornos Unix, PC o Mac.
específica para modificar la pila de programa, la memoria libre o utilizar
objetos y métodos de un programa ilegios del kernel del sistema h. Interpretado
operativo. Además, para evitar mo s por parte de los crackers de
la red, implementa un m de autentificación por clave El intérprete Java (sistema runtime) puede ejecutar directamente el
pública. código objeto. Enlazar (linkar) un programa, normalmente, consume
menos recursos que compilarlo, por lo que los desarrolladores con Java
El Cargador de Cla ar una firma digital antes de realizar pasarán más tiempo desarrollando y menos esperando por el ordenador. No
Ver 200804 7
Extreme Guide: Usando Java Java

obstante, el compilador actual del JDK es bastante lento. Por ahora, que simultáneas en un programa. Los threads s llamados procesos
todavía no hay compiladores específicos de Java para las diversas ligeros), son básicamente pequeños proceso as independientes de
plataformas, Java es más lento que otros lenguajes de programación, un gran proceso. Al estar los threa en el lenguaje, son más
como C++, ya que debe ser interpretado y no ejecutado como sucede en fáciles de usar y más robustos que s en C o C++.
cualquier programa tradicional.
El beneficio de ser multithrea iste en un mejor rendimiento
Se dice que Java es de 10 a 30 veces más lento que C, y que tampoco interactivo y mejor co en tiempo real. Aunque el
existen en Java proyectos de gran envergadura como en otros lenguajes. comportamiento en tiem está limitado a las capacidades del
La verdad es que ya hay comparaciones ventajosas entre Java y el resto de sistema operativo subyac ix, Windows, etc.), aún supera a los
los lenguajes de programación, y una ingente cantidad de folletos entornos de flujo programa (singlethreaded) tanto en facilidad de
electrónicos que supuran fanatismo en favor y en contra de los distintos desarrollo c ento.
lenguajes contendientes con Java.
Cualquiera a utilizado la tecnología de navegación concurrente,
Lo que se suele dejar de lado en todo esto, es que primero habría que sabe lo frustrante que puede ser esperar por una gran imagen que se está
decidir hasta que punto Java, un lenguaje en pleno desarrollo y todavía sin tra En Java, las imágenes se pueden ir trayendo en un thread
definición definitiva, está maduro como lenguaje de programación para ser ind nte, permitiendo que el usuario pueda acceder a la información
comparado con otros; como por ejemplo con Smalltalk, que lleva más de a sin tener que esperar por el navegador.
20 años en cancha.

La verdad es que Java, para conseguir ser un lenguaje independiente


sistema operativo y del procesador que incorpore la máquina u
tanto interpretado como compilado. Y esto no es ningún contras
explico: el código fuente escrito con cualquier editor s
generando el bytecode. Este código intermedio es de mu l, pero
sin alcanzar las instrucciones máquina propia a y no
tiene nada que ver con el pCode de Visual Bas sponde
Monolito: cada pieza de código se Sistema Federado: el navegador es un coordinador
al 80% de las instrucciones de la aplicación. Ese código es el que se compacta dentro del código del de piezas, y cada pieza es responsable de una
puede ejecutar sobre cualquier plataforma llo hace falta el navegador. función. Las piezas se pueden añadir
runtime, que sí es completamente dependie a máquina y del dinámicamente a través de la red.
sistema operativo, que interpreta dinámicamente el bytecode y añade el
20% de instrucciones que faltan para su ejecución. Con este sistema es j. Dinámico
fácil crear aplicaciones multip ero para ejecutarlas es
necesario que exista el runtime co te al sistema utilizado. Java se beneficia todo lo posible de la tecnología orientada a objetos. Java
no intenta conectar todos los módulos que comprenden una aplicación
i. Multithreaded hasta el tiempo de ejecución. Las librerías nuevas o actualizadas no
paralizarán las aplicaciones actuales (siempre que mantengan el API
Al ser multithrea Java permite muchas actividades anterior).
Ver 200804 8
Extreme Guide: Usando Java Java

Java también simplifica el uso de protocolos nuevos o actualizados. Si su recolector de basura de Java borra el objeto do así la memoria que
sistema ejecuta una aplicación Java sobre la red y encuentra una pieza de ocupaba previniendo posibles fugas (eje n objeto creado y
la aplicación que no sabe manejar, tal como se ha explicado en párrafos únicamente usado dentro de un mé e entidad dentro de éste;
anteriores, Java es capaz de traer automáticamente cualquiera de esas al salir del método el objeto es e n así, es posible que se
piezas que el sistema necesita para funcionar. produzcan fugas de memoria si na referencias a objetos
que ya no son necesarios, es de en aún ocurrir, pero en un nivel
Java, para evitar que los módulos de bytecodes o los objetos o nuevas conceptual superior. En de ector de basura de Java permite
clases, haya que estar trayéndolos de la red cada vez que se necesiten, una fácil creación y ón de objetos, mayor seguridad y
implementa las opciones de persistencia, para que no se eliminen cuando frecuentemente más rápid C++.
de limpie la caché de la máquina.
La recolecc e Java es un proceso prácticamente invisible al
k. Recolector de basura desarrollad final de la aplicación que se haga en él). Es
decir, el p or no tiene conciencia de cuándo la recolección de
Un argumento en contra de lenguajes como C++ es que los programadores basura tendrá lugar, ya que ésta no tiene necesariamente que guardar
se encuentran con la carga añadida de tener que administrar la memoria rel n las acciones que realiza el código fuente.
de forma manual. En C++, el desarrollador debe asignar memoria en una
zona conocida como heap (montículo) para crear cualquier objeto, y ajas de Java
posteriormente desalojar el espacio asignado cuando desea borrarlo. Un
olvido a la hora de desalojar memoria previamente solicitada, o si no o se debe volver a escribir el código si quieres ejecutar el programa
hace en el instante oportuno, puede llevar a una fuga de memoria, ya q en otra máquina. Un solo código funciona para todos los browsers
el sistema operativo piensa que esa zona de memoria está sie compatibles con Java o donde se tenga una Máquina Virtual de Java
por una aplicación cuando en realidad no es así. Así, un pro (Mac's, PC's, Sun's, etc).
diseñado podría consumir una cantidad desproporcionada de • Java es un lenguaje de programación orientado a objetos, y tiene
Además, si una misma región de memoria es desaloj ces el todos los beneficios que ofrece esta metodología de programacion
programa puede volverse inestable y lleva cemos (más adelante doy una pequeña introducción a la filosofía de objetos).
coloquialmente, un eventual "cuelgue" del siste • Un browser compatible con Java deberá ejecutar cualquier programa
hecho en Java, esto ahorra a los usuarios tener que estar insertando
En Java (y lenguajes como de programación c #), este problema "plug-ins" y demás programas que a veces nos quitan tiempo y espacio
potencial es evitado en gran medida por el or automático de en disco.
basura (o automatic garbage collector). El programador determina cuándo • Java es un lenguaje y por lo tanto puede hacer todas las cosas que
se crean los objetos y el entorno en tiempo de ejecución de Java (el Java puede hacer un lenguaje de programación: Cálculos matemáticos,
runtime) es el responsable de ges o de vida de los objetos (y procesadores de palabras, bases de datos, aplicaciones gráficas,
por supuesto, de cuando recupera a que ocupan los objetos). animaciones, sonido, hojas de cálculo, etc.
• Si lo que me interesa son las páginas de Web, ya no tienen que ser
El programa, u otros obje ocalizado un objeto mediante estáticas, se le pueden poner toda clase de elementos multimedia y
una referencia a és n punto de vista de bajo nivel, es una permiten un alto nivel de interactividad, sin tener que gastar en
dirección de memo quedan referencias a un objeto, el paquetes carísimos de multimedia.
Ver 200804 9
Extreme Guide: Usando Java Java

1.5. Limitantes 1.7. Versiones

• La velocidad. Los programas hechos en Java no tienden a ser muy El proyecto Java ha visto muchas ve adas. Desde 1.997, estas
rápidos, supuestamente se está trabajando para mejorar esto. Como son:
los programas de Java son interpretados nunca alcanzan la velocidad
de un verdadero ejecutable. • JDK 1.1.4 (Sparkler) 12 de se de 1.997
• Java es un lenguaje de programación. Esta es otra gran limitante, por o JDK 1.1.5 (Pu embre de 1.997
más que digan que es orientado a objetos y que es muy fácil de o JDK 1.1.6 (Ab e abril de 1.998
aprender sigue siendo un lenguaje y por lo tanto aprenderlo no es cosa o JDK 1.1.7 (Bru e septiembre de 1.998
fácil. Especialmente para los no programadores. o JDK 1. sea) 8 de abril de 1.999
• Java es nuevo. En pocas palabras todavía no se conocen bien todas sus • J2SE 1. de diciembre de 1.998
capacidades. Pero en general Java posee muchas ventajas y se pueden o guno) 30 de marzo de 1.999
hacer cosas muy interesantes con esto. Hay que prestar especial o 2 (Cricket) 8 de julio de 1.999
atención a lo que está sucediendo en el mundo de la computación, a • J2SE 1.3 (Kestrel) 8 de mayo de 2.000
pesar de que Java es relativamente nuevo, posee mucha fuerza y es J2SE 1.3.1 (Ladybird) 17 de mayo de 2.001
tema de moda en cualquier medio computacional. • 4.0 (Merlin) 13 de febrero de 2.002
J2SE 1.4.1 (Hopper) 16 de septiembre de 2.002
1.6. Filosofía o J2SE 1.4.2 (Mantis) 26 de junio de 2.003
SE 5.0 (1.5.0) (Tiger) 29 de septiembre de 2.004
El lenguaje Java se creó con cinco objetivos principales: • Java SE 6 (1.6.0) (Mustang) 11 de diciembre de 2.006
• Java SE 7 (1.7.0) (Dolphin) previsto para mediados del 2.008
1. Debería usar la metodología de la programación orientada a
sea, que cumpla con el paradigma de la programación o 1.8. Java y DB
objetos en un 100%).
2. Debería permitir la ejecución de un mis ltiples Muchos programadores quizás tengan mayor interés en realizar
sistemas operativos. programación en conjunto con Bases de Datos. Pues Java no se queda
3. Debería incluir por defecto soporte para tra ed. atrás. Java no implementa Bases de Datos, ya que solo es un lenguaje de
4. Debería diseñarse para ejecutar código en remotos de forma programación, pero implementa funciones que permiten al programador
segura. realizar conexiones entre la interfaz de usuario y el Gestor de Base de
5. Debería ser fácil de usar, y tomar lo mejor de otros lenguajes Datos. Java permite conectarse por medio de puentes JDBC o a través de
orientados a objetos, como C++ (aunque en estos momentos, Java se Driver's a programas gestores de bases de datos. Su independencia entre
parece más a C# que a C++). ambos permite al usuario mantener siempre un enfoque, separando el
diseño de la Base de Datos y el de la interfaz, en dos mundos de
Para conseguir la ejecució d oto y el soporte de red, los pensamientos diferentes: el mundo de los datos y el mundo de las
programadores de Java a extensiones como CORBA interfaces.
(Common Object R chitecture), Internet Communications
Engine o OSGi respe Java es orientado a objetos, por ende da solidez a la aplicación evitando
Ver 200804 10
Extreme Guide: Usando Java Java

cortes bruscos del programa y permitiendo continuar de esta manera con tecnológico. Dos semanas más tarde, la versión de Java fue
la aplicación. Java permite Applets, lo que permite montar cualquier publicada.
aplicación con Bases de Datos a través de la red de forma segura y sólida.
1.10. Java y otros lenguajes de pro
1.9. Java e Internet
Tip
Entre Junio y Julio de 1.994, tras una sesión maratónica de tres días entre Lenguaje Paradigma mplementaciones Influido por
John Gaga, James Gosling, Joy Naughton, Wayne Rosing y Eric Schmidt, el
Objetive C,
equipo reorientó la plataforma hacia la web. Sintieron que la llegada del
Orient e, C++,
navegador web Mosaic, propiciaría que internet se convirtiese en un medio Java Numerosas
objeto estático Smaltalk,
interactivo, como el que pensaban era la televisión por cable. Naughton Eiffel
creó entonces un prototipo de navegador, WebRunner, que más tarde sería Débil,
C al Múltiples B
conocido como HotJava14 . estático
Orientado a GNU Compiler,
Ese año renombraron el lenguaje como Java tras descubrir que "Oak" era objetos, Microsof t VC++,
Fuerte, C,
ya una marca comercial registrada para adaptadores de tar jetas gráficas. C++ imperativo, Borland C++Builder,
estático Simula
El término Java fue acuñado en una cafetería frecuentada por algunos de programación Dev-C++,
genérica C-Free
los miembros del equipo. Pero no está claro si es un acrónimo o no,
Java,
aunque algunas fuentes señalan que podría tratarse de las iniciales de
Orientado a Fuerte, Visual C#, C++,
creadores: James Gosling, Arthur Van Hoff, y Andy Bechtolsheim. Ot C#
objetos estático Mono Delphi,
abogan por el siguiente acrónimo, Just Another Vague Acronym Eiffel
acrónimo ambiguo más"). La hipótesis que más fuerza tiene es l Basado en
debe su nombre a un tipo de café disponible en la cafetería c prototipos,
Débil,
pequeño signo que da fuerza a esta teoría es que los 4 p tes (el JavaScript Programación Numerosas Java
dinámico
número mágico) de los archivos .class que ge son en orientada a
hexadecimal, 0xCAFEBABE. objetos
Simula,
Orientado a
Smalltalk Dinámico Multiples Sketchpad,
En Octubre de 1.994, se les hizo una dem de HotJava y la objetos
LISP
plataforma Java a los ejecutivos de Sun. Java o descargarse por
Orientado a
primera vez en 1.994, pero hubo que esperar al 23 de mayo de 1.995, objetos, Fuerte,
durante las conferencias de SunWorld a que vieran la luz pública Java y Lisp Múl tiples
Funcional, dinámico
HotJava, el navegador web. El o fue anunciado por John Declarativo
Gage, el director científico d rosystems. El acto estuvo ABC,
acompañado por una peq ñ onal: el anuncio por parte de CPython, TCL,
Fuerte,
Marc Andreessen, vicepr de Netscape, que Java sería Pitón Multiparadigma Jython, IronPython, Perl,
dinámico
soportado en sus na e Enero del año siguiente, 1.996, Sun PyPy Modula-3,
fundó el grupo emp para que se encargase del desarrollo Smalltalk

Ver 200804 11
Extreme Guide: Usando Java Java

Tipos de
Lenguaje Paradigma Implementaciones Influido por
Datos
AWK,
BASIC-Plus,
C, C++,
PHP Mul tiparadigma Dinámico Múltiples Lisp,
Pascal,
sed,
Unix shell
Imperativo
Pascal Múltiples Algol
(estructurado)
AWK,
BASIC-Plus,
Perl, C, C++,
Perl Mul tiparadigma Dinámico mod_perl, Lisp,
embperl Pascal,
sed,
Unix shell
Orientado a Fuerte, C,
ObjectiveC Numerosas
objetos dinámico Smalltalk

Ver 200804 12
E Extreme Guide: Usando Java Programación en Java

2.1.2. Tipos referencias


Programación en Java
Son aquellos tipos de datos compue s (o sea, aquellos que no
2. Programación en Java sean primitivos).

2.1. Tipos 2.2. Variables

Java es un lenguaje con control fuerte de tipos (Strongly Typed). Esto Una variable es un área moria que tiene un nombre y un tipo
significa que cada variable y cada expresión tienen un tipo que es conocido asociado. El tipo es o bien rimitivo o una referencia.
en el momento de la compilación. El tipo limita los valores que una
variable puede contener, limita las operaciones soportadas sobre esos Es obligato variables antes de usarlas. Para declararlas se
valores y determina el significado de las operaciones. El control fuerte de indica su no de la siguiente forma:
tipos ayuda a detectar errores en tiempo de compilación.
tipo_variable nombre;
En Java existen dos categorías de tipos:
Eje
2.1.1. Tipos primitivos
; // Declaración de un entero
Los tipos primitivos son los que permiten manipular valores numéricos (c letra; // Declaración de un carácter
distintos grados de precisión), caracteres y valores booleanos (verdader boolean flag; // Declaración de un booleano
falso). Los tipos primitivos son:
• El ";" es el separador de sentencias en Java.
boolean Puede contener los valores true o false.
• El símbolo " / / " indica comentarios de línea.
byte Enteros. Tamaño 8-bits. Valores entre -128 y
• En Java las mayúsculas y minúsculas son significativas. No es lo mismo
short Enteros. Tamaño 16-bits. Entre -32 el nombre let ra que Let ra.
int Enteros. Tamaño 32-bits. Entre -21 47. • Todas las palabras reservadas del lenguaje van en minúsculas.
long Enteros. Tamaño 64-bits. Entre -92 854775808 y
9223372036854775807. Se pueden asignar valores a las variables mediante la instrucción de
float Números en coma flotante. Tamaño asignación. Por ejemplo:
double Números en coma flotante. Tamaño 64-bits.
char Caracteres. Tamaño 16 bits Unicode. Desde '\u0000' a '\uffff' i = 5; // la variable i se le asigna el valor 5
inclusive. Esto es desd letra = 'c'; // la variable letra se le asigna el valor 'c'
flag = false; // la variable flag se le asigna el valor false
El tamaño de los tipos de e la implementación de Java.
Son siempre los mismos… variable de tipo entero, por
La declaración y la combinación se pueden combinar en una sola
ejemplo, siempre t independientemente bajo que o cual
expresión:
sistema operativo s el programa.
Ver 200804 13
E Extreme Guide: Usando Java Programación en Java

int i = 5; • \uxxxx: donde xxxx es el código Unico arácter. Por ejemplo


char letra = 'c'; \u0027 es el apostrofe (').
boolean flag = false;
2.4. Operaciones sobre tipos prim
2.3. Literales
La siguiente tabla muestra un re e los operadores existentes para
En los literales numéricos puede forzarse un tipo determinado con un las distintas clases de ti El grupo 'Enteros' incluye byte,
sufijo: short , int, long y char. El ma flotante' incluye float and double.

• Entero largo: l ó L. Tipos G operadores Operadores


• Float : f ó F. Enteros s de < (menor)
• Double: d ó D. ón que <= (menor o igual)
uelven un valor > (mayor)
Por ejemplo: boolean. >= (mayor o igual)
== (igual)
long l = 5L; != (distinto)
float numero = 5f; Operadores + (unario, positivo)
numéricos, que - (unario, negativo)
devuelven un valor int + (suma)
En los literales numéricos para float y double puede usarse el expone
o long. - (resta)
(10 elevado a...) de la forma: 1.5e3D (equivale a 1500).
* (multiplicación)
/ (división)
Literales hexadecimales: Al valor en hexadecimal se antepone
% (resto)
0x. Por ejemplo: 0xf (valor 15).
++ (incremento)
-- (decremento)
Literales booleanos: true (verdadero) y false (fa
<<, >>,
>>> (rotación)
Literales carácter: Un carácter entre apóstrofe n una secuencia de
~ (complemento a nivel de bits)
escape (también entre '). Las secuencias de es án formadas por el
& (AND a nivel de bits)
símbolo \ y una letra o un número.
| (OR a nivel de bits)
^(XOR a nivel de bits)
Algunas secuencias de escape útile
Coma flotante Operadores de < (menor)
• \n: Salto de línea. comparación <= (menor o igual)
• \ t : Tabulador. devuelven un valor > (mayor)
• \b: Backspace. boolean. >= (mayor o igual)
• \r: Retorno de c == (igual)

Ver 200804 14
E Extreme Guide: Usando Java Programación en Java

Tipos Grupo de operadores Operadores double float long int short byt
!= (distinto)
Operadores + (unario, positivo) Se deben tener en cuenta estas co la hora de mirar en qué
numéricos, que - (unario, negativo) tipo de variable guardamos el resul eración; ésta debe ser, al
devuelven un valor + (suma) menos, de una jerarquía mayo jerarquía de la máxima
float o doublé - (resta) variable involucrada en la opera ciertas excepciones a la norma
* (multiplicación) aquí descrita: Java solo de operadores enteros: uno que
/ (división) aplica para operar datos d g, y otro que emplea para operar datos
% (resto) de tipo int . De este modo operemos un byte con un byte, un short
++ (incremento) con un short o un un byte Java empleará para dicha operación el
-- (decremento) operador d int , por lo que el resultado de dicha operación
Booleanos Operadores boléanos == (igual) será un int
!= (distinto)
! (complemento) Para indicar que una constante es de tipo long se debe indicar con una L,
& (AND) po o: 23L. Para indicar que una constante es flotante: 2.3, se debe
| (OR) esc 3F, sino por defecto será double.
^ (XOR)
&& (AND condicional) sible convertir un dato de jerarquía "superior" a uno con jerarquía
| | (OR condicional) or", arriesgándonos a perder información en el cambio. Este tipo de
operación (almacenar el contenido de una variable de jerarquía superior
2.5. Conversión entre tipos numéricos en una de jerarquía inferior) se denomina cast . Ejemplo:

Las normas de conversión entre tipos numéricos son las habitu public class ejemplo1 {
lenguaje de programación: si en una operación se involu datos public static void main(String[] args) {
numéricos de distintos tipos, todos ellos se con to que int i = 9,k;
permite una mayor precisión y rango de represe í: float j = 47.9F;
System.out.println("i: " + i + " j: " + j);
• Si cualquier operando es double todos se co n en double. k = (int)j; // empleo de un cast
• Si cualquier operando es float y no hay gú double todos se System.out.println("j: " + j + " k: " + k);
convertirán a float . j = k; // no necesita cast
• Si cualquier operando es l hay datos reales todos se System.out.println("j: " + j + " k: " + k);
convertirán en long. float m = 2.3F;
// float m = 2.3; daría error al compilar.
Del mismo modo estas no para int , short y byte. System.out.println("m: " + m);
}
La "jerarquía" en la mayor a menor es: }

Ver 200804 15
E Extreme Guide: Usando Java Programación en Java

Métodos 2.6. El término void

En Java toda la lógica de programación (algoritmos) está agrupada en El hecho de que un método devuelv r es opcional. En caso de
funciones o métodos. que devuelva un valor, se declara e uelve. Pero si no necesita
ningún valor, se declara como tip el to, la palabra reservada
Un método es: void. Por ejemplo:

• Un bloque de código que tiene un nombre. void haceAlgo() {


• Recibe unos parámetros o argumentos (opcionalmente). . . .
• Contiene sentencias o instrucciones para realizar algo }
(opcionalmente).
• Devuelve un valor de algún tipo conocido (opcionalmente). Cuando no e gún valor, la cláusula return no es necesaria.
Obsérvese ejemplo el método haceAlgo tampoco recibe ningún
La sintaxis global es: parámetro. No obstante los paréntesis, son obligatorios.

tipo_valor_devuelto nombre_método(lista_argumentos) { 2.7 e métodos


bloque_de_codigo;
} étodos se invocan con su nombre, y pasando la lista de argumentos
paréntesis. El conjunto se usa como si fuera una variable del tipo
Y la lista de argumentos se expresa declarando el tipo y nombre de devuelto por el método. Por ejemplo:
mismos (como en las declaraciones de variables). Si hay más
separan por comas. int x;
x = sumaEnteros(2,3);
Por ejemplo:
Nota: Esta sintaxis no está completa, pero sirve para nuestros propósitos
int sumaEnteros(int a, int b) { en este momento. La sintaxis completa se verá cuando se hable de
int c = a + b; objetos.
return c;
} Aunque el método no reciba ningún argumento, los paréntesis en la
llamada son obligatorios. Por ejemplo, para llamar a la función haceAlgo,
• El método se llama sumaEnte simplemente se pondría:
• Recibe dos parámetros tambié Sus nombres son a y b.
• Devuelve un entero. haceAlgo();

En el ejemplo, la cláu se usa para finalizar el método Obsérvese que como la función tampoco devuelve ningún valor, no se
devolviendo el valo (en este caso, por supuesto). asigna a ninguna variable (no hay nada que asignar).
Ver 200804 16
E Extreme Guide: Usando Java Programación en Java

2.8. Clases Los objetos se manipulan con referencias. U encia es una variable
que apunta a un objeto. Las referencias se d gual que las variables
Las clases son el mecanismo por el que se pueden crear nuevos tipos en de tipos primitivos. Los objetos se c ncian) con el operador de
Java. Las clases son el punto central sobre el que giran la mayoría de los instanciación new.
conceptos de la Orientación a Objetos.
Ejemplo:
Una clase es una agrupación de datos y de código que actúa sobre esos
datos, a la que se le da un nombre. Una clase contiene: Punto p;
p = new Punto();
• Datos (se denominan Datos Miembro). Estos pueden ser de tipos
primitivos o referencias. La primera plo declara una referencia (p) que es de tipo
• Métodos (se denominan Métodos Miembro). Punto. La r o apunta a ningún sitio. En la segunda línea se crea
un objeto unto y se hace que la referencia p apunte a él. Se
La sintaxis general para la declaración de una clase es: puede hacer ambas operaciones en la misma expresión:

modificadores class nombre_clase Pu new Punto();


{
declaraciones_de_miembros;
miembros de un objeto se accede a través de su referencia. La
}
sintaxis es:

Por ejemplo: nombre_referencia.miembro

class Punto {
En el ejemplo, se puede poner:
int x;
int y;
p.x = 1;
}
p.y = 3;

Los modificadores son palabras clave que afect mportamiento de la


Se puede visualizar gráficamente los datos primitivos, referencias y
clase. Los iremos viendo progresivamente en los sucesivos capítulos.
objetos de la siguiente forma:

2.9. Objetos, miembros y refer


• Datos primitivos: int i = 5;
• Referencias y objetos:
Un objeto es una instancia (ej una clase. La clase es la
definición general y el erialización concreta (en la
Punto p = new Punto();
memoria del ordenador) se enómeno de crear objetos de p.x = 1;
una clase se llama i p.y = 3;

Ver 200804 17
E Extreme Guide: Usando Java Programación en Java

Es importante señalar que en el ejemplo, p no es el objeto, sino que es • Existe un Objeto Punto para cada instan clase Circulo (que se
una referencia que apunta al objeto. crea cuando se crea el objeto Ci l )

Los métodos miembro se declaran dentro de la declaración de la clase, tal 2.10. Conceptos básicos
como se ha visto en el capítulo anterior. Por ejemplo:
• Una Clase es una definición d vo tipo, al que se da un nombre.
class Circulo • Una Clase contiene Da Métodos Miembro que configuran
{ el estado y las operac puede realizar.
Punto centro; // dato miembro. Referencia a un objeto punto • Un Objeto es la mat ón (instanciación) de una clase. Puede
int radio; // dato miembro. Valor primitivo haber tantos O e una Clase como resulte necesario.
• Los Obj e les asigna memoria) con el Operador new.
float superficie() // método miembro • Los Obj anipulan con Referencias.
{ • Una Re es una Variable que apunta a un Objeto.
return 3.14 * radio * radio;
• El acceso a los elementos de un Objeto (Datos o Métodos) se hace con
} // fin del método superficie ador "." (punto): nombre_referencia.miembro
} // fin de la clase Circulo
tructores
El acceso a métodos miembros es igual que el que ya se ha visto para datos
miembro. En el ejemplo: Cuando se crea un objeto (se instancia una clase), es posible definir un
proceso de inicialización que prepare el objeto para ser usado. Esta
Circulo c = new Circulo(); inicialización se lleva a cabo invocando un método especial denominado
c.centro.x = 2; constructor. Esta invocación es implícita y se realiza automáticamente
c.centro.y = 3; cuando se utiliza el operador new. Los constructores tienen algunas
c.radio = 5; características especiales:
float s = c.superficie();
• El nombre del constructor tiene que ser igual al de la clase.
Es importante observar en el ejemplo: • Puede recibir cualquier número de argumentos de cualquier tipo,
como cualquier otro método.
• Los datos miembro pueden ser tanto primitivos como referencias. La • No devuelve ningún valor (en su declaración no se declara ni siquiera
clase Circulo contiene un dato miembro de tipo Punto (que es el de tipo void).
centro del círculo).
• El acceso a los datos miembro centro se hace encadenando El constructor no es un miembro más de una clase. Sólo es invocado
el operador "." en la expresió x que se podría leer como 'el cuando se crea el objeto (con el operador new). No puede invocarse
miembro x del objeto objeto (Circulo) c'. explícitamente en ningún otro momento.
• Aunque el mét d no recibe ningún argumento los
paréntesis son o nguen los datos de los métodos). Continuando con los ejemplos del capítulo anterior, se podría escribir un

Ver 200804 18
E Extreme Guide: Usando Java Programación en Java

constructor para la clase Punto, de la siguiente forma: 2.11.2. Sobrecarga de constructores

class Punto Una clase puede definir varios cons objeto puede inicializarse
{ de varias formas). Para cada inst usa el que coincide en
int x, y; número y tipo de argumentos. Si oincidente se produce un
error en tiempo de compilación.
Punto(int a, int b)
{ Por ejemplo:
x = a;
y = b; class Punto
} {
} int x,

Con este constructor se crearía un objeto de la clase Punto de la siguiente Punto(int a, int b)
forma:

Punto p = new Punto(1, 2);

2.11.1. Constructor no-args


Punto() {
x = 0;
Si una clase no declara ningún constructor, Java incorpora un c
y = 0;
por defecto (denominado constructor no-args) que no rec
}
argumento y no hace nada.
}

Si se declara algún constructor, entonces sar el


constructor no-args. Es necesario usar el constr a ado e a clase. En el ejemplo se definen dos constructores. El citado en el ejemplo
anterior y un segundo que no recibe argumentos e inicializa las variables
En el ejemplo el constructor no-args sería: miembro a 0 (veremos más adelante que este tipo de inicialización es
innecesario, pero para nuestro ejemplo sirve).
class Punto
{ Desde un constructor puede invocarse explícitamente a otro constructor
int x , y; utilizando la palabra reservada this. this es una referencia al propio
Punto( ) { objeto. Cuando this es seguido por paréntesis se entiende que se está
} invocando al constructor del objeto en cuestión.
}
El ejemplo anterior puede reescribirse de la siguiente forma:

Ver 200804 19
E Extreme Guide: Usando Java Programación en Java

class Punto { En el ejemplo numPuntos es un contador qu ementa cada vez que


int x, y; se crea una instancia de la clase Punto

Punto(int a, int b) { Obsérvese la forma en que se mPuntos, colocando el


x = a; modificador static delante del t eneral para declarar una
y = b; variable es:
}
[modificadores] tipo_v nombre;
Punto() {
this(0,0); static es un modi En los siguientes capítulos se irán viendo otros
} modificado es "[ ]" en la expresión anterior quieren decir
} que los mod s so opcionales.

Cuando se declaran varios constructores para una misma clase, estos El acceso a las variables estáticas desde fuera de la clase donde se definen
deben distinguirse en la lista de argumentos, bien en el número, bien en el se a través del nombre de la clase y no del nombre del objeto,
tipo. co e con las variables miembros normales (no estáticas). En el
terior puede escribirse:
Esta característica de definir métodos con el mismo nombre se denomina
sobrecarga y es aplicable a cualquier método miembro de una clase. = Punto.numPuntos;

2.12. Datos estáticos No obstante también es posible acceder a las variables estáticas a través
de una referencia a un objeto de la clase. Un ejemplo de esto lo podremos
Un dato estático es una variable miembro que no se asocia a ver a continuación:
(instancia) de una clase, sino que se asocia a la clase m ay una
copia del dato para cada objeto sino una sola c da por Punto p = new Punto();
todos los objetos de la clase. Por ejemplo: ó
int x = p.numPuntos;
class Punto {
int x, y;
Las variables estáticas de una clase existen, se inicializan y pueden usarse
static int numPuntos = 0;
antes de que se cree ningún objeto de la clase… mantenga esto siempre en
Punto(int a, int b) {
mente.
x = a;
y = b; 2.13. Métodos estáticos
numPuntos++;
} Para los métodos, la idea es la misma que para los datos: los métodos
} estáticos se asocian a una clase, no a una instancia. Veamos esto mediante
Ver 200804 20
E Extreme Guide: Usando Java Programación en Java

un ejemplo: 2.13.1. El método main

class Punto Un programa Java se inicia proporc térprete Java un nombre


{ de clase. La JVM carga en memoria ada e inicia su ejecución
int x, y; por un método estático que debe o en esa clase. El nombre
static int numPuntos = 0; de este método es main y debe d de la siguiente forma:

Punto(int a, int b) static void main (Stri gs)


{
x = a; • Es un método o. Se aplica por tanto a la clase y no a una
y = b; instanc r, lo que es conveniente puesto que en el
numPuntos++ ; momen ciar la ejecución todavía no se ha creado ninguna
} instanc una clase.
• Recibe un argumento de tipo String[]. String es una clase que
static int cuantosPuntos() nta una cadena de caracteres (se verá más adelante).
{ • chetes [] indican que se trata de un array que se verán en un
return numPuntos; o posterior.
}
} No es obligatorio que todas las clases declaren un método main. Sólo
aquellos métodos que vayan a ser invocados directamente desde la línea
La sintaxis general para la definición de los métodos es, po de comandos de la JVM necesitan tenerlo.
siguiente:
2.13.2. Inicializadores estáticos
[modif] tipo_valor_devuelto nombre_método(lista os)
{ En ocasiones es necesario escribir código para inicializar los datos
bloque_de_codigo; estáticos, quizá creando algún otro objeto de alguna clase o realizando
} algún tipo de control. El fragmento de código que realiza esta tarea se
llama inicializador estático. Es un bloque de sentencias que no tiene
El aceso a los métodos estáticos se hace igual que a los datos estáticos, es nombre, ni recibe argumentos, ni devuelve valor. Simplemente se declara
decir, usando el nombre de la clase, en lugar de usar una referencia: con el modificador stat ic.

int totalPuntos = Punto.cuan ); La forma de declarar el inicializador estático es:

static { bloque_codigo }
Dado que los métodos est o a nivel de clase y no a nivel
de objeto (instanc estáticos no pueden acceder a datos
miembros que no se Por ejemplo:
Ver 200804 21
E Extreme Guide: Usando Java Programación en Java

class Punto Las variables miembro son inicializadas auto ente, de la siguiente
{ forma:
int x, y;
static int numPuntos; • Las numéricas a 0.
• Las booleanas a false.
static • Las char al carácter nulo (he l 0).
{ • Las referencias a null
numPuntos = 0;
} Nota: null es un literal qu eferencia nula.

Punto(int a, int b) Las variabl eden inicializarse con valores distintos de los
{ anteriores e n.
x = a;
y = b; Las variables locales no se inicializan automáticamente. Se debe asignarles
numPuntos++; un tes de ser usadas. Si el compilador detecta una variable local
} qu antes de que se le asigne un valor produce un error. Por

static int cuantosPuntos()


{ ;
return numPuntos; int q = p; // error
}
} El compilador también produce un error si se intenta usar una variable
local que podría no haberse inicializado, dependiendo del flujo de
Nota: El ejemplo, una vez más, muestra sólo la sin ma de ejecución del programa. Por ejemplo:
codificación. Es innecesario inicializar podría
inicializarse directamente con: static ; int p;

2.14. Inicialización de variables if (...)


{
Desde el punto de vista del lugar donde se declaran existen dos tipos de p = 5;
variables: }

• Variables miembro: Se decla a clase, fuera de cualquier int q = p; // error


método.
• Variables locales: Se un bloque de código dentro El compilador produce un error del tipo 'La variable podría no haber sido
de un método. inicializada', independientemente de la condición del if.

Ver 200804 22
E Extreme Guide: Usando Java Programación en Java

2.14.1. Ámbito de las variables porque ya no tienen referencias activas que ten. El recolector de
basura actúa cuando la JVM lo determi e un mecanismo de
El ámbito de una variable es el área del programa donde la variable existe actuación no trivial).
y puede ser utilizada. Fuera de ese ámbito, la variable o bien no existe o
no puede ser usada (que viene a ser lo mismo). En ocasiones es necesario realiz asociada a la acción de
liberar la memoria asignada al como por ejemplo liberar otros
El ámbito de una variable miembro (que pertenece a un objeto) es el de la recursos del sistema, com de ficheros). Esto puede hacerse
usabilidad de un objeto. Un objeto es utilizable desde el momento en que codificando un método fin debe declararse como:
se crea y mientras existe una referencia que apunte a él.
protected void () throws Throwable
Cuando la última referencia que lo apunta sale de su ámbito el objeto {
queda 'perdido' y el espacio de memoria ocupado por el objeto puede ser }
recuperado por la JVM cuando lo considere oportuno. Esta recuperación de
espacio en memoria se denomina 'recogida de basura'. El método f inalize es invocando por la JVM antes de liberar la memoria por
el r de basura, o antes de terminar la JVM. No existe un momento
El ámbito de las variables locales es el bloque de código donde se co que las áreas de memoria son liberadas, sino que lo determina
declaran. Fuera de ese bloque la variable es desconocida. Ejemplo: mento la JVM en función de sus necesidades de espacio.

{ Sobrecarga de métodos
int x; // empieza el ámbito de x (x es conocida y utilizab
{ Una misma clase puede tener varios métodos con el mismo nombre
int q; // empieza el ámbito de q. x sigue siendo c siempre que se diferencien en el tipo o número de los argumentos. Cuando
... esto sucede se dice que el método está sobrecargado. Por ejemplo, una
} // finaliza el ámbito de q (termina el bloqu go) misma clase podría tener los métodos:
... // q ya no es utilizable
} // finaliza el ámbito de x int metodoSobrecargado()
{
2.15. Recogida de basura ...
}
Cuando ya no se necesita un objeto simplemente puede dejar de int metodoSobrecargado(int x)
referenciarse. No existe una oper ió lí ita para 'destruir' un objeto o {
liberar el área de memoria usada ...
}
La liberación de memor colector de basura (garbage
collector), que es una fu ecolector revisa toda el área Sin embargo no se puede sobrecargar cambiando sólo el tipo del valor
de memoria del pr ina que objetos pueden ser borrados devuelto. Por ejemplo:

Ver 200804 23
E Extreme Guide: Usando Java Programación en Java

int metodoSobrecargado() {...} class Circulo


void metodoSobrecargado() {...} // error en compilación {
Punto centro;
Con esta definición, en la expresión y.metodoSobrecargado() la JVM no int radio;
sabría que método invocar. ...
Circulo elMayor(Circulo c
Se puede sobrecargar cualquier método miembro de una clase, así como el {
constructor. if (radio > c.radi rn this;
if (c.radio > radi rn c;
2.17. La referencia this return null
}
En ocasiones es conveniente disponer de una referencia que apunte al }
propio objeto que se está manipulando. Esto se consigue con la palabra
reservada this. this es una referencia implícita que tienen todos los 2.19 Ocultamiento de variables
objetos y que apunta a si mismo. Por ejemplo:
Pu rir que una variable local y una variable miembro reciban el
class Circulo { bre (en muchos casos por error). Cuando se produce esto, la
Punto centro; le miembro queda oculta por la variable local durante el bloque de
int radio; código en que la variable local existe y es accesible. Cuando se sale fuera
... del ámbito de la variable local, entonces la variable miembro queda
Circulo elMayor(Circulo c) { accesible. Obsérvese esto en el ejemplo siguiente:
if (radio > c.radio) return this;
return c; ...
} String x = "Variable miembro";
} ...
void variableOculta()
El método elMayor devuelve una referencia que tiene mayor {
radio, comparando los radios del Circulo c que como argumento y System.out.println(x);
el propio. En caso de que el propio resulte mayor, el método debe {
devolver una referencia a sí mismo. Esto se consigue con la expresión String x = "Variable local";
return this. System.out.println(x);
}
2.18. La referencia null System.out.println(x);
}
Para asignar a una f or nulo se utiliza la constante null. El
ejemplo del caso an ompletar con: La llamada al método variableOcul ta() producirá la siguiente salida:
Ver 200804 24
E Extreme Guide: Usando Java Programación en Java

Variable miembro Grupo de operador Operador nificado


Variable local >> splazamiento a la
Variable miembro derecha rellenando
con 1
Se puede acceder a la variable miembro oculta usando la referencia this. >>> Desplazamiento a la
En el ejemplo anterior la expresión System.out .print ln(this.x); siempre derecha rellenando
producirá la salida 'Variable miembro', puesto que this.x se refiere siempre con 0
a la variable miembro. Otros Concatenación de
cadenas
2.20. Operadores + Autoincremento (actúa
como prefi jo o sufi jo)
La siguiente tabla muestra un resumen de operadores clasificados por Autodecremento
grupos, algunos de los cuales (la mayoría), son los mismos que para otros (actúa como prefi jo o
lenguajes (como el C++), sin embargo Java posee otros muy propios de sufi jo)
dicho lenguaje: = Asignación
+= Suma y asignación
Grupo de operador Operador Significado -= Resta y asignación
Aritméticos + Suma *= Multiplicación y
- Resta asignación
* Multiplicación /= División y asignación
/ División ?: Condicional ternario
% Resta
Relacionales > Mayor 2.21. Funciones de Entrada y Salida
>= Mayor
< 2.21.1. Entrada por teclado en Java
<=
== Se utiliza System.in. Es habitual introducido en un InputStreamReader
!= to seguido de un BufferedReader por razones de eficiencia. Las cadenas de
Lógicos && AND caracteres se pueden leer con el método readLine(). Para leer números se
|| OR debe analizar sintácticamente la cadena leída, por ejemplo con parseInt()
! NOT o parseDouble().
A nivel de bits & AND
| OR BufferedReader ent = new BufferedReader(new InputStreamReader(System.in));
NOT String cadReal = ent .readLine();
Desplazamiento a la double real = Double.parseDouble(cadReal);
izquierda

Ver 200804 25
E Extreme Guide: Usando Java Programación en Java

2.21.2. Salida por pantalla en Java 2.21.4. Salida por archivo en Java

Se usan los métodos print() y println() de System.out para imprimir Es habitual introducir un objeto File BufferedWriter que a su
cadenas de caracteres; suponen la existencia de un método toString() para vez se introduce en un PrintWriter étodos print() y println()
convertir objetos en cadenas de caracteres. para escribir en la salida:

"\n" avanza a una nueva línea; print ln() también produce un salto de línea PrintWriter fsal = new Prin feredWriter(
después de producir la salida.
ew FileWriter(nombreFich)));

System.out.print("Hola"); fsal.println("Sueldo o);


System.out.println(" amigo");
2.21.5. La
Dar formato a la salida requiere clases especiales como DecimalFormat.
Java tiene acceso a la entrada / salida estándar a través de la clase System.
2.21.3. Entrada por archivo En o, los tres ficheros que se implementan en dicha clase los
po sumir en los siguientes apartados.
Es habitual introducir un FileReader en un BufferedReader para crear
objetos de lectura a través de un archivo. Entonces se pueden leer 6. stdin y stdout
cadenas de caracteres con readLine() y analizarlas sintácticamente pa
obtener valores numéricos de forma análoga a la descrita en la entrada System.in implementa stdin como una instancia de la clase InputStream.
teclado. Esto debe hacerse en un bloque try, ya que se pue Con System.in, se accede a los métodos read() y skip(). El método read()
excepciones. permite leer un byte de la entrada. skip(long n), salta n bytes de la
entrada.
try
System.out implementa stdout como una instancia de la clase
{
PrintStream. Se pueden utilizar los métodos print() y println() con
BufferedReader fent = new BufferedReader(ne cualquier tipo básico Java como argumento.
FileReader(nombreFich));
String cadReal = fent.readLine(); 2.21.7. stderr
double real = Double.parseDouble(cadReal);
System.err implementa stderr de la misma forma que stdout. Como con
}
System.out, se tiene acceso a los métodos de PrintStream.
catch
{ El siguiente código reproduce (o funciona) como la utilidad cat de Unix o
/ / ... type de DOS (ambos, por si no lo saben, son sistemas operativos… ¿se
acuerdan de lo que es eso?):
}

Ver 200804 26
E Extreme Guide: Usando Java Programación en Java

import java.io.*; 2.21.9. Streams de Entrada

Hay muchas clases dedicadas a la o ntrada desde un fichero.


class miType
Este es el esquema de la jerarquía d trada por fichero:
{
public static void main( String args[] ) throws IOException
{
int c;
int contador = 0;

while ((c = System.in.read() ) != '\n' )


{
contador++;
System.out .print((char)c);
• FileInputStream
}
System.out .println(); / / Línea en blanco bjetos FileInputSt ream típicamente representan ficheros de texto
System.err.println("Contados " + contador + " bytes en total"); idos en orden secuencial, byte a byte. Con FileInputSt ream se puede
elegir acceder a un byte, varios bytes o al fichero completo.
}
}
• Apertura de un FileInputStream

2.21.8. Clases comunes de Entrada/Salida Para abrir un FileInputSt ream sobre un fichero, se le da al constructor un
St ring o un objeto File:
Además de la entrada por teclado y salida ecesita
entrada / salida por fichero, como son: FileInpu DataInputSt ream, FileInputStream miFicheroSt;
FileOutputSt ream, DataOutputSt ream. miFicheroSt = new FileInputStream("/etc/kk");

También existen otras clases, para aplicaciones más específicas, que no También se puede utilizar:
vamos a tratar en la presente guía por ser de un uso muy concreto y
particular, como lo son las clases , si usted lo desea, siéntase File miFichero;
libre para investigar sus usos… no malo saber al menos lo básico FileInputStream miFicheroSt;
de estas clases ream, St reamTokenizer,
Buf feredInputSt ream, m, PushBackInputSt ream, miFichero = new File("/etc/kk");
Buf feredOutputSt re miFicheroSt = new FileInputStream(miFichero);

Ver 200804 27
E Extreme Guide: Usando Java Programación en Java

• Lectura de un FileInputStream DataInputStream miDStream;


FileInputStream miFStream;
Una vez abierto el FileInputSt ream, se puede leer de él. El método read()
tiene muchas opciones: // Obtiene un controlador de f
miFStream = new FileInputStr mplo.dbf");
Lee un byte y devuelve -1 al final // Encadena un fichero de en e datos
int read()
del stream. miDStream = new DataIn Stream);
Llena todo el array, si es posible.
Devuelve el número de bytes leídos // Ahora se pueden uti os dos streams de entrada para
int read(byte b[])
o -1 si se alcanzó el final del // acceder al f si se quiere...)
stream. miFStream
Lee longitud bytes en b i = miDSt ;
comenzando por b[offset ].
int read(byte b[], int offset , int longitud) Devuelve el número de bytes leídos // Cierra el fichero de datos explícitamente
o -1 si se alcanzó el final del // se cierra primero el fichero stream de mayor nivel
stream. mi close();
close();
• Cierre de FileInputStream
• Lectura de un DataInputStream
Cuando se termina con un fichero, existen dos opciones para cerrar
explícitamente o implícitamente cuando se recicla el objeto ( Al acceder a un fichero como DataInputSt ream, se pueden utilizar los
collector se encarga de ello). Para cerrarlo explícitamente, se mismos métodos read() de los objetos FileInputSt ream. No obstante,
método close(). también se tiene acceso a otros métodos diseñados para leer cada uno de
los tipos de datos:
• Objetos DataInputStream
byte readByte() - int readInt() - int readUnsignedByte() - long readLong() -
Los objetos DataInputSt ream se comportan com eInputSt ream. Los short readShort() - float readFloat() - int readUnsignedShort() - double
streams de datos pueden leer cualquiera de l es de tipo nativo, readDouble() - char readChar() - String readLine()
como floats, ints o chars. Generalmente se ut a ataInputSt ream con
ficheros binarios. Para el método St ring readLine() se marca el final de la cadena con \n, \r,
\r\n o con EOF. Para leer un long, por ejemplo:
• Apertura y cierre de DataInp
long numeroSerie;
Para abrir y cerrar un o eam, se utilizan los mismos ...
métodos que para FileIn recuadro anterior, en esta numeroSerie = miDStream.readLong();
misma página por fa

Ver 200804 28
E Extreme Guide: Usando Java Programación en Java

2.21.10. Streams de Salida • Escritura en un FileOutputStream

La contrapartida necesaria de la lectura de datos es la escritura de datos. Una vez abierto el fichero, se pued es de datos utilizando el
Como con los Streams de entrada, las clases de salida están ordenadas método wri te(). Como con el méto los streams de entrada,
jerárquicamente: tenemos tres posibilidades:

void write(int b) cribe un byte.


Escribe todo el array, si es
void write(byte b[])
posible.
Escribe longitud bytes en b
void write(byte b[] int longitud)
comenzando por b[offset ].

• Cierre utputStream
Examinaremos las clases FileOutputSt ream y DataOutputSt ream para
complementar los streams de entrada que se han visto.
Ce stream de salida es similar a cerrar streams de entrada. Se
pu ar el método explícito:
• Objetos FileOutputStream
heroSt.close();
Los objetos FileOutputSt ream son útiles para la escritura de ficheros d
texto. Como con los ficheros de entrada, primero se necesita abrir
O, se puede dejar que el sistema cierre el fichero cuando se recicle el
fichero para luego escribir en él.
objeto (en este caso), miFicheroSt .

• Apertura de un FileOutputStream
Ejemplo: Almacenamiento de Información. Este programa (que podremos
llamar Telefonos. java), pregunta al usuario una lista de nombres y
Para abrir un objeto FileOutputSt ream, se tien idades
números de teléfono. Cada nombre y número se añade a un fichero situado
que para abrir un fichero stream de entrada. tor un
en una localización fi ja. Para indicar que se ha introducido toda la lista, el
St ring o un objeto File.
usuario especifica "Fin" ante la solicitud de entrada del nombre. Una vez
que el usuario ha terminado de teclear la lista, el programa creará un
FileOutputStream miFicheroSt;
miFicheroSt = new FileOutputStream("/etc/kk"); fichero de salida que se mostrará en pantalla o se imprimirá. El código
fuente del programa es el siguiente:
Como con los streams de entrada, puede utilizar:
import java.io.*;
File miFichero;
FileOutputStream miFi class Telefonos {
static FileOutputStream fos;
miFichero = new ;
miFicheroSt = ne eam(miFichero);
Ver 200804 29
E Extreme Guide: Usando Java Programación en Java

public static final int longLinea = 81; while ((i < (longLinea - 1)) &&
((b = System.in.read()) != '\n')) e)b;
public static void main(String args[]) throws IOException { linea[i] = (byte)0;
byte t fno[] = new byte[longLinea]; }
byte nombre[] = new byte[longLinea]; }

fos = new FileOutputStream("telefono.dat"); • Streams de salida con

while(true) { Si se trabaj idad de datos, o se escriben muchos elementos


pequeños, bue a dea utilizar un stream de salida con buffer. Los
System.err.println("Teclee un nombre ('Fin' termina)");
streams c er ofrecen los mismos métodos de la clase
leeLinea(nombre);
FileOutputSt ream, pero toda salida se almacena en un buffer. Cuando se
lle fer, se envía a disco con una única operación de escritura; o,
if ("fin".equalsIgnoreCase(new String(nombre, 0, 0, 3))) break; en ecesario, se puede enviar el buffer a disco en cualquier

System.err.println("Teclee el numero de telefono");


Creación de Streams de salida con buffer
leeLinea(t fno);

Para crear un stream Buf feredOutput , primero se necesita un stream


for (int i=0; t fno[i] != 0; i++) fos.write(t fno[i]); FileOutput normal; entonces se le añade un buffer al stream:
fos.write(',');
FileOutputStream miFileStream;
BufferdOutpurStream miBufferStream;
for (int i=0; nombre[i] != 0; i++) fos.write(nombr
fos.write('\n');
// Obtiene un controlador de fichero
}
miFileStream = new FileOutputStream("/tmp/kk");
fos.close();
} // Encadena un stream de salida con buffer
miBufferStream = new BufferedOutputStream(miFileStream);
private static void leeLinea(byte line OException {
int b = 0; • Volcado y Cierre de Streams de salida con buffer
int i = 0;
Al contrario que los streams FileOutput , cada escritura al buffer no se
corresponde con una escritura en disco. A menos que se llene el buffer
Ver 200804 30
E Extreme Guide: Usando Java Programación en Java

antes de que termine el programa, cuando se quiera volcar el buffer


explícitamente se debe hacer mediante una llamada a f lush(): // Ahora se pueden utilizar lo e entrada para
// acceder al fichero (si se q
// Se fuerza el volcado del buffer a disco miBufferStream.write(b);
miBufferStream.flush(); miDataStream.writeInt(i);

// Cerramos el fichero de datos. Siempre se ha de cerrar // Cierra el fichero d citamente. Siempre se


// primero el fichero stream de mayor nivel // cierra primero el f stream de mayor nivel
miBufferStream.close(); miDataStream.close();
miFileStream.close(); miBufferStream.
miFileStr
• Streams DataOutput
• Escritu objeto DataOutputStream
Java también implementa una clase de salida complementaria a la clase
DataInputSt ream. Con la clase DataOutputSt ream, se pueden escribir Ca de los métodos wri te() accesibles por los FileOutputSt ream
datos binarios en un fichero. tam son a través de los DataOutputSt ream. También encontrará
dos complementarios a los de DataInputSt ream:
• Apertura y cierre de objetos DataOutputStream
void writeBoolean(boolean b) - void writeFloat(float f) –
Para abrir y cerrar objetos DataOutputSt ream, se utilizan los mism void writeByte(int i) - void writeDouble(double d) - void writeShort(int i) -
métodos que para los objetos FileOutputSt ream: void writeBytes(String s) - void writeChar(int i) - void writeChars(string s) -
void writeInt(int i)
DataOutputStream miDataStream;
FileOutputStream miFileStream; Para las cadenas, se tienen dos posibilidades: bytes y caracteres. Hay que
BufferedOutputStream miBufferStream; recordar que los bytes son objetos de 8 bits y los caracteres lo son de 16
bits. Si nuestras cadenas utilizan caracteres Unicode, debemos escribirlas
// Obtiene un controlador de fichero con wri teChars().
miFileStream = new FileOutputStream("/tm
• Contabilidad de la salida
// Encadena un stream de salida con buffer (por eficiencia)
miBufferStream = new Buffere eam(miFileStream); Otra función necesaria durante la salida es el método size(). Este método
simplemente devuelve el número total de bytes escritos en el fichero
// Encadena un fichero de sa tos (archivo).
miDataStream = new Da BufferStream);
Se puede utilizar size() para ajustar el tamaño de un fichero a múltiplo de
cuatro. Por ejemplo, de la forma siguiente:

Ver 200804 31
E Extreme Guide: Usando Java Programación en Java

... 2.23. Iteraciones con while


int numBytes = miDataStream.size() % 4;
Sintaxis formato 1:
for (int i=0; i < numBytes; i++) miDataS tream.write(0);
... while (expresion_booleana) s

2.22. Ejecución condicional Sintaxis formato 2:

El formato general es: do


sentencia;
if (expresion_booleana) while (exp na);
sentencia
[else La sentenc ue se sentencias (se aplica la misma idea que para el
sentencia] i f-else) se ejecuta mientras que la expresion_booleana se evalúe como
t ru
sentencia (a todo lo largo de este capítulo) puede ser una sola sentencia o
un bloque de sentencias separadas por ";" y enmarcadas por llaves "{" y "}". ia entre ambos formatos es que en el primero la expresión se
Es decir: a al principio del bloque de sentencias y en el segundo se evalúa al
final.
if (expresion_booleana) {
sentencia; 2.24. Iteraciones con for
sentencia;
... El formato es:
} else {
sentencia; for (inicializacion; expresion_booleana; step) sentencia;
sentencia;
... inicializacion es una sentencia que se ejecuta la primera vez que se entra
} en el bucle for. Normalmente es una asignación. Es opcional.

expresion_booleana es una expresión que se evalua como true o false (es expresion_booleana es una expresión que se evalúa antes de la ejecución
decir, de tipo booleano). Si el re e la ejecución bifurca a la de la sentencia, o bloque de sentencias, para cada iteración. La sentencia
sentencia que sigue al i f . En caso se bifurca a la sentencia que o bloque de sentencias se ejecutan mientras que la expresion_booleana se
sigue al else. evalúe como cierta. Es opcional.

Los corchetes en rior indican que la clausula else es step es una sentencia que se ejecuta cada vez que se llega al final de la
opcional. sentencia o bloque de sentencias. Es opcional.
Ver 200804 32
E Extreme Guide: Usando Java Programación en Java

Una utilización clásica de un bucle de tipo for se muestra a continuación expresión entera de la clausula swi tch. Se e sta que se encuentra
para evaluar un contador un número fi jo de veces: una sentencia break o se llega al final del s ningún valor de case
coincide con el resultado de la ex a, se ejecuta el bloque
for (int i = 1; i <= 10; i++) sentencia; defaul t (si está presente). defaul t y cionales.

La sentencia (o bloque de sentencias) se evaluará 10 veces. En cada 2.26. Devolución de control


ejecución (pasada) el valor de la variable i irá variando desde 1 hasta 10
(inclusive). Cuando salga del bloque de sentencias, i estará fuera de su El formato es:
ámbito (porque se define en el bloque for).
return valor;
Si se omiten las tres clausulas del bucle se obtiene un bucle infinito:
Se utiliza e odos para terminar la ejecución y devolver un valor a
for ( ; ; ) sentencia; quien lo lla

Obsérvese que se pueden omitir las clausulas pero no los separadores (;). va ser del tipo declarado en el método. valor es opcional. No debe
ex do el método se declara de tipo void. En este caso, la cláusula
2.25. Evaluación múltiple nal del método es opcional, pero puede usarse para devolver el
ol al llamador en cualquier momento.
El formato es:
2.27. Expresiones
switch (expresion_entera) {
case valor_entero: La mayor parte del trabajo en un programa se hace mediante la evaluación
sentencia; de expresiones, bien por sus efectos tales como asignaciones a variables,
break; bien por sus valores, que pueden ser usados como argumentos u operandos
case valor_entero: en expresiones mayores, o afectar a la secuencia de ejecución de
sentencia; instrucciones.
break;
... Cuando se evalúa una expresión en un programa, el resultado puede
default: denotar una de tres cosas:
sentencia;
} • Una variable (si por ejemplo es una asignación).
• Un valor (por ejemplo una expresión aritmética, booleana, una
llamada a un método, etc.)
En el swi tch la expresión que se e una expresión booleana como
• Nada (por ejemplo una llamada a un método declarado void).
en el i f-else, sino una exp
Si la expresión denota una variable o un valor, entonces la expresión tiene
Se ejecuta el bloq alor coincida con el resultado de la
siempre un tipo conocido en el momento de la compilación. Las reglas
Ver 200804 33
E Extreme Guide: Usando Java Programación en Java

para determinar el tipo de la expresión varían dependiendo de la forma de En el momento de la creación del array s siona el mismo y se
las expresiones pero resultan bastante naturales. Por ejemplo, en una reserva la memoria necesaria.
expresión aritmética con operandos de diversas precisiones el resultado es
de un tipo tal que no se produzca pérdida de información, realizándose También puede crearse de forma e ando valores a todos los
internamente las conversiones necesarias. El análisis pormenorizado de las elementos del array en el mom aración, de la siguiente
conversiones de tipos, evaluaciones de expresiones, etc., queda fuera del forma:
ámbito de estos apuntes. En general puede decirse que es bastante similar
a otros lenguajes, en particular C, teniendo en cuenta la característica int[ ] a = {5, 3, 2};
primordial de Java de tratarse de un lenguaje con control fuerte de tipos.
El acceso a los ele el array se realiza indicando entre corchetes el
2.28. Arrays elemento d e desea, teniendo en cuenta que siempre el
primer elem a ay es el índice 0. En este ejemplo los índices del
Un array es una colección ordenada de elementos del mismo tipo, que son array de tr ntos son 0, 1 y 2. Si se intenta usar un índice que está
accesibles a través de un índice. Un array puede contener datos primitivos fuera del rango válido para ese array se produce un error (en realidad una
o referencias a objetos. exc En el ejemplo anterior se produce esta excepción si el índice
es ue 0 o mayor que 2.
Los arrays se declaran de la siguiente manera:
ede conocer el número de elementos de un array usando la variable
[modificadores] tipo_variable[ ] nombre; g h. En el ejemplo a.length contiene el valor 3.

Por ejemplo: Un array, como cualquier otra referencia, puede formar parte de la lista
de parámetros o constituir el valor de retorno de un método. En ambos
int[ ] a; casos se indica que se trata de un array con los corchetes que siguen al
Punto[ ] p; tipo. Por ejemplo:

La declaración dice que a es un array de ente y objetos String[ ] metodoConArrays(Punto[ ])


{
de tipo Punto. Más exactamente a es una ref una colección de ...
enteros, aunque todavía no se sabe cuántos ele iene el array. p es }
una referencia a una colección de referencias que apuntarán objetos
Punto. El método metodoConArrays recibe como parámetro un array de Puntos y
devuelve un array de St rings. El método podría invocarse de la siguiente
Un array se crea como si se tratar eto (de hecho las variables de forma:
tipo array son referencias):
Punto p[ ] = new Punto[3];
a = new int[5]; ...
p = new Punto[3] String[ ] resultado = metodoConArrays(p);

Ver 200804 34
E Extreme Guide: Usando Java Programación en Java

2.29. Arrays multidimensionales • Creación de Strings

Es posible declarar arrays de más de una dimensión. Los conceptos son los Un St ring puede crearse como se c otro objeto de cualquier
mismos que para los arrays monodimensionales (o mejor conocido como clase; mediante el operador new:
vectores).
String s = new String("Esto cadena de caracteres");
Por ejemplo:
Obsérvese que los litera adena de caracteres se indican entre
int[ ][ ] a = { {1, 2}, {3, 4}, {5, 6} }; comillas dobles (") a dif e los caracteres, que utilizan comillas
int x = a[1][0]; // contiene 3 simples (').
int y = a[2][1]; // contiene 6
Sin embarg es posible crear un St ring directamente, sin usar el
Se pueden recorrer los elementos de un array multidimensional, de la operador n endo una asignación simple (como si se tratara de un
siguiente forma: dato primitivo):

int[ ][ ] a = new int[3][2]; St "Esto es una cadena de caracteres";

for (int i = 0; i < a.length; i++) s expresiones conducen al mismo objeto.


for (int j = 0; j < a[i].length; j++)
a[i][j] = i * j; Los Strings no se modifican una vez que se les ha asignado valor. Si se
produce una reasignación se crea un nuevo objeto St ring con el nuevo
Obsérvese en el ejemplo la forma de acceder al tamaño de cada contenido. Además, la clase St ring proporciona constructores para crear
del array. Strings a partir de arrays de caracteres y arrays de bytes. Consultar la
documentación del API del JDK para más detalles.
2.30. Strings
• Concatenación de Strings
En Java no existe un tipo de datos primitivo qu ra la manipulación
de cadenas de caracteres. En su lugar se utili ase definida en la Java define el operador "+" (suma) con un significado especial cuando las
API que es la clase St ring. Esto significa que en Java las cadenas de operandos son de tipo St ring. En este caso, el operador "suma" significa
caracteres son, a todos los efectos, objetos que se manipulan como tales, concatenación. El resultado de la concatenación es un nuevo St ring
aunque existen ciertas operacione creación de St rings, para los compuesto por las dos cadenas, una tras otra. Por ejemplo:
que el lenguaje tiene soporte di o que se simplifican algunas
operaciones. String x = "Concatenar" + "Cadenas";

La clase St ring forma pac age java.lang y se describe da como resultado el St ring "ConcatenarCadenas".
completamente en del API del JDK.

Ver 200804 35
E Extreme Guide: Usando Java Programación en Java

También es posible concatenar a un St ring datos primitivos, tanto Método Descripció


numéricos como booleanos y char. Por ejemplo, se puede usar: p i e c. Devuelve -1 si c
no ing.
int i = 5; Ig terior, pero buscando la
int indexOf(String s)
String x = "El valor de i es " + i; esentada por s.
e la longitud del St ring (número
int length()
Cuando se usa el operador "+" y una de las variables de la expresión es un teres).
St ring, Java transforma la otra variable (si es de tipo primitivo) en un evuelve una subcadena desde el índice
String substring(int begin, int
St ring y las concatena. Si la otra variable es una referencia a un objeto egin hasta el end.
entonces invoca el método toString() que existe en todas las clases (es un Devuelve un string que es la
método de la clase Object). representación del entero i. Obsérvese
static String ) que este método es estático. Hay
• Otros métodos de la clase String métodos equivalentes donde el
argumento es un float , double, etc.
La clase St ring dispone de una amplia gama de métodos para la cha rArray() Transforman el string en un array de
manipulación de las cadenas de caracteres. Para una referencia completa Str erCase() caracteres, o a mayúsculas o a
consultar la documentación del API del JDK. El siguiente cuadro muestra erCase() minúsculas.
un resumen con algunos de los métodos más significativos:
a clase StringBuffer
Método Descripción
Devuelve el carácter en l Dado que la clase St ring sólo manipula cadenas de caracteres constantes,
char charAt(int index) indicada por index. El rango d resulta poco conveniente cuando se precisa manipular intensivamente
de 0 a length() - 1. cadenas (reemplazando caracteres, añadiendo o suprimiendo, etc.).
Compara el St ring objeto Cuando esto es necesario, puede usarse la clase St ringBuf fer definida
especificado. e si y también en el package java.lang del API. Esta clase implanta un buffer
boolean equals(Object obj) solo si el arg es un dinámico y tiene métodos que permiten su manipulación cómodamente
objeto St rin ontiene la misma (ver la documentación del API).
secuencia de es.
Compara el St ring con otro, ignorando
consideraciones de mayúsculas y
i ú l Los dos Strings se consideran
boolean equalsIgnoreCase(Strings) enen la misma longitud y, los
correspondientes en ambos
iguales sin tener en cuenta
y y minúscula.
int indexOf(char c) vuelve el índice donde se produce la

Ver 200804 36
Extreme Guide: Usando Java Modificadores

del package donde se define la clase.


Modificadores
Pueden utilizarse estos modificador uier tipo de miembros de
3. Modificadores la clase, incluidos los constructore se puede limitar quien
puede crear instancias de la clase
Los modificadores son elementos del lenguaje que se colocan delante de la
definición de variables locales, datos miembros, métodos o clases y que En el ejemplo siguiente, l os de la clase Punto se declaran
alteran o condicionan el significado del elemento. En capítulos anteriores como private, y se incluy dos que devuelven las coordenadas del
se ha descrito alguno, como es el modificador stat ic que se usa para punto. De esta forma el d de la clase controla el contenido de los
definir datos miembros o métodos como pertenecientes a una clase, en datos que represe clase e independiza la implementación de la
lugar de pertenecer a una instancia. En capítulos posteriores se tratarán interface.
otros modificadores como final, abst ract o synchronized. En este capítulo
se presentan los modificadores de acceso, que son aquellos que permiten class Pun
limitar o generalizar el acceso a los componentes de una clase o a la clase {
en sí misma. int x, y;
rivate int numPuntos = 0;
3.1. Modificadores de acceso
to(int a, int b)
Los modificadores de acceso permiten al diseñador de una cla
determinar quien accede a los datos y métodos miembros de una clase. x = a;
modificadores de acceso preceden a la declaración de un elem y = b;
clase (ya sea dato o método), de la siguiente forma: numPuntos++;
}
[modificadores] tipo_variable nombre;
int getX() {
[modificadores] tipo_devuelto nombre_Me tos); return x;
}
Existen los siguientes modificadores de acceso:
int getY() {
• public: todo el mundo puede acceder al elemento. Si es un dato return y;
miembro, todo el mundo puede ver el elemento, es decir, usarlo y }
asignarlo. Si es un método, to puede invocarlo.
• private: sólo se puede acce mento desde métodos de la static int cuantosPuntos() {
clase, o sólo puede i o desde otro método de la return numPuntos;
clase. }
• protected: se e pítulo dedicado a la herencia. }
• Sin modificado der al elemento desde cualquier clase
Ver 200804 37
Extreme Guide: Usando Java Modificadores

Si alguien, desde una clase externa a Punto, intenta lo siguiente, obtendrá complementan a los otros dos. El primero mportante cuando se
un error del compilador: utilizan relaciones de herencia entre las c el segundo establece
relaciones de "confianza" entre cla ntro del mismo package.
... Así, la pertenencia de las clases a u age es algo más que una
Punto p = new Punto(0, 0); clasificación de clases por cuestio
p.x = 5;
... Cuando se diseñan clases pararse a pensar en términos de
quien debe tener acceso é cosas son parte de la implantación y
3.2. Modificadores de acceso para clases deberían ocultarse (y en do), y que cosas forman parte de la
interface y debería blicas.
Las clases en sí mismas pueden declararse:

• public: todo el mundo puede usar la clase. Se pueden crear instancias


de esa clase, siempre y cuando alguno de sus constructores sea
accesible.
• Sin modificador: La clase puede ser usada e instanciada por clases
dentro del package donde se define.

Las clases no pueden declararse ni protected ni private.

3.3. Importancia de los modificadores de acceso

Los modificadores de acceso permiten al diseñador de clases d


frontera entre lo que es accesible para los usuarios de l que es
estrictamente privado y "no importa" a nadie r de la
clase e incluso lo que podría llegar a impor res de
clases que quisieran alterar, completar o espe el comportamiento
de la clase.

Con el uso de estos modificadores se consigue uno de los principios básicos


de la Programación Orientada a Obj t ue es la encapsulación: las
clases tienen un comportamie do para quienes las usan
conformado por los elementos un acceso público, y una
implementación oculta fo entos privados, de la que no
tienen que preocuparse lo e.

Los otros dos modi ed y el acceso por defecto (package)


Ver 200804 38
Extreme Guide: Usando Java Herencia, Clases y Objetos

Herencia, Clases y Objetos Empleado(String nombre, int


this.nombre = nombre;
4. Herencia, Clases y Objetos this.sueldo = sueldo;
numEmpleado = ++contador
4.1. Herencia }

En anteriores ejemplos se ha visto que una clase tiene datos miembros que public void aumentar int porcentaje) {
son instancias de otras clases. Por ejemplo:
sueldo += (int)(su aumento / 100);
}
class Circulo {
Punto centro;
public g() {
int radio;
return empleado " + numEmpleado +
" Nombre: " + nombre +
float superficie() {
" Sueldo: " + sueldo;
return 3.14 * radio * radio;
}
}

En el ejemplo el Empleado se caracteriza por un nombre (String) y por un


Esta técnica en la que una clase se compone o contiene instancias de ot
número de empleado y sueldo (enteros). La clase define un constructor
clases se denomina composición. Es una técnica muy habitual
que asigna los valores de nombre y sueldo y calcula el número de
diseñan clases. En el ejemplo diríamos que un Circulo tiene
empleado a partir de un contador (variable estática que siempre irá
(centro) y un radio.
aumentando), y dos métodos, uno para calcular el nuevo sueldo cuando se
produce un aumento de sueldo (método aumentarSueldo) y un segundo
Pero además de esta técnica de composición es asos en
que devuelve una representación de los datos del empleado en un String
los que una clase es una extensión de otra. E como
(método toSt ring).
otra y además tiene algún tipo de característica ue la distingue.
Con esta representación podemos pensar en otra clase que reúna todas las
Por ejemplo podríamos pensar en la clase Empl finirla como:
características de Empleado y añada alguna propia. Por ejemplo, la clase
Ejecut ivo. A los objetos de esta clase se les podría aplicar todos los datos y
class Empleado
métodos de la clase Empleado y añadir algunos, como por ejemplo el
{
hecho de que un Ejecut ivo tiene un presupuesto.
String nombre;
int numEmpleado, su
Así diríamos que la clase Ejecut ivo extiende o hereda la clase Empleado.
static private 0; Esto en Java se hace con la clausula extends que se incorpora en la
definición de la clase, de la siguiente forma:

Ver 200804 39
Extreme Guide: Usando Java Herencia, Clases y Objetos

class Ejecutivo extends Empleado 4.2. Definición de métodos: el uso de sup


{
int presupuesto; Además se podría pensar en redef métodos de la clase base
pero haciendo que métodos con e bre y características se
void asignarPresupuesto(int p) { comporten de forma distinta. Po mos pensar en rediseñar
presupuesto = p; el método toSt ring de la clase do añadiendo las características
} propias de la clase Ejecut poner:
}
class Ejecutivo extend ado {
Con esta definición un Ejecut ivo es un Empleado que además tiene algún int presupues
rasgo distintivo propio. El cuerpo de la clase Ejecut ivo incorpora sólo los
miembros que son específicos de esta clase, pero implícitamente tiene void as to(int p) {
todo lo que tiene la clase Empleado. presup p;
}
A Empleado se le llama clase base o superclase, y a Ejecut ivo clase
derivada o subclase. tring toString() {
g s = super.toString();
Los objetos de las clases derivadas se crean igual que los de la clase base y = s + " Presupuesto: " + presupuesto;
pueden acceder tanto sus datos y métodos como a los de la clase base. eturn s;
ejemplo: }
}
Ejecutivo jefe = new Ejecutivo("Armando Mucho", 1000)
jefe.asignarPresupuesto(1500); De esta forma cuando se invoque jefe. toSt ring() se usará el método
jefe.aumentarSueldo(5); toSt ring de la clase Ejecut ivo en lugar del existente en la clase Empleado.
Obsérvese en el ejemplo el uso de super, que representa referencia
Nota: La discusión acerca de los constructor e os u poco más interna implícita a la clase base (superclase). Mediante super. toSt ring() se
adelante. invoca el método toSt ring de la clase Empleado.

Atención: Un Ejecut ivo ES un Empleado, pero lo contrario no es cierto. Si 4.2.1. Inicialización de clases derivadas
escribimos:
Cuando se crea un objeto de una clase derivada se crea implícitamente un
Empleado curri = new Emplead Comex Plota", 100); objeto de la clase base que se inicializa con su constructor
curri.asignarPresupuesto(500 or correspondiente. Si en la creación del objeto se usa el constructor no-args,
entonces se produce una llamada implícita al constructor no-args para la
clase base. Pero si se usan otros constructores es necesario invocarlos
se producirá un err , pues en la clase Empleado no existe
explícitamente.
ningún método llam puesto.
Ver 200804 40
Extreme Guide: Usando Java Herencia, Clases y Objetos

En nuestro ejemplo dado que la clase método define un constructor, class Empleado
necesitaremos también un constructor para la clase Ejecut ivo, que {
podemos completar así: protected int sueldo;
...
class Ejecutivo extends Empleado }
{
int presupuesto; Entonces, desde la clase puede acceder al dato miembro
sueldo, mientras que si se private no.
Ejecutivo(String n, int s) {
super(n, s); 4.2.3. Up-casting -casting
}
Siguiendo jemplo de los apartados anteriores, dado que un
void asignarPresupuesto(int p) { Ejecut ivo E leado se puede escribir la sentencia:
presupuesto = p;
} Em mp = new Ejecutivo("Máximo Dueño" , 2000);

public String toString() {


e c ea un objeto de la clase Ejecut ivo que se asigna a una referencia
String s = super.toString();
po Empleado. Esto es posible y no da error ni al compilar ni al
s = s + " Presupuesto: " + presupuesto;
ejecutar porque Ejecut ivo es una clase derivada de Empleado. A esta
return s;
operación en que un objeto de una clase derivada se asigna a una
}
referencia cuyo tipo es alguna de las superclases se denomina 'upcasting'.
}

Cuando se realiza este tipo de operaciones, hay que tener cuidado porque
Obsérvese que el constructor de Ejecut ivo invoca nte al para la referencia emp no existen los miembros de la clase Ejecut ivo,
constructor de Empleado mediante super(argum esultar aunque la referencia apunte a un objeto de este tipo. Así, las expresiones:
necesaria la invocación al constructor de la sup rimera
sentencia del constructor de la subclase. emp.aumentarSueldo(3); // ok. aumentarSueldo es de Empleado
emp.asignarPresupuesto(1500); // error de compilación
4.2.2. El modificador de acceso protected
En la primera expresión no hay error porque el método aumentarSueldo
El modificador de acceso protecte mbinación de los accesos que está definido en la clase Empleado. En la segunda expresión se produce un
proporcionan los modificadores p vate. protected proporciona error de compilación porque el método asignarPresupuesto no existe para
acceso público para las clases de ceso privado (prohibido) para la clase Empleado.
el resto de clases.
Por último, la situación para el método toSt ring es algo más compleja. Si
Por ejemplo, si en l definimos: se invoca el método:
Ver 200804 41
Extreme Guide: Usando Java Herencia, Clases y Objetos

emp.toString(); // se invoca el método toString de Ejecutivo 4.3. La clase Object

El método que resultará llamado es el de la clase Ejecut ivo. toSt ring En Java existe una clase base que la jerarquía y de la cual
existe tanto para Empleado como para Ejecut ivo, por lo que el compilador heredan todas, aunque no se diga te mediante la clausula
Java no determina en el momento de la compilación que método va a extends. Esta clase base se lla ontiene algunos métodos
usarse. Sintácticamente la expresión es correcta. El compilador retrasa la básicos. La mayor parte de e hacen nada, pero pueden ser
decisión de invocar a un método o a otro al momento de la ejecución. Esta redefinidos por las clase implementar comportamientos
técnica se conoce con el nombre de dinamic binding o late binding. En el específicos.
momento de la ejecución la JVM comprueba el contenido de la referencia
emp. Si apunta a un objeto de la clase Empleado invocará al método Los métodos decla la clase Object son los siguientes:
toSt ring de esta clase. Si apunta a un objeto Ejecut ivo invocará por el
contrario al método toSt ring de Ejecut ivo. public class
public final C ass() {...}
public String toSt g() {...}
4.2.4. Operador cast
pub an equals(Object obj) {...}
pub shCode() {...}
Si se desea acceder a los métodos de la clase derivada teniendo una pro ject clone() throws CloneNotSupportedException {...}
referencia de una clase base, como en el ejemplo del apartado anterior, oid wait() throws IllegalMonitorStateException,
hay que convertir explícitamente la referencia de un tipo a otro. Esto se InterruptedException {...}
hace con el operador de cast de la siguiente forma: p final void wait(long millis) throws IllegalMonitorStateException,
InterruptedException {...}
Empleado emp = new Ejecutivo("Máximo Dueño", 2000); public final void wait(long millis, int nanos) throws IllegalMonitorStateException,
InterruptedException { ...}
Ejecutivo ej = (Ejecutivo)emp; / / se convierte la referencia de tipo
public final void notify() throws IllegalMonitorStateException {...}
ej .asignarPresupuesto(1500); public final void notifyAll() throws IllegalMonitorStateException {...}
protected void finalize() throws Throwable {...}
La expresión de la segunda línea convierte la r pleado
asignándola a una referencia de tipo Ejecut el compilador es Las cláusulas f inal y throws se verán en otros apartados más delante de
correcto porque Ejecut ivo es una clase derivad pleado. En tiempo esta guía. Como puede verse, toSt ring es un método de la clase Object ,
de ejecución la JVM convertirá la referencia si mente emp apunta que puede ser redefinido en las clases derivadas (mediante el uso de
a un objeto de la clase Ejecut ivo. Si se intenta: polimorfismo). Los métodos wai t , not ify y not i fyAll tienen que ver con la
gestión de los hilos (threads) de la JVM. El método f inalize ya se ha
Empleado emp = new Empleado( das", 2000); comentado, al hablar del recolector de basura, en un apartado anterior de
Ejecutivo ej = (Ejecutivo)em esta misma guía.

Para una descripción exhaustiva de los métodos de la clase Object (base


no dará problemas al co ecutar se producirá un error
de todas las clases en Java), se puede consultar la documentación de la
porque la referenci n objeto de clase Empleado y no a uno
API del JDK.
de clase Ejecut ivo.
Ver 200804 42
Extreme Guide: Usando Java Herencia, Clases y Objetos

4.3.1. La cláusula final class Circulo {


...
En ocasiones es conveniente que un método no sea redefinido en una clase public final static float PI
derivada, o incluso que una clase completa no pueda ser extendida. Para ...
esto está la cláusula final, que tiene significados levemente distintos según }
se aplique a un dato miembro, a un método o a una clase.
En el ejemplo se define e o de tipo float , estático (es igual
Para una clase, f inal significa que la clase no puede extenderse. Es, por para todas las instancia ante (modificador f inal) y de acceso
tanto el punto final de la cadena de clases derivadas. Por ejemplo si se público.
quisiera impedir la extensión de la clase Ejecut ivo, se pondría:
4.4. Here
final class Ejecutivo
{ Java incorp ecanismo de herencia simple. Es decir, una clase sólo
... puede tener una superclase directa de la cual hereda todos los datos y
} mé uede existir una cadena de clases derivadas en que la clase A
he B y B herede de C, pero no es posible escribir algo como:
Para un método, f inal significa que no puede redefinirse en una clase
derivada. Por ejemplo si declaramos: A extends B , C .... // error

class Empleado Este mecanismo de herencia múltiple no existe en Java.


{
... Java implanta otro mecanismo que resulta parecido al de herencia
public final void aumentarSueldo(int porcentaje) { múltiple, que es el de las interfaces, que se verá más adelante.
...
}
...
}

Entonces la clase Ejecut ivo, clase derivada de Empleado, no podría


reescribir el método aumentarSueldo, y por tanto cambiar su
comportamiento.

Para un dato miembro, f inal signi que no puede ser redefinido


en una clase derivada, co os, pero además significa que
su valor no puede ningún sitio; es decir el modificador
f inal sirve también es constantes. Por ejemplo:
Ver 200804 43
Extreme Guide: Usando Java Excepciones

Excepciones public class Empresa


{
String nombre;
5. Gestión de Excepciones
Empleado[] listaEmpleados;
Las excepciones son el mecanismo por el cual pueden controlarse en un int totalEmpleados = 0;
programa Java las condiciones de error que se producen. Estas condiciones ...
de error pueden ser errores en la lógica del programa (como un índice de Empresa(S tring n, int maxE
un array fuera de su rango), una división por cero, o errores disparados por
nombre = n;
los propios objetos que denuncian algún tipo de estado no previsto, o
listaEmpleados = eado[maxEmp];
condición que no pueden manejar.
}
La idea general es que cuando un objeto encuentra una condición que no ...
sabe manejar, crea y dispara una excepción que deberá ser capturada por void nuevoEmpleado(String nombre, int sueldo) {
el que le llamó o por alguien más arriba en la pila de llamadas. Las pleados < listaEmpleados.length) {
excepciones son objetos que contienen información del error que se ha
eados[totalEmpleados++] = new Empleado(nombre, sueldo);
producido y que heredan de la clase Throwable o de la clase Except ion. Si
nadie captura la excepción, interviene un manejador por defecto que
normalmente imprime información que ayuda a encontrar quién produjo l
excepción y deteniendo la ejecución de la aplicación. }

Existen dos categorías de excepciones:


Obsérvese en el método nuevoEmpleado que se comprueba que hay sitio
en el array para almacenar la referencia al nuevo empleado. Si lo hay, se
• Excepciones verificadas: El compilador obliga a
crea el objeto. Pero si no lo hay, el método no hace nada más. No da
todas las que son lanzadas explícitamente p .
ninguna indicación de si la operación ha tenido éxito o no. Se podría hacer
• Excepciones no verificadas: El com a su
una modificación para que, por ejemplo el método devolviera un valor
verificación. Son excepciones como divisio cero, excepciones
booleano t rue si la operación se ha completado con éxito y false si ha
de puntero nulo, o índices fuera de rango.
habido algún problema.

5.1.1. Generación de excepciones


Otra posibilidad es generar una excepción verificada (una excepción no
verificada se produciría si no se comprobara si el nuevo empleado va a
Supongamos que tenemos una clas e tiene un array de objetos
caber o no en el array). Vamos a ver como se haría esto.
Empleado (clase vista en capítul es). En esta clase podríamos
tener métodos para contratar un (añadir un nuevo objeto al
Las excepciones son clases, que heredan de la clase genérica Except ion. Es
array), despedirlo (quila ener el nombre a partir del
necesario por tanto asignar un nombre a nuestra excepción. Se suelen
número de emplead ía ser algo así como se muestra en el
asignar nombres que den alguna idea del tipo de error que controlan. En
siguiente ejemplo:
nuestro ejemplo le vamos a llamar CapacidadEmpresaExcedida.
Ver 200804 44
Extreme Guide: Usando Java Excepciones

Para que un método lance una excepción, se debe declarar el tipo de ver una descripción completa de la clase Exc
excepción que lanza con la cláusula throws en su declaración. Debe lanzar
la excepción, en el punto del código adecuado con la sentencia throw. De esta forma se pueden construir m eneren excepciones.

En nuestro ejemplo: 5.1.2. Captura de excepciones

void nuevoEmpleado(String nombre, int sueldo) throws CapacidadEmpresaExcedida Con la primera versión voEmpleado (sin excepción) se
{ invocaría este método de te forma:
if (totalEmpleados < listaEmpleados.length)
Empresa em = ne a("La Mundial");
{
em.nuevoEm Primero", 500);
listaEmpleados[ totalEmpleados++] = new Empleado(nombre, sueldo);
} else throw new CapacidadEmpresaExcedida(nombre); Si se utili e formato en el segundo caso (con excepción) el
} compilador produciría un error indicando que no se ha capturado la
exc erificada lanzada por el método nuevoEmpleado. Para capturar
Además, necesitamos escribir la clase CapacidadEmpresaExcedida. Sería la n es utiliza la construcción t ry / catch, de la siguiente forma:
algo así:
sa em = new Empresa("La Mundial");
public class CapacidadEmpresaExcedida extends Exception
{ Try
CapacidadEmpresaExcedida(String nombre) {
{ em.nuevoEmpleado("Adán Primero", 500);
super("No es posible añadir el empleado " + nombre }
} catch (CapacidadEmpresaExcedida exc)
. . . {
} System.out.println(exc.toString());
System.exit(1);
}
La sentencia throw, en este ejemplo, cre jeto de la clase
CapacidadEmpresaExcedida. El constructor tiene un argumento (el nombre
del empleado). El constructor simplemente llama al constructor de la • Se encierra el código que puede lanzar la excepción en un bloque t ry
superclase pasándole como argum o explicativo del error (y el / catch.
nombre del empleado que no se h adir). • A continuación del catch se indica que tipo de excepción se va a
capturar.
La clase de la excepción s métodos o guardar datos de • Después del catch se escribe el código que se ejecutará si se lanza la
depuración que se ortunos. El único requisito es que excepción.
extienda de la clas sultar la documentación del API para • Si no se lanza la excepción, el bloque catch no se ejecuta.
Ver 200804 45
Extreme Guide: Usando Java Excepciones

El formato general del bloque t ry / catch es: excepción como si no. Puede servir para limp estado interno de los
objetos afectados o para liberar recurso os (descriptores de
try { fichero, por ejemplo). La sintaxis gl e t ry / catch / finally es:
. . .
} catch (Clase_Excepcion nombre) { try {
. . . . . .
} catch (Clase_Excepcion nombre) { } catch (Clase_Excepci
. . . . . .
} } catch (Clase_Excepci re) {
. . . . . .
} finally
Obsérvese que se puede capturar más de un tipo de excepción declarando . . .
más de una sentencia catch. También se puede capturar una excepción }
genérica (clase Except ion) que engloba a todas las demás. . . .

En ocasiones, el código que llama a un método que dispara una excepción


tampoco puede (o sabe) manejar esa excepción. Si no sabe qué hacer con
ella puede de nuevo lanzarla hacia arriba en la pila de llamada para que la
gestione quien le llamó (que a su vez puede capturarla o reenviarl
Cuando un método no tiene intención de capturar la excepción de
declararla mediante la cláusula throws, tal como hemos visto en
que genera la excepción.

Supongamos que, en nuestro ejemplo, es el método ma lase el


que invoca el método nuevoEmpleado. Si no q epción
debe hacer lo siguiente:

public static void main(String [] args) throws Capacid aExcedida {


Empresa em = new Empresa("La Mundial");
em.nuevoEmpleado("Adán Primero", 500);
}

5.1.3. Cláusula finally

La cláusula f inally el bloque t ry / catch y sirve para


especificar un bloq ue se ejecutará tanto si se lanza la
Ver 200804 46
Extreme Guide: Usando Java Clases envoltorios (wrappers)

manipulación de datos primitivos (conversio acia datos primitivos,


Clases Envoltorias conversiones a String, etc.)

6. Clases envoltorios (wrappers) Las clases envoltorio existentes son:

En ocasiones es muy conveniente poder tratar los datos primitivos (int , • Byte para byte.
boolean, etc.) como objetos. Por ejemplo, los contenedores definidos por • Shor t para short .
el API en el package java.ut il (Arrays dinámicos, listas enlazadas, • Integer para int .
colecciones, conjuntos, etc.), utilizan como unidad de almacenamiento la • Long para long.
clase Object . Dado que Object es la raíz de toda la jerarquía de objetos en • Boolean para b
Java, estos contenedores pueden almacenar cualquier tipo de objetos. • Float p
Pero los datos primitivos no son objetos, con lo que quedan en principio • Double
excluidos de estas posibilidades. • Charac har.

Para resolver esta situación, el API de Java incorpora las clases envoltorio Ob que las clases envoltorio tienen siempre la primera letra en
(wrapper class), que no son más que dotar a los datos primitivos con un ma
envoltorio que permita tratarlos como objetos. Por ejemplo podríamos
definir una clase envoltorio para los enteros, de forma bastante sencilla, ases envoltura se usan como cualquier otra, como por ejemplo:
con:
Integer i = new Integer(5);
public class Entero { int x = i.intValue();
private int valor;

Hay que tener en cuenta que las operaciones aritméticas habituales (suma,
Entero(int valor) {
resta, multiplicación, ...) están definidas solo para los datos primitivos por
this.valor = valor;
lo que las clases envoltura no sirven para este fin.
}

Las variables primitivas tienen mecanismos de reserva y liberación de


int intValue() {
memoria más eficaces y rápidos que los objetos por lo que deben usarse
return valor;
datos primitivos en lugar de sus correspondientes envolturas siempre que
}
se pueda.
}

6.1.1. Resumen de métodos de Integer


La API de Java hace innecesario al proporcionar un conjunto
completo de clases e odos los tipos primitivos. Las clases envoltorio proporcionan también métodos de utilidad para la
Adicionalmente a la func e se muestra en el ejemplo, manipulación de datos primitivos. La siguiente tabla muestra un resumen
las clases envolt an métodos de utilidad para la de los métodos disponibles para la clase Integer.

Ver 200804 47
Extreme Guide: Usando Java Clases envoltorios (wrappers)

Método Descripción
Integer(int valor)
Constructores a partir de int y String.
Integer(String valor)
int intValue()
Devuelve el valor en distintos formatos:
byte byteValue()
int , long, float, etc.
float floatValue()
Devuelve t rue si el objeto con el que se
boolean equals(Object obj) compara es un Integer y su valor es el
mismo.
Devuelve un Integer a partir de una
static Integer getInteger(String s)
cadena de caracteres. Estático.
Devuelve un int a partir de un String.
static int parseInt(String s)
Estático.
static String toBinaryString(int i)
Convierte un entero a su representación
static String toOctalString(int i)
en String en binario, octal, hexadecimal,
static String toHexString(int i)
static String toString(int i) etc. Estáticos.
Convierte un entero a su representación
String toString()
en String.
Devuelve un Integer a partir de un St rin
static Integer valueOf(String s)
Estático.

El API de Java contiene una descripción completa de todas


envoltorio en el package java.lang.

Ver 200804 48
Extreme Guide: Usando Java Comentarios y Convenciones

Comentarios y Convenciones
7. Comentarios y convenciones de nombres

En Java existen comentarios de línea con / / y bloques de comentario que


comienzan con /* y terminan con */. Por ejemplo:

// Comentario de una línea

/* comienzo de comentario
continua comentario
fin de comentario */

7.1.1. Convenciones de nombres

SUN recomienda un estilo de codificación que es seguido en el API de Java


y en estos apuntes que consiste en:

• Utilizar nombres descriptivos para las clases, evitando los nomb


muy largos.
• Para los nombres de clases poner la primera letra en mayús
demás en minúsculas. Por ejemplo: Empleado. Si el nom
varias palabras, ponerlas todas juntas (sin separar _ ), y
poner la primera letra de cada palabra en emplo:
Inst rumentoMusical.
• Para los nombres de miembros (datos y ) seguir la misma
norma, pero con la primera letra de la prim bra en minúsculas.
Por ejemplo: regist rarOyente.
• Para las constantes (datos con el modificador f inal) usar nombres en
mayúsculas, separando las palabras con " ".

Ver 200804 49
Extreme Guide: Usando Java Packages & Imports

La agrupación de clases en packages es co e desde el punto de


Packages & Imports vista organizativo, para mantener bajo ación común clases
relacionadas que cooperan desde a e vista. También resulta
8. Packages & Imports importante por la implicación que lo nen en los modificadores
de acceso.
8.1. Packages
8.2. Nombres de los pac
Un package es una agrupación de clases afines. Equivale al concepto de
librería existente en otros lenguajes o sistemas. Una clase puede definirse Los packages se pueden usando nombres compuestos separados
como perteneciente a un package y puede usar otras clases definidas en por puntos, de fo ar a como se componen las direcciones URL de
ese o en otros packages. Internet . se puede tener un package de nombre
misPackage se. Cuando se utiliza esta estructura se habla
Los packages delimitan el espacio de nombres (space name). El nombre de de package ckages. En el ejemplo misPackages es el package base,
una clase debe ser único dentro del package donde se define. Dos clases Geomet ria es un subpackage de misPackages y Base es un subpackage de
con el mismo nombre en dos packages distintos pueden coexistir e incluso Ge De esta forma se pueden tener los packages ordenados según
pueden ser usadas en el mismo programa. Una clase se declara un ía equivalente a un sistema de archivos jerárquico.
perteneciente a un package con la clausula package, cuya sintaxis es:
de java está estructurado de esta forma, con un primer calificador
package nombre_package; o javax) que indica la base, un segundo calificador (awt , ut il, swing,
etc.), que indica el grupo funcional de clases, y opcionalmente
La clausula package debe ser la primera sentencia del archi subpackages en un tercer nivel, dependiendo de la amplitud del grupo.
Cualquier clase declarada en ese archivo pertenece al package i Cuando se crean packages de usuario no es recomendable usar nombres de
packages que empiecen por java o javax.
Por ejemplo, un archivo que contenga las sentencias:
8.3. Ubicación de packages en el sistema de archivos
package miPackage;
... Además del significado lógico descrito hasta ahora, los packages también
class miClase { tienen un significado físico que sirve para almacenar los módulos
... ejecutables (ficheros con extensión .class) en el sistema de archivos del
} ordenador.

declara que la clase miClase perte kage miPackage. Supongamos que definimos una clase de nombre miClase que pertenece a
un package de nombre misPackages.Geomet ria.Base. Cuando la JVM vaya a
La cláusula package es op za, las clases declaradas en el cargar en memoria miClase buscará el módulo ejecutable (de nombre
archivo fuente no pert package concreto, sino que miClase.class) en un directorio en la ruta de acceso
pertenecen a un pa sin nombre. misPackages / Geomet ria / Base. Está ruta deberá existir y estar accesible a
la JVM para que encuentre las clases.
Ver 200804 50
Extreme Guide: Usando Java Packages & Imports

Si una clase no pertenece a ningún package (no existe clausula package), compilador, es necesario que esté definida e mo package.
se asume que pertenece a un package por defecto sin nombre, y la JVM
buscará el archivo .class en el directorio actual. Si esto no es así, es necesario hacer spacio de nombres donde
está definida la clase Punto a nue ase. Esto se hace con la
Para que una clase pueda ser usada fuera del package donde se definió clausula impor t . Supongamos que stuviera definida de esta
debe ser declarada con el modificador de acceso public, de la siguiente forma:
forma:
package GeometriaBase;
package GeometriaBase;
class Punto
public class Punto {
{ int x,
int x, y; }
}
En para usar la clase Punto en nuestra clase Circulo deberíamos
Si una clase no se declara public sólo puede ser usada por clases que po
pertenezcan al mismo package.
ge GeometriaAmpliada;
8.4. Imports
import GeometriaBase.*;
Cuando se referencia cualquier clase dentro de otra se asum
indica otra cosa, que ésta otra está declarada en el mismo pa class Circulo
ejemplo: {
Punto centro;
package Geometria; ...
... }
class Circulo
{ Con la cláusula impor t Geomet riaBase.*; se hacen accesibles todos los
Punto centro; nombres (todas las clases) declaradas en el package GeometriaBase. Si
... sólo se quisiera tener accesible la clase Punto se podría declarar:
}
import GeometriaBase.Punto;
En esta declaración definimos la ulo perteneciente al package
Geomet ria. Esta clase us compilador y la JVM asumen También es posible hacer accesibles los nombres de un package sin usar la
que Punto pertene t ackage Geomet ria, y tal como está clausula impor t , calificando completamente los nombres de aquellas
hecha la definición e Punto sea accesible (conocida) por el clases pertenecientes a otros packages. Por ejemplo:
Ver 200804 51
Extreme Guide: Usando Java Packages & Imports

package GeometriaAmpliada;

class Circulo {
GeometriaBase.Punto centro;
...
}

Sin embargo si no se usa impor t es necesario especificar el nombre del


package cada vez que se usa el nombre Punto.

La cláusula impor t simplemente indica al compilador donde debe buscar


clases adicionales, cuando no pueda encontrarlas en el package actual y
delimita los espacios de nombres y modificadores de acceso. Sin embargo,
no tiene la implicación de "importar" o copiar código fuente u objeto
alguno. En una clase puede haber tantas sentencias impor t como sean
necesarias. Las cláusulas impor t se colocan después de la cláusula package
(si es que existe) y antes de las definiciones de las clases.

Ver 200804 52
Extreme Guide: Usando Java Compilación y ejecución usando el JDK

Cómo compilar y ejecutar: JDK HolaMundo.

Recuerda que en Java las mayúscula s son significativas. No es


9. Compilación y ejecución usando el JDK lo mismo la clase ejemplo1 que la c Esto suele ser fuente de
errores, sobre todo al principi ten en cuenta que en
En este apartado se asume que se ha instalado el JDK (J2SE) distribuido algunos sistemas operativos com ws, o más concretamente en una
por SUN Microsystems y que tanto el compilador (javac) como la JVM (java) ventana DOS, esta distinc edes poner cd C:\ApuntesJava o
están accesibles. Asumiremos que los comandos se emitirán desde una cd C:\APUNTESJAVA indi te: el resultado será el mismo (no así
ventana DOS en un sistema Windows, siendo la sintaxis en un entorno UNIX en cualquier UNIX, que sí unas y otras). Asegúrate por tanto, de
muy parecida. En este capítulo se verán todos los pasos necesarios para que las palabras e ectamente escritas.
crear, compilar y ejecutar un programa Java.
Cuando p Programas\Ejemplo1\HolaMundo.java estás
PASO 1: Con un editor de texto simple (incluso el bloc de notas sirve, indicando a dor que busque un archivo de nombre HolaMundo. java
aunque resulta poco aconsejable), creamos un archivo con el contenido en la ruta Programas\Ejemplo1, a partir del directorio actual; es decir,
siguiente: est ficando la ruta de un archivo.

package Programas.Ejemplo1; plo se utiliza la clase del API de Java System. Sin embargo el
ama no tiene ningún import . No obstante el compilador no detecta
class HolaMundo { n error y genera el código ejecutable directamente. Esto se debe a
public static void main(String[] args) { que la clase System está definida en el package java.lang, que es el único
System.out.println("Hola a todos"); del que no es necesario hacer el impor t , que es hecho implícitamente por
} el compilador. Para cualquier clase del API, definida fuera de este package
} es necesario hacer el import correspondiente.

Guardamos el fichero fuente con nombre Hola rpeta, PASO 3: Ejecutar el programa. Para esto, desde la ventana DOS,
por ejemplo: C:\ApuntesJava\Programas\Ejemp escribiremos:

PASO 2: Abrimos una ventana DOS y en ella esc o siguiente: C:\ApuntesJava>java Programas.Ejemplo1.HolaMundo

C:\>cd C:\ApuntesJava Se cargará la JVM, cargará la clase HolaMundo y llamará a su método main
C:\ApuntesJava>javac Program \Ej l 1\HolaMundo.java que producirá en la ventana DOS la salida:

Si no hay ningún error en el prog roducirá la compilación, y el Hola a todos


compilador alma el directorio
C:\ApuntesJava\Programa fichero de nombre Los archivos .class son invocables directamente desde la línea de
HolaMundo.class, c ecutable correspondiente a la clase comandos (con la sintaxis java nombreDeClase) si tienen un método main

Ver 200804 53
Extreme Guide: Usando Java Compilación y ejecución usando el JDK

definido. 9.2. Requerimientos mínimos de instalaci

Se puede indicar a la JVM que busque las clases en rutas alternativas al • Sistema operativo Windows 95.
directorio actual. Esto se hace con el parámetro -classpath • 16 MB de memoria RAM.
(abreviadamente -cp) en la línea de comandos. Por ejemplo si el directorio • 50 MB disponibles en el disco
actual es otro, podemos invocar el programa de ejemplo de la forma:
Si se posee un computado terísticas se deben instalar los
C:\Windows>java -cp C:\ApuntesJava Programas.Ejemplo1.HolaMundo siguientes componentes:

• El kit de desa a Java 1.5 contiene los comandos javac y java


Con el parámetro -cp se puede especificar diversas rutas alternativas para
para co ar sus programas.
la búsqueda de clases separadas por ";". Cuando pones java
• La API iene la documentación de las clases estándares
Programas.Ejemplo1.HolaMundo estás indicando a la JVM que cargue y
de Java stalar la API, desempaquete el archivo ".zip" con un
ejecute la clase HolaMundo del package Programas, subpackage Ejemplo1.
programa como WinZip o ZipCentral. Le recomendamos elegir como
Para cumplir está orden, expresada en términos Java de clases y packages
C:\. Esto dejará la API junto con el kit de desarrollo.
la JVM buscará el archivo HolaMundo.class en la ruta Programas\Ejemplo1
que es algo expresado en términos del sistema de archivos, y por tanto del
sistema operativo. ervaciones para los usuarios de Windows 95 o 98

talación del kit de desarrollo requiere que agregue la siguiente línea


9.1. Archivos fuente (.java) y ejecutables (.class)
en el archivo c:\autoexec.bat:

El esquema habitual es tener un archivo fuente por clase y


set PATH=C:\"... dir de jdk ..."\bin;"%PATH%"
archivo fuente el mismo nombre que la clase con la extensió
nombre . java para la extensión es obligatorio). Esto generará a
un archivo .class con el mismo nombre que l f t clase). en donde "dir. de jdk" es el directorio en donde Ud. instaló el kit de
Fuentes y módulos residirán en el mismo direct desarrollo para Java 1.5.

Lo habitual es tener uno o varios packages q artan un esquema Por último, se recomienda agregar la siguiente línea al archivo
jerárquico de directorios en función de nuestra ades (packages por c:\autoexec.bat:
aplicaciones, temas, etc.)
set JAVA_COMPILER=NONE
Es posible definir más de una clas hivo fuente, pero sólo una de
ellas podrá ser declarada public podrá ser utilizada fuera del Esto hará que Java consuma menos memoria y hará más fácil la búsqueda
package donde se define). Todas ases declaradas en el archivo de errores en sus programas. Para que las modificaciones hechas en
fuente serán internas a una clase public entonces, c:\autoexec.bat tengan validez, se debe reiniciar el computador.
obligatoriamente, el ente tiene que coincidir con el de la
clase declarada com
Ver 200804 54
Extreme Guide: Usando Java Compilación y ejecución usando JCreator

• En este momento, JCreator estará listo r utilizado, bien sea


Cómo compilar y ejecutar: JCreator para la creación de un nuevo apertura de uno ya
existente.
10. Iniciando JCreator
10.1. Modo Consola
Para trabajar, o programar, en el entorno denominado Java debemos
empezar por iniciar dicha aplicación. Para esto sigamos los siguientes Para crear un nuevo proy rno de JCreator debemos seguir
pasos: los siguientes pasos:

• Hacemos clic en el botón de Inicio, en Windows. • Si cuando JCre nicia y, por defecto, carga el último proyecto,
lo que tivar el menú File y una vez escogida dicha
• Ubicamos, dentro del menú Programas, el ítem denominado JCreator opción, g n submenú, del cual escogeremos la opción que
Pro. dice Cl legado a este punto, lo que JCreator hará será cerrar
todas las ventanas que tiene abiertas del lado derecho, y dejará, las
• Al abrir dicho menú se abrirá otro submenú, en el cual debemos o izquierdo, inactivas.
escoger de nuevo la opción JCreator. Al momento de escoger dicha
opción aparecerá en pantalla un splash de la aplicación. Paciencia, nuación, volvemos a activar el menú File, y de él escogeremos
deberemos esperar unos momentos hasta que se cargue por completo. hora la opción New. En este punto le estaremos diciendo a JCreator
Esto lo sabremos cuando en la pantalla aparece algo como: ue queremos crear algo nuevo, pero aún no le hemos dicho qué.

• Se abrirá un nuevo submenú, del cual escogeremos la opción Project ,


lo cual hará que se muestre una ventana parecida a la mostrada a
continuación:

Ver 200804 55
Extreme Guide: Usando Java Compilación y ejecución usando JCreator

• De todos los "dibuj itos" (que se denominan iconos), escogeremos el que tenga su nuevo proyecto en la caja de te derecha de Name. En
debajo de él indica Empty Project (que en la figura anterior se caso de que quiera cambiar la carpeta e por defecto JCreator
muestra de tercero de izquierda a derecha). En este punto ya JCreator creará su proyecto, deberá ind ndo el botón con los tres
conoce que lo que queremos hacer es crear un nuevo proyecto vacío. puntitos a la derecha de la ven on tres, en el cual en el
primero iría el nombre de la su proyecto. En los dos
NOTA: La diferencia de una aplicación en Modo Consola con una siguientes podría dejarlo igua nterior, pero se aconseja que en
estándar, denominada Modo Windows, radica en que la el segundo coloque e colocó en el primero pero
primera será una aplicación o programa en el cual solo agregándole una sub denominada source, y en el tercero
tendremos una interface con el usuario de puro texto, y el proceder como en el s ero cambiando source por classes. Todo
modo Windows son aquellos programas en los cuales, como el esto es por la razón de tener el proyecto organizado. Esto es,
mismo JCreator, podremos hacer uso de dibujos, gráficos, en la es donde usted creará los archivos de su
ventanas a colores, manejo del ratón, botones, cajas de program eta classes es en donde el compilador de Java
texto, etc. creará camente los archivos de bytecode necesarios para
ejecutar su programa (estos archivos son con extensión class, los
en cualquier momento usted podrá borrar cuando quiera, ya
• Haga doble clic sobre el icono que se menciona en el apartado anterior
generados por Java cuando usted compila el proyecto). Y en la
(o pulse el botón Next). Al hacerlo, dicha ventana cambiará por una
raíz sólo se encontrarán los archivos que JCreator creará para
parecida a la siguiente figura.
s configuraciones de su proyecto.

• Asegúrese de que en el paso anterior estén marcadas las opciones de


Create new workspace y Local fólder system (si dichas opciones son
mostradas).

• Si JCreator ya se encuentra configurado, nos bastará ahora con pulsar


el botón Finísh. Luego de esto la ventana cambiará a la mostrada a
continuación:

• En este mome colocarle el nombre que quiera que


Ver 200804 56
Extreme Guide: Usando Java Compilación y ejecución usando JCreator

• Ahora pulsaremos de nuevo el botón Finish y estaremos viendo la lo que queremos es trabajar con clases namos la opción que
siguiente pantalla: indica New Class.

• El resultado de todo esto lo v ficado en las siguientes


figuras:

• Ahora si estaremos listos para empezar que le


debemos indicar al JCreator de que nuest proyecto cuenta
con un archivo adicional, que será sobre e aremos trabajando
• Ahora le pondremos un nombre a esta nueva clase y a programar se ha
(hechando código). Para esto, deberá ubicar el puntero del ratón sobre
dicho!!!
el nombre de su proyecto (del lado izquierdo de la ventana).

10.2. Nuestro primer programa… Hola Mundo!!!


• Pulsemos sobre él con el botó o del ratón.

Bien, ahora que sabemos cómo crear un proyecto nuevo en JCreator,


• Aparecerá un submen mos la opción Add.
hagamos un simple programa: el famoso Hola Mundo. Este programa lo
único que hará será escribir por la pantalla del computador la frase "Hola
• Llegado a este rá un submenú aparte, del cual, como
Mundo!!!". Aprenderemos en este apartado a cómo empezar a escribir
Ver 200804 57
Extreme Guide: Usando Java Compilación y ejecución usando JCreator

nuestro código, a compilar un programa, depurar algún error de tipo léxico • Ahora escribimos nuestro código, el c sistirá en utilizar el
y finalmente a ejecutarlo. Para esto, prosigamos en donde quedamos en el método println de la clase táti out , que, como ya
apartado anterior) y haremos lo siguiente: sabemos, es una de las funci permite escribir en el
monitor (la línea de cód bir será algo como:
• Ubiquemos el cursor de edición (se verá sobre el editor como una línea System.out.println("Ho );). Como argumento
semigruesa, de manera vertical y en constante parpadeo) dentro del utilizaremos el literal de cad Mundo!!!", quedando algo como:
cuerpo de la clase recién creada, para a continuación crear nuestro
método principal (que como ya debemos saber, se deberá llamar
main).

NOTA: En la ventana del editor de código fuente veremos que existen


palabras escritas en diversos formatos y estilos. Por ejemplo,
hay algunas líneas en que las palabras aparecen en color
verde, unas azules, otras en negrita y otras normales. Esto no
es más que una ayuda visual para los programadores, para que
a simple vista se conozcan cuales de esas líneas de código son
comentarios, palabras reservadas, literales, etc.

• Luego de haber escrito el método principal pulsaremos la tecla ENTE


Esto lo haremos con el propósito de dejar una línea entre la llave q
abre el cuerpo de la función y lo que empezaremos a escr
de ella:

Ver 200804 58
Extreme Guide: Usando Java Compilación y ejecución usando JCreator

• Como eso es lo único que queremos que haga el programa, lo la línea viene siendo el cursor de la conso
dejaremos así y procederemos a compilarlo. Para esto deberemos
seleccionar del menú principal la opción Build y de allí, cuando se abra 10.3. Hicimos algo… ¿lo perderemo
el submenú, seleccionar el ítem Compile Project (o pulsar la tecla F7).
En caso de existir errores sintácticos y / o léxicos aparecerá una Bien, ahora que ya hemos termi mer programa, podremos
ventana debajo del editor en la cual nos indicará cuántos de ellos hay proceder a guardarlo. Esto signi o estaremos archivando en algún
(ver figura anterior). dispositivo de almacenam or ejemplo, el disco duro, un
disket te, un pendrive, etc o significa que para guardar un proyecto
• Como vemos, no hay errores, ya que nos muestra un mensaje que nos se deberá compilar y e primero. Esto lo podremos hacer en
dice que el proceso de compilación fue completado. cualquier momen ras estemos desarrollando el programa. De
hecho, se s o menos cada tres minutos se guarde lo que se
• Una vez que no tengamos errores en nuestro programa, podremos lleve hecho esguardar la información y evitar el peligro de
ejecutarlo. Para esto seleccionamos en el menú la opción Build y en perderla en una falla eléctrica, o que apaguemos el computador
ella el ítem Execute Project (o pulsamos la tecla F5). Al hacerlo, sin darnos cuenta, etc.
JCreator por defecto tratará de compilar de nuevo el programa,
verificando que no haya habido cambios desde la última vez que se Pa lo que debemos hacer es seleccionar del menú principal la
compiló hasta ese momento. Al no haber errores, pasará a ejecutar el y de allí el ítem Save All.
programita, dando como salida la siguiente pantalla:
ez que hayamos guardado todo, podremos sin cerrar JCreator sin
peligro de pérdida de nuestro código. Para esto seleccionaremos la opción
File del menú y a continuación el ítem Exi t . En caso de que tengamos
algún proyecto abierto y modificado, JCreator se dará cuenta de ello y nos
avisará, antes de cerrarse, de dicha condición, para lo cual deberemos
responderle ante un aviso que él nos hará mediante una ventana
emergente, si lo que queremos hacer es: guardar los archivos modificados
antes de que JCreator se cierre, o que se cierre perdiendo con ello
cualquier cambio que hayamos hecho o cancelar la acción y quedarnos con
el JCreator abierto sin cerrase.

Ahora bien, si alguna vez queremos volver a abrir nuestro proyecto, lo que
debemos hacer será iniciar el JCreator, y a continuación seleccionar desde
el menú principal la opción File y luego el ítem Open Workspace. Al hacer
esto se abrirá un ventana de diálogo en la cual nos pide que le indiquemos
donde y cuál es el archivo del proyecto que queremos abrir. Ubicaremos
• Como vemos, aparece el fondo negro (consola) y en
entonces nuestro proyecto y a continuación le damos al botón Abrir. Listo,
ella la frase "Hola Mu e ue o que nosotros escribimos como
ya tenemos el proyecto listo para ser modificado una vez más.
argumento en l La línea o raya horizontal al final de

Ver 200804 59
Extreme Guide: Usando Java Compilación y ejecución usando JCreator

Terminado todo esto, ya seremos capaces de crear un proyecto (modo


consola), editar algo de código, compilar el código fuente, ejecutar un
programa, guardar el proyecto conjuntamente con los archivos de los
programas que lo conforman, cerrar el entorno de programación y
finalmente cerrar el JCreator.

Ver 200804 60
Extreme Guide: Usando Java Referencias

gratuito, o a precio del coste de la distribuc vés de otros medios;


Referencias sin embargo no es obligatorio que sea así y conserve su carácter
de libre, puede ser vendido comerc
1
El bytecode es un código intermedio más abstracto que el código
máquina. Habi tualmente se lo trata como a un fichero binario que 5
Objective-C es un lenguaje de entado a objetos creado
contiene un programa ejecutable similar a un módulo objeto, que es un como un superconjunto de C e implementase un modelo de
fichero binario que contiene código máquina producido por el compilador. objetos parecido al de Sm mente fue creado por Brad Cox y
El bytecode recibe su nombre porque generalmente cada código de la corporación StepStone En 1988 fue adoptado como lenguaje
operación tiene una longitud de un byte, si bien la longitud del código de de programación de NEXT n 1992 fue liberado bajo licencia GNU
las instrucciones varía. Cada instrucción tiene un código de operación para el compilado ctualmente se usa como lenguaje principal de
entre 0 y 255 seguido de parámetros tales como los registros o las programaci y GNUstep.
direcciones de memoria. Esta sería la descripción de un caso típico, si
bien la especificación del bytecode depende ampliamente del lenguaje. 6
Small talk istema informático que permite realizar tareas de
Como código intermedio, se trata de una forma de salida utilizada por los computación mediante la interacción con un entorno de objetos virtuales.
implementadores de lenguajes para reducir la dependencia respecto del Me mente, se puede considerar que un Smalltalk es un mundo
hardware específico y facilitar la interpretación. Menos frecuentemente vir de viven objetos que se comunican mediante el envío de
se utiliza el bytecode como código intermedio en un compilador. Algunos
sistemas, llamados traductores dinámicos o compiladores just-in-time
traducen el bytecode a código máquina inmediatamente antes de el fue ideado en 1985 por Bert rand Meyer. Es un lenguaje de
ejecución para mejorar la velocidad de ejecución. programación orientado a objetos centrado en la construcción de
sof tware robusto. Su sintaxis es parecida a la del lenguaje de
2
Lenguaje interpretado, es un lenguaje de programación programación Pascal. Una característica que lo distingue del resto de los
diseñado para ser ejecutado por medio de un intérprete, en con lenguajes es que permite el diseño por contrato desde la base, con
los lenguajes compilados. También se les conoce co precondiciones, postcondiciones, invariantes y variantes de bucle,
script . invariantes de clase y asertos. Eiffel es un lenguaje con tipos fuertes,
pero relajado por herencia. Implementa administración automática de
3
La GNU GPL (General Public License o licen ca general) es una memoria, generalmente mediante algoritmos de recolección de basura.
licencia creada por la Free Sof tware Foundati iados de los 80, y Las claves de este lenguaje están recogidas en el libro de Meyer,
está orientada principalmente a protege bre distribución, Construcción de Sof tware Orientado a Objetos.
modificación y uso de sof tware. Su propósito es declarar que el sof tware
cubierto por esta licencia es sof tware libre y protegerlo de intentos de 8
C# es un lenguaje de programación orientado a objetos desarrollado y
apropiación que restrinjan esas lib usuarios. estandarizado por Microsof t como parte de su plataforma .NET, que
después fue aprobado como un estándar por la ECMA e ISO. Su sintaxis
4
Sof tware libre (en inglés free es el sof tware que, una vez básica deriva de C / C++ y utiliza el modelo de objetos de la plataforma
obtenido, puede ser estudiado, modificado y .NET el cual es similar al de Java aunque incluye mejoras derivadas de
redistribuido libre ware libre suele estar disponible otros lenguajes (más notablemente de Delphi y Java). C# fue diseñado
gratuitamente, pe asociar sof tware libre a sof tware
Ver 200804 61
Extreme Guide: Usando Java Referencias

para combinar el control a bajo nivel de lenguajes como C y la velocidad pequeño programa que es utilizado en una HTML y representado
de programación de lenguajes como Visual Basic. por una pequeña pantalla gráfica dentro de

9
J# es un lenguaje transicional para programadores del lenguaje de Por otra parte, la diferencia entre JAVA y un applet radica
programación Java y del lenguaje J++ de Microsof t , creado con la en cómo se ejecutan. Para ca i ón JAVA se utiliza el
intención de que ambos puedan usar sus conocimientos actuales para intérprete de JAVA (pcGRASP urn University, Visual J++ de
crear aplicaciones en la plataforma .NET de Microsof t . J# se supone Microsof t , Forte de Sun d En cambio, un appl et se puede
compatible con Java, tanto a nivel código fuente, como binario. cargar y ejecutar desde c expl orador que soporte JAVA (Netscape
y Explorador de Windows)
10
JavaScript es un lenguaje interpretado, es decir, que no requiere
12
compilación, ut ilizado principalmente en páginas web, con una sintaxis Java Pla se Edit ion o Java EE (anteriormente conocido
semejante a la del lenguaje Java y el lenguaje C. Al contrario que Java, como Java erprise Edition o J2EE hasta la versión 1.4), es
JavaScript no es un lenguaje orientado a objetos propiamente dicho, ya una plataf programación—parte de la Plataforma Java—para
que no dispone de Herencia, es más bien un lenguaje basado en desarrollar y ejecutar sof tware de aplicaciones en Lenguaje de
prototipos, ya que las nuevas clases se generan clonando las clases base pro ón Java con arquitectura de n niveles distribuida, basándose
(prototipos) y extendiendo su funcionalidad. am e en componentes de sof tware modulares ejecutándose sobre
de aplicaciones. La plataforma Java EE está definida por una
11
Un applet es un componente de sof tware que corre en el contexto de ificación. Similar a otras especificaciones del Java Community
otro programa, por ejemplo un navegador web. El applet debe correr ss, Java EE es también considerada informalmente como un estándar
un contenedor, que lo proporciona un programa anfitrión, mediante debido a que los suministradores deben cumplir ciertos requisitos de
plugin, o en aplicaciones como teléfonos móviles que soportan conformidad para declarar que sus productos son conformes a Java EE; no
de programación por applets. A diferencia de un programa, un obstante sin un estándar de ISO o ECMA.
puede correr de manera independiente, ofrece información g
veces interactúa con el usuario, típicamente carece d tiene Java EE incluye varias especificaciones de API, tales como JDBC, RMI, e-
privilegios de seguridad restringidos. Un apple a cabo mail, JMS, Servicios Web, XML, etc y define cómo coordinarlos. Java EE
una función muy específica que carece de uso érmino también configura algunas especificaciones únicas para Java EE para
fue introducido en AppleScript en 1993. componentes. Estas incluyen Enterprise JavaBeans, servlets, portlets
(siguiendo la especificación de Port lets Java), JavaServer Pages y varias
Ejemplos comunes de applets son las Java y las animaciones tecnologías de servicios web. Esto permite al desarrollador crear una
Flash. Otro ejemplo es el Windows Media Player utilizado para desplegar Aplicación de Empresa portable entre plataformas y escalable, a la vez
archivos de video incrustados en los navegadores como el Internet que integrable con tecnologías anteriores. Otros beneficios añadidos son,
Explorer. Otros plugins permiten elos 3D que funcionan con por ejemplo, que el servidor de aplicaciones puede manejar
una applet . transacciones, la seguridad, escalabilidad, concurrencia y gestión de los
componentes desplegados, significando que los desarrolladores pueden
Un applet es un código J un método main, por eso se concentrarse más en la lógica de negocio de los componentes en lugar de
utiliza principalme bajo de páginas web, ya que es un en tareas de mantenimiento de bajo nivel.

Ver 200804 62
Extreme Guide: Usando Java Referencias

13
La plataforma Java 2, Micro Edi tion, o Java ME (anteriormente J2ME),
es una colección de APIs en Java orientadas a productos de consumo
como PDAs, teléfonos móviles o electrodomésticos. Java ME se ha
convertido en una buena opción para crear juegos en teléfonos móviles
debido a que se puede emular en un PC durante la fase de desarrollo y
luego subirlos fácilmente al teléfono. Al utilizar tecnologías Java el
desarrollo de aplicaciones o videojuegos con estas APIs resulta bastante
económico de portar a otros dispositivos.

14
HotJava es un navegador web modular y extensible de Sun
Microsystems que puede ejecutar applets Java. Fue el primer navegador
en soportar applets Java y fue la plataforma de demostración de Sun para
la entonces nueva tecnología. Desde entonces ha sido descontinuado y ya
no es soportado. Como cualquier navegador de Web, HotJava puede
decodificar HTML estándar y URLs estándares, aunque no soporta
completamente el estándar HTML 3.0. La ventaja sobre el resto de
navegadores, sin soporte Java, es que puede ejecutar programas Java
sobre la red. La diferencia con Netscape, es que tiene implementado
completamente los sistemas de seguridad que propone Java, esto signif
que puede escribir y leer en el disco local, aunque esto hace disminuir
seguridad, ya que se pueden grabar en nuestro disco prog
contengan código malicioso e introducirnos un virus, por ej
obstante, el utilizar esta característica de HotJava es de
usuario.

Ver 200804 63

Вам также может понравиться