You are on page 1of 43

PROGRAMACION EN JAVA

Cuando se programa en Java, se coloca todo el cdigo en mtodos, de la misma forma que se escriben funciones en lenguajes como C.

Comentarios
En Java hay tres tipos de comentarios:
// comentarios para una sola lnea /* comentarios de una o ms lneas */ /** comentario de documentacin, de una o ms lneas */

Los dos primeros tipos de comentarios son los que todo programador conoce y se utilizan del mismo modo. Los comentarios de documentacin, colocados inmediatamente antes de una declaracin (de variable o funcin), indican que ese comentario ha de ser colocado en la documentacin que se genera automticamente cuando se utiliza la herramienta de Java, javadoc. Dichos comentarios sirven como descripcin del elemento declarado permitiendo generar una documentacin de nuestras clases escrita al mismo tiempo que se genera el cdigo. En este tipo de comentario para documentacin, se permite la introduccin de algunos tokens o palabras clave, que harn que la informacin que les sigue aparezca de forma diferente al resto en la documentacin.

Identificadores
Los identificadores nombran variables, funciones, clases y objetos; cualquier cosa que el programador necesite identificar o usar. En Java, un identificador comienza con una letra, un subrayado (_) o un smbolo de dlar ($). Los siguientes caracteres pueden ser letras o dgitos. Se distinguen las maysculas de las minsculas y no hay longitud mxima. Seran identificadores vlidos:
identificador nombre_usuario Nombre_Usuario _variable_del_sistema $transaccion

y su uso sera, por ejemplo:


int contador_principal; char _lista_de_ficheros; float $cantidad_en_Ptas;

Palabras clave Las siguientes son las palabras clave que estn definidas en Java y que no se pueden utilizar como indentificadores:
abstract boolean break byte byvalue case catch char class const continue default do double else extends false final finally float for goto if implements import instanceof int interface long native new null package private protected public return short static super switch synchronized this threadsafe throw transient true try void while

Palabras Reservadas Adems, el lenguaje se reserva unas cuantas palabras ms, pero que hasta ahora no tienen un cometido especfico. Son:
cast operator future outer generic rest inner var

Literales
Un valor constante en Java se crea utilizando una representacin literal de l. Java utiliza cinco tipos de elementos: enteros, reales en coma flotante, booleanos, caracteres y cadenas, que se pueden poner en cualquier lugar del cdigo fuente de Java. Cada uno de estos literales tiene un tipo correspondiente asociado con l. Enteros:
byte short int long Por ejemplo: 8 bits 16 bits 32 bits 64 bits 21 077 32 bits 64 bits 3.14 2e12 complemento complemento complemento complemento 0xDC00 IEEE 754 IEEE 754 a dos a dos a dos a dos

Reales en coma flotante:


float double Por ejemplo: 3.1E12

Booleanos:
true false

Caracteres:
Por ejemplo: unicode a \t \u???? [????] es un nmero

Cadenas:
Por ejemplo: "Esto es una cadena literal"

Arrays
Se pueden declarar en Java arrays de cualquier tipo:
char s[]; int iArray[];

Incluso se pueden construir arrays de arrays:


int tabla[][] = new int[4][5];

Los lmites de los arrays se comprueban en tiempo de ejecucin para evitar desbordamientos y la corrupcin de memoria. En Java un array es realmente un objeto, porque tiene redefinido el operador []. Tiene una funcin miembro: length. Se puede utilizar este mtodo para conocer la longitud de cualquier array.
int a[][] = new int[10][3]; a.length; /* 10 */ a[0].length; /* 3 */

Para crear un array en Java hay dos mtodos bsicos. Crear un array vaco:
int lista[] = new int[50];

o se puede crear ya el array con sus valores iniciales:


String nombres[] = { "Juan","Pepe","Pedro","Maria" };

Esto que es equivalente a:


String nombres[]; nombres = new String[4]; nombres[0] = new String( nombres[1] = new String( nombres[2] = new String( nombres[3] = new String( int lista[50]; "Juan" ); "Pepe" ); "Pedro" ); "Maria" );

No se pueden crear arrays estticos en tiempo de compilacin:


// generar un error en tiempo de compilacin

Tampoco se puede rellenar un array sin declarar el tamao con el operador new:
int lista[]; for( int i=0; i < 9; i++ ) lista[i] = i;

Es decir, todos los arrays en Java son estticos. Para convertir un array en el equivalente a un array dinmico en C/C++, se usa la clase vector, que permite operaciones de insercin, borrado, etc. en el array.

Operadores
Los operadores de Java son muy parecidos en estilo y funcionamiento a los de C. En la siguiente tabla aparecen los operadores que se utilizan en Java, por orden de precedencia:

. ++ ! * + << < & && ? : =

[] -~ / >> > ^ || op=

() instanceof % >>> <= | (*= >= == !=

/=

%=

+=

-=

etc.)

Los operadores numricos se comportan como esperamos:


int + int = int

Los operadores relacionales devuelven un valor booleano. Para las cadenas, se pueden utilizar los operadores relacionales para comparaciones adems de + y += para la concatenacin:
String nombre = "nombre" + "Apellido";

El operador = siempre hace copias de objetos, marcando los antiguos para borrarlos, y ya se encargar el garbage collector de devolver al sistema la memoria ocupada por el objeto eliminado.

Separadores
Slo hay un par de secuencias con otros caracteres que pueden aparecer en el cdigo Java; son los separadores simples, que van a definir la forma y funcin del cdigo. Los separadores admitidos en Java son: () - parntesis. Para contener listas de parmetros en la definicin y llamada a mtodos. Tambin se utiliza para definir precedencia en expresiones, contener expresiones para control de flujo y rodear las conversiones de tipo. {} - llaves. Para contener los valores de matrices inicializadas automticamente. Tambin se utiliza para definir un bloque de cdigo, para clases, mtodos y mbitos locales. [] - corchetes. Para declarar tipos matriz. Tambin se utiliza cuando se referencian valores de matriz. ; - punto y coma. Separa sentencias. , - coma. Separa identificadores consecutivos en una declaracin de variables. Tambin se utiliza para encadenar sentencias dentro de una sentencia for. . - punto. Para separar nombres de paquete de subpaquetes y clases. Tambin se utiliza para separar una variable o mtodo de una variable de referencia.

CONTROL DE FLUJO
Muchas de las sentencias de control del flujo del programa se han tomado del C:

Sentencias de Salto
if/else
if( Boolean ) { sentencias; } else { sentencias; }

switch
switch( expr1 ) { case expr2: sentencias; break; case expr3: sentencias; break; default: sentencias; break; }

Sentencias de Bucle
Bucles for
for( expr1 inicio; expr2 test; expr3 incremento ) { sentencias; }

El siguiente trocito de cdigo Java que dibuja varias lneas en pantalla alternando sus colores entre rojo, azul y verde. Este fragmento sera parte de una funcin Java (mtodo):
int contador; for( contador=1; contador <= 12; contador++ ) { switch( contador % 3 ) { case 0: setColor( Color.red ); break; case 1: setColor( Color.blue ); break; case 2: setColor( Color.green ); break;

} g.drawLine( 10,contador*10,80,contador*10 ); }

Tambin se soporta el operador coma (,) en los bucles for


for( a=0,b=0; a < 7; a++,b+=2 )

Bucles while
while( Boolean ) { sentencias; }

Bucles do/while
do { sentencias; }while( Boolean );

Excepciones
try-catch-throw
try { sentencias; } catch( Exception ) { sentencias; }

Java implementa excepciones para facilitar la construccin de cdigo robusto. Cuando ocurre un error en un programa, el cdigo que encuentra el error lanza una excepcin, que se puede capturar y recuperarse de ella. Java proporciona muchas excepciones predefinidas.

Control General del Flujo


break [etiqueta] continue [etiqueta] return expr; etiqueta: sentencia;

En caso de que nos encontremos con bucles anidados, se permite el uso de etiquetas para poder salirse de ellos, por ejemplo:
uno: for( ) { dos: for( ) { continue; continue uno; break uno; } }

// seguira en el bucle interno // seguira en el bucle principal // se saldra del bucle principal

En el cdigo de una funcin siempre hay que ser consecuentes con la declaracin que se

haya hecho de ella. Por ejemplo, si se declara una funcin para que devuelva un entero, es imprescindible que se coloque un return final para salir de esa funcin, independientemente de que haya otros en medio del cdigo que tambin provoquen la salida de la funcin. En caso de no hacerlo se generar un Warning, y el cdigo Java no se puede compilar con Warnings.
int func() { if( a == 0 ) return 1; return 0; // es imprescindible porque se retorna un entero }

CLASES
Las clases son lo ms simple de Java. Todo en Java forma parte de una clase, es una clase o describe como funciona una clase. El conocimiento de las clases es fundamental para poder entender los programas Java. Todas las acciones de los programas Java se colocan dentro del bloque de una clase o un objeto. Todos los mtodos se definen dentro del bloque de la clase, Java no soporta funciones o variables globales. Esto puede despistar a los programadores de C++, que pueden definir mtodos fuera del bloque de la clase, pero esta posibilidad es ms un intento de no separarse mucho y ser compatible con C, que un buen diseo orientado a objetos. As pues, el esqueleto de cualquier aplicacin Java se basa en la definicin de una clase. Todos los datos bsicos, como los enteros, se deben declarar en las clases antes de hacer uso de ellos. En C la unidad fundamental son los ficheros con cdigo fuente, en Java son las clases. De hecho son pocas las sentencias que se pueden colocar fuera del bloque de una clase. La palabra clave import (equivalente al #include) puede colocarse al principio de un fichero, fuera del bloque de la clase. Sin embargo, el compilador reemplazar esa sentencia con el contenido del fichero que se indique, que consistir, como es de suponer, en ms clases.

Tipos de Clases
Hasta ahora slo se ha utilizado la palabra clave public para calificar el nombre de las clases que hemos visto, pero hay tres modificadores ms. Los tipos de clases que podemos definir son: abstract Una clase abstract tiene al menos un mtodo abstracto. Una clase abstracta no se instancia, sino que se utiliza como clase base para la herencia. final

Una clase final se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. Por ejemplo, la clase Math es una clase final. public Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes, primero tienen que ser importadas. synchronizable Este modificador especifica que todos los mtodos definidos en la clase son sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobreescriban.

VARIABLES Y METODOS DE INSTANCIA


Una clase en Java puede contener variables y mtodos. Las variables pueden ser tipos primitivos como int, char, etc. Los mtodos son funciones. Por ejemplo, en el siguiente trozo de cdigo podemos observarlo:
public MiClase { int i; public MiClase() { i = 10; } public void Suma_a_i( int j ) { i = i + j; } }

La clase MiClase contiene una variable (i) y dos mtodos, MiClase que es el constructor de la clase y Suma_a_i( int j ).

Ambito de una variable


Los bloques de sentencias compuestas en Java se delimitan con dos llaves. Las variables de Java slo son vlidas desde el punto donde estn declaradas hasta el final de la sentencia compuesta que la engloba. Se pueden anidar estas sentencias compuestas, y cada una puede contener su propio conjunto de declaraciones de variables locales. Sin embargo, no se puede declarar una variable con el mismo nombre que una de mbito exterior. El siguiente ejemplo intenta declarar dos variables separadas con el mismo nombre. En C y C++ son distintas, porque estn declaradas dentro de mbitos diferentes. En Java, esto es ilegal.

Class Ambito { int i = 1; { int i = 2; } }

// mbito exterior // crea un nuevo mbito // error de compilacin

Mtodos y Constructores
Los mtodos son funciones que pueden ser llamadas dentro de la clase o por otras clases. El constructor es un tipo especfico de mtodo que siempre tiene el mismo nombre que la clase. Cuando se declara una clase en Java, se pueden declarar uno o ms constructores opcionales que realizan la inicializacin cuando se instancia (se crea una ocurrencia) un objeto de dicha clase. Utilizando el cdigo de ejemplo anterior, cuando se crea una nueva instancia de MiClase, se crean (instancian) todos los mtodos y variables, y se llama al constructor de la clase:
MiClase mc; mc = new MiClase();

La palabra clave new se usa para crear una instancia de la clase. Antes de ser instanciada con new no consume memoria, simplemente es una declaracin de tipo. Despus de ser instanciado un nuevo objeto mc, el valor de i en el objeto mc ser igual a 10. Se puede referenciar la variable (de instancia) i con el nombre del objeto:
mc.i++; // incrementa la instancia de i de mc

Al tener mc todas las variables y mtodos de MiClase, se puede usar la primera sintaxis para llamar al mtodo Suma_a_i() utilizando el nuevo nombre de clase mc:
mc.Suma_a_i( 10 );

y ahora la variable mc.i vale 21.

Finalizadores
Java no utiliza destructores (al contrario que C++) ya que tiene una forma de recoger automticamente todos los objetos que se salen del alcance. No obstante proporciona un mtodo que, cuando se especifique en el cdigo de la clase, el reciclador de memoria (garbage collector) llamar:
// Cierra el canal cuando este objeto es reciclado protected void finalize() { close(); }

ALCANCE DE OBJETOS Y RECICLADO DE MEMORIA


Los objetos tienen un tiempo de vida y consumen recursos durante el mismo. Cuando un objeto no se va a utilizar ms, debera liberar el espacio que ocupaba en la memoria de forma que las aplicaciones no la agoten (especialmente las grandes). En Java, la recoleccin y liberacin de memoria es responsabilidad de un thread llamado automatic garbage collector (recolector automtico de basura). Este thread monitoriza el alcance de los objetos y marca los objetos que se han salido de alcance. Veamos un ejemplo:
String s; s = new String( "abc" ); s = "def"; // // // // no se ha asignado todavia memoria asignada se ha asignado nueva memoria (nuevo objeto)

Ms adelante veremos en detalle la clase String, pero una breve descripcin de lo que hace esto es; crear un objeto String y rellenarlo con los caracteres "abc" y crear otro (nuevo) String y colocarle los caracteres "def". En esencia se crean dos objetos:
Objeto String "abc" Objeto String "def"

Al final de la tercera sentencia, el primer objeto creado de nombre s que contiene "abc" se ha salido de alcance. No hay forma de acceder a l. Ahora se tiene un nuevo objeto llamado s y contiene "def". Es marcado y eliminado en la siguiente iteracin del thread reciclador de memoria.

HERENCIA
La Herencia es el mecanismo por el que se crean nuevos objetos definidos en trminos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se puede crear la subclase Pato, que es una especializacin de Ave.
class Pato extends Ave { int numero_de_patas; }

La palabra clave extends se usa para generar una subclase (especializacin) de un objeto. Una Pato es una subclase de Ave. Cualquier cosa que contenga la definicin de Ave ser copiada a la clase Pato, adems, en Pato se pueden definir sus propios mtodos y variables de instancia. Se dice que Pato deriva o hereda de Ave. Adems, se pueden sustituir los mtodos proporcionados por la clase base. Utilizando nuestro anterior ejemplo de MiClase, aqu hay un ejemplo de una clase derivada sustituyendo a la funcin Suma_a_i():
import MiClase; public class MiNuevaClase extends MiClase {

public void Suma_a_i( int j ) { i = i + ( j/2 ); } }

Ahora cuando se crea una instancia de MiNuevaClase, el valor de i tambin se inicializa a 10, pero la llamada al mtodo Suma_a_i() produce un resultado diferente:
MiNuevaClase mnc; mnc = new MiNuevaClase(); mnc.Suma_a_i( 10 );

En Java no se puede hacer herencia mltiple. Por ejemplo, de la clase aparato con motor y de la clase animal no se puede derivar nada, sera como obtener el objeto toro mecnico a partir de una mquina motorizada (aparato con motor) y un toro (aminal). En realidad, lo que se pretende es copiar los mtodos, es decir, pasar la funcionalidad del toro de verdad al toro mecnico, con lo cual no sera necesaria la herencia mltiple sino simplemente la comparticin de funcionalidad que se encuentra implementada en Java a travs de interfaces.

CONTROL DE ACCESO
Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que se quiere para las variables de instancia y los mtodos definidos en la clase: public
public void CualquieraPuedeAcceder(){}

Cualquier clase desde cualquier lugar puede acceder a las variables y mtodos de instacia pblicos. protected
protected void SoloSubClases(){}

Slo las subclases de la clase y nadie ms puede acceder a las variables y mtodos de instancia protegidos. private
private String NumeroDelCarnetDeIdentidad;

Las variables y mtodos de instancia privados slo pueden ser accedidos desde dentro de la clase. No son accesibles desde las subclases. friendly (sin declaracin especfica)
void MetodoDeMiPaquete(){}

Por defecto, si no se especifica el control de acceso, las variables y mtodos de instancia se declaran friendly (amigas), lo que significa que son accesibles por todos los objetos dentro del mismo paquete, pero no por los externos al paquete. Es lo mismo que protected. Los mtodos protegidos (protected) pueden ser vistos por las clases derivadas, como en

C++, y tambin, en Java, por los paquetes (packages). Todas las clases de un paquete pueden ver los mtodos protegidos de ese paquete. Para evitarlo, se deben declarar como private protected, lo que hace que ya funcione como en C++ en donde slo se puede acceder a las variables y mtodos protegidos de las clases derivadas.

VARIABLES Y METODOS ESTATICOS


En un momento determinado se puede querer crear una clase en la que el valor de una variable de instancia sea el mismo (y de hecho sea la misma variable) para todos los objetos instanciados a partir de esa clase. Es decir, que exista una nica copia de la variable de instancia. Se usar para ello la palabra clave static.
class Documento extends Pagina { static int version = 10; }

El valor de la variable version ser el mismo para cualquier objeto instanciado de la clase Documento. Siempre que un objeto instanciado de Documento cambie la variable version, sta cambiar para todos los objetos. De la misma forma se puede declarar un mtodo como esttico, lo que evita que el mtodo pueda acceder a las variables de instancia no estticas:
class Documento extends Pagina { static int version = 10; int numero_de_capitulos; static void annade_un_capitulo() { numero_de_capitulos++; // esto no funciona } static void modifica_version( int i ) { version++; // esto si funciona } }

La modificacin de la variable numero_de_capitulos no funciona porque se est violando una de las reglas de acceso al intentar acceder desde un mtodo esttico a una variable no esttica. Todas las clases que se derivan, cuando se declaran estticas, comparten la misma pgina de variables; es decir, todos los objetos que se generen comparten la misma zona de memoria. Las funciones estticas se usan para acceder solamente a variables estticas.
class UnaClase { int var; UnaClase() { var = 5; } UnaFuncion() { var += 5; } }

En el cdigo anterior, si se llama a la funcin UnaFuncion a travs de un puntero a

funcin, no se podra acceder a var, porque al utilizar un puntero a funcin no se pasa implcitamente el puntero al propio objeto (this). Sin embargo, s se podra acceder a var si fuese esttica, porque siempre estara en la misma posicin de memoria para todos los objetos que se creasen de UnaClase.

this Y super
Al acceder a variables de instancia de una clase, la palabra clave this hace referencia a los miembros de la propia clase. Volviendo al ejemplo de MiClase, se puede aadir otro constructor de la forma siguiente:
public class MiClase { int i; public MiClase() { i = 10; } // Este constructor establece el valor de i public MiClase( int valor ) { this.i = valor; // i = valor } public void Suma_a_i( int j ) { i = i + j; } }

Aqu this.i se refiere al entero i en la clase MiClase. Si se necesita llamar al mtodo padre dentro de una clase que ha reemplazado ese mtodo, se puede hacer referencia al mtodo padre con la palabra clave super:
import MiClase; public class MiNuevaClase extends MiClase { public void Suma_a_i( int j ) { i = i + ( j/2 ); super.Suma_a_i( j ); } }

En el siguiente cdigo, el constructor establecer el valor de i a 10, despus lo cambiar a 15 y finalmente el mtodo Suma_a_i() de la clase padre (MiClase) lo dejar en 25:
MiNuevaClase mnc; mnc = new MiNuevaClase(); mnc.Suma_a_i( 10 );

CLASES ABSTRACTAS
Una de las caractersticas ms tiles de cualquier lenguaje orientado a objetos es la posibilidad de declarar clases que definen como se utiliza solamente, sin tener que implementar mtodos. Esto es muy til cuando la implementacin es especfica para cada usuario, pero todos los usuarios tienen que utilizar los mismos mtodos. Un ejemplo de clase abstracta en Java es la clase Graphics:
public abstract class Graphics { public abstract void drawLine( int x1,int y1,int x2, int y2 );

public abstract void drawOval( int x,int y,int width, int height ); public abstract void drawArc( int x,int y,int width, int height,int startAngle,int arcAngle ); . . . }

Los mtodos se declaran en la clase Graphics, pero el cdigo que ejecutar el mtodo est en algn otro sitio:
public class MiClase extends Graphics { public void drawLine( int x1,int y1,int x2,int y2 ) { <cdigo para pintar lneas -especfico de la arquitectura-> } }

Cuando una clase contiene un mtodo abstracto tiene que declararse abstracta. No obstante, no todos los mtodos de una clase abstracta tienen que ser abstractos. Las clases abstractas no pueden tener mtodos privados (no se podran implementar) ni tampoco estticos. Una clase abstracta tiene que derivarse obligatoriamente, no se puede hacer un new de una clase abstracta. Una clase abstracta en Java es lo mismo que en C++ virtual func() = 0; lo que obliga a que al derivar de la clase haya que implementar forzosamente los mtodos de esa clase abstracta.

INTERFACES
Los mtodos abstractos son tiles cuando se quiere que cada implementacin de la clase parezca y funcione igual, pero necesita que se cree una nueva clase para utilizar los mtodos abstractos. Los interfaces proporcionan un mecanismo para abstraer los mtodos a un nivel superior. Un interface contiene una coleccin de mtodos que se implementan en otro lugar. Los mtodos de una clase son public, static y final. La principal diferencia entre interface y abstract es que un interface proporciona un mecanismo de encapsulacin de los protocolos de los mtodos sin forzar al usuario a utilizar la herencia. Por ejemplo:
public interface VideoClip { // comienza la reproduccion del video void play(); // reproduce el clip en un bucle void bucle(); // detiene la reproduccion void stop(); }

Las clases que quieran utilizar el interface VideoClip utilizarn la palabra implements y

proporcionarn el cdigo necesario para implementar los mtodos que se han definido para el interface:
class MiClase implements VideoClip { void play() { <cdigo> } void bucle() { <cdigo> } void stop() { <cdigo> }

Al utilizar implements para el interface es como si se hiciese una accin de copiar-ypegar del cdigo del interface, con lo cual no se hereda nada, solamente se pueden usar los mtodos. La ventaja principal del uso de interfaces es que una clase interface puede ser implementada por cualquier nmero de clases, permitiendo a cada clase compartir el interfaz de programacin sin tener que ser consciente de la implementacin que hagan las otras clases que implementen el interface.
class MiOtraClase implements VideoClip { void play() { <cdigo nuevo> } void bucle() { <cdigo nuevo> } void stop() { <cdigo nuevo> }

Java proporciona un mecanismo para la llamada a funciones C y C++ desde nuestro cdigo fuente Java. Para definir mtodos como funciones C o C++ se utiliza la palabra clave native.
public class Fecha { int ahora; public Fecha() { ahora = time(); } private native int time(); static { System.loadLibrary( "time" ); } }

Una vez escrito el cdigo Java, se necesitan ejecutar los pasos siguientes para poder integrar el cdigo C o C++: Utilizar javah para crear un fichero de cabecera (.h) Utilizar javah para crear un fichero de stubs, es decir, que contiene la declaracin de las funciones

Escribir el cdigo del mtodo nativo en C o C++, es decir, rellenar el cdigo de la funcin, completando el trabajo de javah al crear el fichero de stubs Compilar el fichero de stubs y el fichero .c en una librera de carga dinmica (DLL en Windows '95 o libXX.so en Unix) Ejecutar la aplicacin con el appletviewer

Ms adelante trataremos en profundidad los mtodos nativos, porque aaden una gran potencia a Java, al permitirle integrar a travs de librera dinmica cualquier algoritmo desarrollado en C o C++, lo cual, entre otras cosas, se utiliza como mtodo de proteccin contra la descompilacin completa del cdigo Java.

PAQUETES
La palabra clave package permite agrupar clases e interfaces. Los nombres de los paquetes son palabras separadas por puntos y se almacenan en directorios que coinciden con esos nombres. Por ejemplo, los ficheros siguientes, que contienen cdigo fuente Java:
Applet.java, AppletContext.java, AppletStub.java, AudioClip.java

contienen en su cdigo la lnea:


package java.applet;

Y las clases que se obtienen de la compilacin de los ficheros anteriores, se encuentran con el nombre nombre_de_clase.class, en el directorio:
java/applet

Import
Los paquetes de clases se cargan con la palabra clave import, especificando el nombre del paquete como ruta y nombre de clase (es lo mismo que #include de C/C++). Se pueden cargar varias clases utilizando un asterisco.
import java.Date; import java.awt.*;

Si un fichero fuente Java no contiene ningn package, se coloca en el paquete por defecto sin nombre. Es decir, en el mismo directorio que el fichero fuente, y la clase puede ser cargada con la sentencia import:
import MiClase;

Paquetes de Java
El lenguaje Java proporciona una serie de paquetes que incluyen ventanas, utilidades, un sistema de entrada/salida general, herramientas y comunicaciones. En la versin actual del JDK, los paquetes Java que se incluyen son: java.applet Este paquete contiene clases diseadas para usar con applets. Hay una clase Applet y tres interfaces: AppletContext, AppletStub y AudioClip. java.awt El paquete Abstract Windowing Toolkit (awt) contiene clases para generar widgets y componentes GUI (Interfaz Grfico de Usuario). Incluye las clases Button, Checkbox, Choice, Component, Graphics, Menu, Panel, TextArea y TextField. java.io El paquete de entrada/salida contiene las clases de acceso a ficheros: FileInputStream y FileOutputStream. java.lang Este paquete incluye las clases del lenguaje Java propiamente dicho: Object, Thread, Exception, System, Integer, Float, Math, String, etc. java.net Este paquete da soporte a las conexiones del protocolo TCP/IP y, adems, incluye las clases Socket, URL y URLConnection. java.util Este paquete es una miscelnea de clases tiles para muchas cosas en programacin. Se incluyen, entre otras, Date (fecha), Dictionary (diccionario), Random (nmeros aleatorios) y Stack (pila FIFO).

REFERENCIAS
Java se asemeja mucho a C y C++. Esta similitud, evidentemente intencionada, es la mejor herramienta para los programadores, ya que facilita en gran manera su transicin a Java. Desafortunadamente, tantas similitudes hacen que no nos paremos en algunas diferencias que son vitales. La terminologa utilizada en estos lenguajes, a veces es la misma, pero hay grandes diferencias subyacentes en su significado. C tiene tipos de datos bsicos y punteros. C++ modifica un poco este panorama y le aade los tipos referencia. Java tambin especifica sus tipos primitivos, elimina cualquier tipo de punteros y tiene tipos referencia mucho ms claros.

Todo este maremgnum de terminologa provoca cierta consternacin, as que vamos a intentar aclarar lo que realmente significa. Conocemos ya ampliamente todos los tipos bsicos de datos: datos base, integrados, primitivos e internos; que son muy semejantes en C, C++ y Java; aunque Java simplifica un poco su uso a los desarrolladores haciendo que el chequeo de tipos sea bastante ms rgido. Adems, Java aade los tipos boolean y hace imprescindible el uso de este tipo booleano en sentencias condicionales.

PUNTEROS Y REFERENCIAS C++


Punteros
C y C++ permiten la declaracin y uso de punteros, que pueden ser utilizados en cualquier lugar. Esta tremenda flexibilidad resulta muy til, pero tambin es la causa de que podamos colgar todo el sistema. La intencin principal en el uso de los punteros es comunicarnos ms directamente con el hardware, haciendo que el cdigo se acelere. Desafortunadamente, este modelo de tan bajo nivel hace que perdamos robustez y seguridad en la programacin y hace muy difciles tareas como la liberacin automtica de memoria, la defragmentacin de memoria, o realizar programacin distribuida de forma clara y eficiente.

Referencias en C++
Las referencias se incorporaron a C++ en un intento de manejar punteros de C de forma ms limpia y segura. Sin embargo, como no elimina los punteros, la verdad es que su propsito lo consigue a medias. Es ms, podramos decir que con las referencias C++, el lenguaje se vuelve ms complicado y no es ms poderoso que antes. Las referencias deben ser inicializadas cuando se declaran y no se pueden alterar posteriormente. Esto permite incrementar la eficiencia en tiempo de ejecucin sobre la solucin basada en punteros, pero es ms por las deficiencias de los punteros que por las ventajas de las referencias.

REFERENCIAS EN JAVA
Las referencias en Java no son punteros ni referencias como en C++. Este hecho crea un poco de confusin entre los programadores que llegan por primera vez a Java. Las referencias en Java son identificadores de instancias de las clases Java. Una referencia dirige la atencin a un objeto de un tipo especfico. No tenemos por qu saber cmo lo hace ni necesitamos saber qu hace ni, por supuesto, su implementacin. Pensemos en una referencia como si se tratase de la llave electrnica de la habitacin de

un hotel. Vamos a utilizar precisamente este ejemplo del Hotel para demostrar el uso y la utilizacin que podemos hacer de las referencias en Java. Primero crearemos la clase Habitacion, implementada en el fichero Habitacion.java, mediante instancias de la cual construiremos nuestro Hotel:
public class Habitacion { private int numHabitacion; private int numCamas; public Habitacion() { habitacion( 0 ); } public Habitacion( int numeroHab ) { habitacion( numeroHab ); } public Habitacion( int numeroHab,int camas ) { habitacion( numeroHab ); camas( camas ); } public synchornized int habitacion() { return( numHabitacion ); } public synchronized void habitacion( int numeroHab ) { numHabitacion = numeroHab; } public synchronized int camas() { return( camas ); } public syncronized void camas( int camas ) { numCamas = camas; } }

El cdigo anterior sera el corazn de la aplicacin. Vamos pues a construir nuestro Hotel creando Habitaciones y asignndole a cada una de ellas su llave electrnica; tal como muestra el cdigo siguiente, Hotel1.java:
public class Hotel1 { public static void main( String args[] ) { Habitacion llaveHab1; Habitacion llaveHab2; llaveHab1 = new Habitacion( 222 ); llaveHab2 = new Habitacion( 1144,3 ); ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^ A B y D C } // paso 1 // pasos 2, 3, 4 y 5

// // }

Para explicar el proceso, dividimos las acciones en los cinco pasos necesarios para poder entrar en nuestra habitacin. Aunque no se incluye, podemos tambin considerar el caso

de que necesitemos un cerrajero, para que cuando perdamos la llave, nos abra la puerta; y que en nuestro caso sera el garbage collector, que recicla la habitacin una vez que se hayan perdido todas las llaves. El primer paso es la creacin de la llave, es decir, definir la variable referencia, por defecto nula. El resto de los pasos se agrupan en una sola sentencia Java. La parte B en el cdigo anterior indica al gerente del Hotel que ya dispone de una nueva habitacin. La parte C llama al decorador de interiores para que "vista" la habitacin segn un patrn determinado, para que no desentonen unas habitaciones con otras y no se pierdan las seas de identidad del hotel. El cdigo electrnico que nos permitir acceder a la habitacin se genera en la parte D, una vez conocido el interior de la habitacin y se programa en la llave en la parte A. Si dejamos el ejemplo real a un lado y nos vamos a lo que ocurre en la ejecucin del cdigo, vemos que el operador new busca espacio para una instancia de un objeto de una clase determinada e inicializa la memoria a los valores adecuados. Luego invoca al mtodo constructor de la clase, proporcionndole los argumentos adecuados. El operador new devuelve una referencia a s mismo, que es inmediatamente asignada a la variable referencia. Podemos tener mltiples llaves para una misma habitacin:
. . . Habitacion llaveHab3,llaveHab4; llaveHab3 = llaveHab1; llaveHab4 = llavehab2;

De este modo conseguimos copias de las llaves. Las habitaciones en s mismas no se han tocado en este proceso. As que, ya tenemos dos llaves para la habitacin 222 y otras dos para la habitacin 1144. Una llave puede ser programada para que funcione solamente con una habitacin en cualquier momento, pero podemos cambiar su cdigo electrnico para que funcione con alguna otra habitacin; por ejemplo, para cambiar una habitacin anteriormente utilizada por un empedernido fumador por otra limpia de olores y con vistas al mar. Cambiemos pues la llave duplicada de la habitacin del fumador (la 222) por la habitacin con olor a sal marina, 1144:
. . . llaveHab3 = llaveHab2;

Ahora tenemos una llave para la habitacin 222 y tres para la habitacin 1144. Mantendremos una llave para cada habitacin en la conserjera, para poder utilizarla como llave maestra, en el caso de que alguien pierda su llave propia. Alguien con la llave de una habitacin puede hacer cambios en ella, y los compaeros que tengan llave de esa misma habitacin, no tendrn conocimiento de esos cambios hasta que vuelvan a entrar en la habitacin. Por ejemplo, vamos a quitar una de las camas de la habitacin, entrando en ella con la llave maestra:
. . .

llaveHab2.camas( 2 );

Ahora cuando los inquilinos entren en la habitacin podrn comprobar el cambio realizado:
. . . llaveHab4.printData();

REFERENCIAS Y ARRAYS
Como en C y C++, Java dispone de arrays de tipos primitivos o de clases. Los arrays en C y C++ son bsicamente un acompaante para los punteros. En Java, sin embargo, son ciudadanos de primera clase. Vamos a expandir nuestro hotel creando todo un ala de habitaciones, Hotel2.java. Crearemos un juego de llaves maestras y luego construiremos las habitaciones:
public class Hotel2 { // Nmero de habitaciones por ala public static final int habPorAla = 12; public static void main( String args[] ) { Habitacion llavesMaestras[]; // paso 1 llavesMaestras = new Habitacion[ habPorAla ]; // pasos 2-5 ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ A B, C, D y E int numPiso = 1; for( int i=0; i < habPorAla; i++ ) // pasos 6-9 llavesMaestras[ i ] = new Habitacion( numPiso * 100 + i, ( 0 == (i%2)) ? 2 : 1 ); for( int i=0; i < habPorAla; i++ ) // pasos 10-11 llavesMaestras[i].printData(); } }

// //

Cada paso en el ejemplo es semejante al que ya vimos antes. El paso 1 especifica que el juego de llaves maestras es un grupo de llaves de habitaciones. Los pasos 2 a 5 son, en este caso, la parte principal. En lugar de crear una habitacin, el gerente ordena construir un grupo contiguo de habitaciones. El nmero de llaves se especifica entre corchetes y todas se crean en blanco. Los pasos 6 a 9 son idnticos a los pasos 2 a 5 del ejemplo anterior, excepto en que en este caso todas las llaves pasan a formar parte del juego maestro. Los nmeros de piso se dan en miles para que cuando se creen las habitaciones, todas tengan el mismo formato. Tambin todas las habitaciones de nmero par tienen una sola cama, mientras que las habitaciones impares tendrn dos camas. Los pasos 10 y 11 nos permiten obtener informacin de cada una de las habitaciones.

REFERENCIAS Y LISTAS
Hay gente que piensa que como Java no dispone de punteros, resulta demasiado complejo construir listas enlazadas, rboles binarios y grafos. Vamos a demostrar que quien as

piense est bastante equivocado. Retomemos el ejemplo de los arrays, y en vez de stos vamos a usar una lista doblemente enlazada. El paquete de la lista simple se compone de dos clases. Cada elemento de la lista es un NodoListaEnlazada, NodoListaEnlazada.java:
public class NodoListaEnlazada { private NodoListaEnlazada siguiente; private NodoListaEnlazada anterior; private Object datos; // . . . }

Cada NodoListaEnlazada contiene una referencia a su nodo precedente en la lista y una referencia al nodo que le sigue. Tambin contiene una referencia genrica a cualquier clase que se use para proporcionar acceso a los datos que el usuario proporcione. La lista enlazada, ListaEnlazada.java, contiene un nodo principio-fin y un contador para el nmero de nodos en la lista:
public class ListaEnlazada { public NodoListaEnlazada PrincipioFin; private int numNodos; // . . . }

El nodo especial PrincipioFin es sencillo, para simplificar el cdigo. El contador se usa para optimizar los casos ms habituales. Revisemos pues el cdigo de nuestro Hotel, ahora Hotel3.java, que ser prcticamente el mismo que en el caso de los arrays:
public class Hotel3 { // Nmero de habitaciones por ala public static final int habPorAla = 12; public static void main( String args[] ) { ListaEnlazada llaveMaestra; llaveMaestra = new ListaEnlazada(); // paso 1 // pasos 2-5

int numPiso = 1; for( int i=0; i < habPorAla; i++ ) // pasos 6-9 llaveMaestra.insertAt( i, new Habitacion( numPiso * 100 + i, ( 0 == (i%2)) ? 2 : 1 ); for( int i=0; i < habPorAla; i++ ) // pasos 10-12 ( (Habitacion)llaveMaestra.getAt(i) ).printData(); }

El paso 1 es la llave maestra de la lista. Est representada por una lista genrica; es decir, una lista de llaves que cumple la convencin que nosotros hemos establecido. Podramos acelerar el tiempo de compilacin metiendo la lista genrica ListaEnlazada dentro de una ListaEnlazadaHabitacion. Los pasos 2 a 5 son equivalentes a los del primer ejemplo. Construimos e inicializamos

una nueva ListaEnlazada, que usaremos como juego de llaves maestras. Los pasos 6 a 9 son funcionalmente idnticos a los del ejemplo anterior con arrays, pero con diferente sintaxis. En Java, los arrays y el operador [] son internos del lenguaje. Como Java no soporta la sobrecarga de operadores por parte del usuario, tenemos que usarlo siempre en su forma normal. La ListaEnlazada proporciona el mtodo insertAt() que coge el ndice en la lista, donde el nuevo nodo ha de ser insertado, como primer argumento. El segundo argumento es el objeto que ser almacenado en la lista. Obsrvese que no es necesario colocar moldeo alguno para hacer algo a una clase descendiente que depende de uno de sus padres. Los pasos 10 a 12 provocan la misma salida que los pasos 10 y 11 del ejemplo con arrays. El paso 10 coge la llave del juego que se indica en el mtodo getAt(). En este momento, el sistema no sabe qu datos contiene la llave, porque el contenido de la habitacin es genrico. Pero nosotros s sabemos lo que hay en la lista, as que informamos al sistema haciendo un moldeado a la llave de la habitacin (este casting generar un chequeo en tiempo de ejecucin por el compilador, para asegurarse de que se trata de una Habitacion). El paso 12 usa la llave para imprimir la informacin.

PUNTEROS C/C++ Y REFERENCIAS JAVA


Ahora que ya sabemos un poco ms sobre las referencias en Java, vamos a compararlas con los punteros de C y C++. Los punteros en C y C++ estn orientados hacia un modelo fsico de funcionamiento. Es decir, que el modelo de punteros se mapea directamente sobre el modelo hardware. Este modelo asume cosas como el no movimiento, lo que hace que mecanismos como la liberacin automtica resulten mucho menos eficientes o simplemente imposibles. Cosas como la distribucin en redes y la persistencia de objetos son muy difciles de conseguir en C y C++. Aunque no hay implementaciones en Java, por ahora, para la persistencia y la distribucin, la caracterstica opaca de las referencias en Java hace que el soporte para estas prestaciones sea mucho ms simple. C y C++ permiten el uso de punteros de tal forma que podemos corromper el sistema, cosa que no puede suceder con las referencias en Java. Cualquier intento de hacer esto sera abortado por el compilador o por el sistema en ejecucin (lanzando una excepcin). C y C++ dejan la proteccin de memoria al sistema operativo, que solamente tiene el recurso de generar un error del sistema cuando un puntero accede a una posicin no vlida. Por el contrario, con el uso de las referencias, Java nos protege contra nuestras propias tendencias autodestructivas. El depurador de Java, jdb es un depurador de lnea de comandos, similar al que Sun proporciona en sus Sistemas, dbx. Es complicado de utilizar y un tanto crptico, por lo que, en principio, tiene escasa practicidad y es necesaria una verdadera emergencia para tener que recurrir a l.

Trataremos por encima los comandos que proporciona el jdb, pero sin entrar en detalles de su funcionamiento, porque no merece la pena. Casi es mejor esperar a disponer de herramientas visuales para poder depurar con cierta comodidad nuestro cdigo Java. Para poder utilizar el depurador, las aplicaciones Java deben estar compiladas con la opcin de depuracin activada, -g. Posteriormente se puede lanzar appletviewer con la opcin de depuracin, debug, y habremos puesto en marcha jdb.

Depurar HolaMundo
Hemos modificado nuestro applet de ejemplo para utilizarlo en nuestra sesin de ejemplo con el depurador. Se compilara con el comando:
%javac -g hm.java

y el contenido de nuestro applet HolaMundo modificado y guardado en el fichero hm.java sera el siguiente:
// // Applet HolaMundo de ejemplo, para depurar // import java.awt.Graphics; import java.applet.Applet; public class hm extends Applet { int i; public void paint( Graphics g ) { i = 10; g.drawString( "Hola Mundo!",25,25 ); } }

Una vez compilado, iniciamos la sesin lanzando el visor de applets de Sun con la opcin de depuracin, utilizando el comando:
%appletviewer -debug hm.html

El fichero hm.html contiene las lneas mnimas para poder activar el applet, estas lneas son las que reproducimos:
<html> <applet code=hm.class width=100 height=100> </applet> </html>

Se inicia pues la sesin con el depurador y vamos a ir reproduciendo lo que aparece en la pantalla a medida que vamos introduciendo comandos:
%appletviewer -debug hm.html Loading jdb... 0xee301bf0:class(sun.applet.AppletViewer) >

Comando help
El comando help proporciona una lista de los comandos que estn disponibles en la sesin de jdb. Esta lista es la que sigue, en donde hemos aprovechado la presencia de todos los comandos para comentar la accin que cada uno de ellos lleva a cabo.
>help ** command list ** threads [threadgroup] -- lista threads thread <thread id> -- establece el thread por defecto suspend [thread id(s)] -- suspende threads (por defecto, todos) resume [thread id(s)] -- contina threads (por defecto, todos) where [thread id]|all -- muestra la pila de un thread threadgroups -- lista los grupos de threads threadgroup <name> -- establece el grupo de thread actual print <id> [id(s)] -- imprime un objeto o campo dump <id> [id(s)] -- imprime toda la informacin del objeto locals --

imprime las variables locales de la pila actual de una clase

classes -- lista las clases conocidas methods <class id> -- lista los mtodos

stop in <class id>.<method> -- fija un punto de ruptura en un mtodo stop at <class id>:<line> -- establece un punto de ruptura en una lnea up [n frames] -- ascender en la pila de threads down [n frames] -- descender en la pila de threads clear <class id>:<line> -- eliminar un punto de ruptura step -- ejecutar la lnea actual cont -- continuar la ejecucin desde el punto de ruptura catch <class id> -- parar por la excepcin especificada ignore <class id> -- ignorar la excepcin especificada list [line number] -- imprimir cdigo fuente use [source file path] -- ver o cambiar la ruta del fichero memory -- informe del uso de la memoria load <classname> - carga la clase Java a ser depurada run <args> - comienza la ejecucin de la clase cargada !! - repite el ltimo comando help (or ?) - lista los comandos exit (or quit) - salir del depurador >

fuente

Comando threadgroups
El comando threadgroups permite ver la lista de threads que se estn ejecutando. Los grupos system y main deberan estar siempre corriendo.
>threadgroups 1.(java.lang.ThreadGroup)0xee300068 system 2.(java.lang.ThreadGroup)0xee300a98 main >

Comando threads
El comando threads se utiliza para ver la lista completa de los threads que se estn ejecutando actualmente.
>threads Group system: 1.(java.lang.Thread)0xee300098 clock handler cond 2.(java.lang.Thread)0xee300558 Idle thread run 3.(java.lang.Thread)0xee3005d0 sync Garbage Collector cond 4.(java.lang.Thread)0xee300620 Finalizer thread cond 5.(java.lang.Thread)0xee300a20 Debugger agent run 6.(java.tools.debug.BreakpointHandler)0xee300b58) Breakpoint handler cond Group main: 7.(java.lang.Thread)0xee300048 main suspended >

Comando run
El comando run es el que se utiliza para arrancar el appletviewer en la sesin de depuracin. Lo teclearemos y luego volveremos a listar los threads que hay en ejecucin.
>run run sun.applet.AppletViewer hm.html running... main[1]threads threads Group sun.applet.AppletViewer.main: 1.(java.lang.Thread)0xee3000c0 AWT-Motif running 2.(sun.awt.ScreenUpdater)0xee302ed0 ScreenUpdater cond. Waiting Group applet-hm.class: 3.(java.lang.Thread)0xee302f38 Thread-6 cond. Waiting main[1]

El visor de applets de Sun aparecer en la pantalla y mostrar el conocido mensaje de saludo al Mundo. Ahora vamos a rearrancar el appletviewer con un punto de ruptura, para detener la ejecucin del applet, y podamos seguir mostrando los comandos disponibles en el jdb.
main[1]exit %appletviewer -debug hm.html Loading jdb...

0xee3009c8:class(sun.applet.AppletViewer) >stop in hm.paint Breakpoint set in hm.paint >run run sun.applet.AppletViewer hm.html running... Breakpoint hit: hm.paint(hm.java:9) AWT-Motif[1]

Comando where
El comando where mostrar la pila de ejecucin del applet.
AWT-Motif[1]where [1]hm.paint(hm.java:9) [2]sun.awt.motif.MComponentPeer.paint(MComponenetPeer.java:109) [3]sun.awt.motif.MComponentPeer.handleExpose(MComponenetPeer.java:170) AWT-Motif[1]

Comando use
El comando use nos informa del camino donde jdb va a buscar los ficheros fuentes que contienen el cdigo Java de las clases que se estn depurando. Por defecto, utilizar el camino que se especifique en la variable de entorno CLASSPATH.
AWT-Motif[1]use /usr/local/java/classes: AWT-Motif[1]

Comando list
El comando list mostrar el cdigo fuente actual al comienzo del punto de ruptura que hayamos fijado.
AWT-Motif[1]list 9 public void paint( Graphics g ) { 10 => i = 10; 11 g.drawString( "Hola Mundo!",25,25 ) ; 12 } 13 } AWT-Motif[1]

Comando dump
El comando dump nos permitir ahora ver el valor del objeto g pasado desde el
appletviewer. AWT-Motif[1]dump g g = (sun.awt.motif.X11Graphics)0xee303df8 { int pData = 1342480

} AWT-Motif[1]

Color foreground = (java.awt.Color)0xee302378 Font font = (java.awt.Font)0xee302138 int originX = 0 int originY = 0 float scaleX = 1 float scaleY = 1 Image image = null

Comando step
El comando step nos porporciona el mtodo para ejecutar la lnea actual, que estar siendo apuntada por el indicador si hemos utilizado el comando list. AWT-Motif[1]step Breakpoint hit: hm.paint(hm.java:11) AWT-Motif[1]list 9 public void paint( Graphics g ) { 10 i = 10; 11 => g.drawString( "Hola Mundo!",25,25 ); 12 } 13 } AWT-Motif[1]

LA CLASE Math
La clase Math representa la librera matemtica de Java. Las funciones que contiene son las de todos los lenguajes, parece que se han metido en una clase solamente a propsito de agrupacin, por eso se encapsulan en Math, y lo mismo sucede con las dems clases que corresponden a objetos que tienen un tipo equivalente (Character, Float, etc.). El constructor de la clase es privado, por los que no se pueden crear instancias de la clase. Sin embargo, Math es public para que se pueda llamar desde cualquier sitio y static para que no haya que inicializarla.

Funciones matemticas
Si se importa la clase, se tiene acceso al conjunto de funciones matemticas estndar:
Math.abs( x ) para int, Math.sin( double ) Math.cos( double ) Math.tan( double ) Math.asin( double ) Math.acos( double ) Math.atan( double )

long, float y double

Math.atan2( double,double ) Math.exp( double ) Math.log( double ) Math.sqrt( double ) Math.ceil( double ) Math.floor( double ) Math.rint( double ) Math.pow( a,b ) Math.round( x ) para double y float Math.random() devuelve un double Math.max( a,b ) para int, long, float Math.min( a,b ) para int, long, float Math.E para la base exponencial Math.PI para PI

y double y double

He aqu un ejemplo, Mates.java, de uso de algunas funciones de la clase Math:


class Mates { public static void main( String args[] ) { int x; double rand,y,z; float max; rand = Math.random(); x = Math.abs( -123 ); y = Math.round( 123.567 ); z = Math.pow( 2,4 ); max = Math.max( (float)1e10,(float)3e9 ); System.out.println( System.out.println( System.out.println( System.out.println( System.out.println( } } rand ); x ); y ); z ); max );

LA CLASE Character
Al trabajar con caracteres se necesitan muchas funciones de comprobacin y traslacin. Estas funciones estn empleadas en la clase Character. De esta clase s que se pueden crear instancias, al contrario que sucede con la clase Math.

Declaraciones
La primera sentencia crear una variable carcter y la segunda un objeto Character:
char c; Character C;

Comprobaciones booleanas
Character.isLowerCase( c ) Character.isUpperCase( c ) Character.isDigit( c ) Character.isSpace( c )

En este caso, si tuvisemos un objeto Character C, no se podra hacer C.isLowerCase, porque no se ha hecho un new de Character. Estas funciones son estticas y no conocen al objeto, por eso hay que crealo antes.

Traslaciones de caracteres
char c2 = Character.toLowerCase( c ); char c2 = Character.toUpperCase( c );

Traslaciones de carcter/dgito
int i = Character.digit( c,base ); char c = Character.forDigit( i,base );

Mtodos de la clase Character


C = new Character( 'J' ); char c = C.charValue(); String s = C.toString();

LA CLASE Float
Cada tipo numrico tiene su propia clase de objetos. As el tipo float tiene el objeto Float. De la misma forma que con la clase Character, se han codificado muchas funciones tiles dentro de los mtodos de la clase Float.

Declaraciones
La primera sentencia crear una variable float y la segunda un objeto Float:
float f; Float F;

Valores de Float
Float.POSITIVE_INFINITY Float.NEGATIVE_INFINITY Float.NaN Float.MAX_VALUE Float.MIN_VALUE

Conversiones de Clase/Cadena
String s = Float.toString( f ); f = Float.valueOf( "3.14" );

Comprobaciones
boolean b = Float.isNaN( f ); boolean b = Float.isInfinite( f );

La funcin isNaN() comprueba si f es un No-Nmero. Un ejemplo de no-nmero es raiz cuadrada de -2.

Conversiones de Objetos
Float F = new Float( Float.PI ); String s = F.toString(); int i = F.intValue(); long l = F.longValue(); float F = F.floatValue(); double d = F.doubleValue();

Otros Mtodos
int i = boolean int i = float f F.hashCode(); b = F.equals( Object obj ); Float.floatToIntBits( f ); = Float.intBitsToFloat( i );

LA CLASE Double
Cada tipo numrico tiene su propia clase de objetos. As el tipo double tiene el objeto Double. De la misma forma que con la clase Character, se han codificado muchas funciones tiles dentro de los mtodos de la clase Double.

Declaraciones
La primera sentencia crear una variable double y la segunda un objeto Double:
double d; Double D;

Valores de Double
Double.POSITIVE_INFINITY Double.NEGATIVE_INFINITY Double.NaN Double.MAX_VALUE Double.MIN_VALUE

Mtodos de Double
D.isNaN(); Double.isNaN( d ); D.isInfinite(); Double.isInfinite( d ); boolean D.equals(); String D.toString(); int D.intValue(); long D.longValue(); float D.floatValue(); double D.doubleValue(); int i = D.hashCode(); Double V.valueOf( String s ); long l = Double.doubleToLongBits( d ); double d = Double.longBitsToDouble( l );

LA CLASE Integer
Cada tipo numrico tiene su propia clase de objetos. As el tipo int tiene el objeto Integer. De la misma forma que con la clase Character, se han codificado muchas funciones

tiles dentro de los mtodos de la clase Integer.

Declaraciones
La primera sentencia crear una variable int y la segunda un objeto Integer:
int i; Integer I;

Valores de Integer
Integer.MIN_VALUE; Integer.MAX_VALUE;

Mtodos de Integer
String Integer.toString( int i,int base ); String Integer.toString( int i ); int I.parseInt( String s,int base ); int I.parseInt( String s ); Integer Integer.valueOf( String s,int base ); Integer Integer.valueOf( String s ); int I.intValue(); long I.longValue(); float I.floatValue(); double I.doubleValue(); String I.toString(); int I.hashCode(); boolean I.equals( Object obj );

En los mtodos toString(), parseInt() y valueOf() que no se especifica la base sobre la que se trabaja, se asume que es base 10.

LA CLASE Long
Cada tipo numrico tiene su propia clase de objetos. As el tipo long tiene el objeto Long. De la misma forma que con la clase Character, se han codificado muchas funciones tiles dentro de los mtodos de la clase Long.

Declaraciones
La primera sentencia crear una variable long y la segunda un objeto Long:
long l; Long L;

Valores de Long
Long.MIN_VALUE; Long.MAX_VALUE;

Mtodos de Long
String Long.toString( long l,int base ); String Long.toString( long l ); long L.parseLong( String s,int base ); long L.parseLong( String s ); Long Long.valueOf( String s,int base ); Long Long.valueOf( String s ); int L.intValue(); long L.longValue(); float L.floatValue(); double L.doubleValue(); String L.toString(); int L.hashCode(); boolean L.equals( Object obj );

En los mtodos toString(), parseInt() y valueOf() que no se especifica la base sobre la que se trabaja, se asume que es base 10.

LA CLASE Boolean
Los valores boolean tambin tienen su tipo asociado Boolean, aunque en este caso hay menos mtodos implementados que para el resto de las clases numricas.

Declaraciones
La primera sentencia crear una variable boolean y la segunda un objeto Boolean:

boolean b; Boolean B;

Valores de Boolean
Boolean.TRUE; Boolean.FALSE;

Mtodos de Boolean
boolean B.booleanValue(); String B.toString(); boolean B.equals( Object obj );

LA CLASE String
Java posee gran capacidad para el manejo de cadenas dentro de sus clases String y StringBuffer. Un objeto String representa una cadena alfanumrica de un valor constante que no puede ser cambiada despus de haber sido creada. Un objeto StringBuffer representa una cadena cuyo tamao puede variar. Los Strings son objetos constantes y por lo tanto muy baratos para el sistema. La mayora de las funciones relacionadas con cadenas esperan valores String como argumentos y devuelven valores String. Hay que tener en cuenta que las funciones estticas no consumen memoria del objeto, con lo cual es ms conveniente usar Character que char. No obstante, char se usa, por ejemplo, para leer ficheros que estn escritos desde otro lenguaje. Existen muchos constructores para crear nuevas cadenas:
String(); String( String str ); String( char val[] ); String( char val[],int offset,int count ); String( byte val[],int hibyte ); String( byte val[],int hibyte,int offset,int count );

Tal como uno puede imaginarse, las cadenas pueden ser muy complejas, existiendo muchas funciones muy tiles para trabajar con ellas y, afortunadamente, la mayora estn codificadas en la clase String.

Funciones Bsicas
La primera devuelve la longitud de la cadena y la segunda devuelve el carcter que se encuentra en la posicin que se indica en indice:
int length(); char charAt( int indice );

Funciones de Comparacin de Strings


boolean equals( Object obj ); boolean equalsIgnoreCase( Object obj );

Lo mismo que equals() pero no tiene en cuenta maysculas o minsculas.


int compareTo( String str2 );

Devuelve un entero menor que cero si la cadena es lxicamente menor que str2. Devuelve cero si las dos cadenas son lxicamente iguales y un entero mayor que cero si la cadena es lxicamente mayor que str2.

Funciones de Comparacin de Subcadenas


boolean regionMatch( int thisoffset,String s2,int s2offset,int len ); boolean regionMatch( boolean ignoreCase,int thisoffset,String s2, int s2offset,int 1 );

Comprueba si una regin de esta cadena es igual a una regin de otra cadena.
boolean startsWith( String prefix ); boolean startsWith( String prefix,int offset ); boolean endsWith( String suffix );

Devuelve si esta cadena comienza o termina con un cierto prefijo o sufijo comenzando en un determinado desplazamiento.
int int int int int int int int indexOf( int ch ); indexOf( int ch,int fromindex ); lastIndexOf( int ch ); lastIndexOf( int ch,int fromindex ); indexOf( String str ); indexOf( String str,int fromindex ); lastIndexOf( String str ); lastIndexOf( String str,int fromindex );

Devuelve el primer/ltimo ndice de un carcter/cadena empezando la bsqueda a partir de un determinado desplazamiento.


String substring( int beginindex );

String String String String String String

substring( int beginindex,int endindex ); concat( String str ); replace( char oldchar,char newchar ); toLowerCase(); toUpperCase(); trim();

Ajusta los espacios en blanco al comienzo y al final de la cadena.


void getChars( int srcBegin,int srcEnd,char dst[],int dstBegin ); void getBytes( int srcBegin,int srcEnd,byte dst[],int dstBegin ); String toString(); char toCharArray(); int hashCode();

Funciones ValueOf
La clase String posee numerosas funciones para transformar valores de otros tipos de datos a su representacin como cadena. Todas estas funciones tienen el nombre de valueOf, estando el mtodo sobrecargado para todos los tipos de datos bsicos. Veamos un ejemplo de su utilizacin:
String Uno = new String( "Hola Mundo" ); float f = 3.141592; String PI = Uno.valueOf( f ); String PI = String.valueOf( f ); // Mucho ms correcto

Funciones de Conversin
String valueOf( boolean b ); String valueOf( int i ); String valueOf( long l ); String valueOf( float f ); String valueOf( double d ); String valueOf( Object obj ); String valueOf( char data[] ); String valueOf( char data[],int offset,int count ); Usa arrays de caracteres para la cadena. String copyValueOf( char data[] ); String copyValueOf( char data[],int offset,int count ); Crea un nuevo array equivalente para la cadena.

LA CLASE StringBuffer
Java posee gran capacidad para el manejo de cadenas dentro de sus clases String y StringBuffer. Un objeto String representa una cadena alfanumrica de un valor constante

que no puede ser cambiada despus de haber sido creada. Un objeto StringBuffer representa una cadena cuyo tamao puede variar. La clase StringBuffer dispone de muchos mtodos para modificar el contenido de los objetos StringBuffer. Si el contenido de una cadena va a ser modificado en un programa, habr que sacrificar el uso de objetos String en beneficio de StringBuffer, que aunque consumen ms recursos del sistema, permiten ese tipo de manipulaciones. Al estar la mayora de las caractersticas de los StringBuffers basadas en su tamao variable, se necesita un nuevo mtodo de creacin:
StringBuffer(); StringBuffer( int len ); StringBuffer( String str );

Se puede crear un StringBuffer vaco de cualquier longitud y tambin se puede utilizar un String como punto de partida para un StringBuffer.
StringBuffer Dos = new StringBuffer( 20 ); StringBuffer Uno = new StringBuffer( "Hola Mundo" );

Cambio de Tamao
El cambio de tamao de un StringBuffer necesita varias funciones especficas para manipular el tamao de las cadenas:
int length(); char charAt( int index ); void getChars( int srcBegin,int srcEnd,char dst[],int dstBegin ); String toString(); void setLength( int newlength ); void setCharAt( int index,char ch ); int capacity(); void ensureCapacity( int minimum ); void copyWhenShared();

Obervar que una de las funciones devuelve una cadena constante normal de tipo String. Este objeto se puede usar con cualquier funcin String, como por ejemplo, en las funciones de comparacin.

Modificacin del Contenido


Para cambiar el contenido de un StringBuffer, se pueden utilizar dos mtodos: append() e insert(). En el ejemplo CadAppend.java, vemos el uso de estos dos mtodos:
class CadAppend {

public static void main( String args[] ) { StringBuffer str = new StringBuffer( "Hola" ); str.append( " Mundo" ); System.out.println( str ); } }

En este otro ejemplo, CadInversa.java, mostramos un mtodo muy simple que le da la vuelta a una cadena:
class CadInversa { public static String cadenaInversa( String fuente ) { int longitud = fuente.length(); StringBuffer destino = new StringBuffer( longitud ); for( int i=(longitud-1); i >= 0; i-- ) destino.append( fuente.charAt( i ) ); return( destino.toString() ); } public static void main( String args[] ) { System.out.println( cadenaInversa( "Hola Mundo" ) ); } }

Las funciones que cambian el tamao son pues:


StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer append( append( append( append( append( append( append( append( append( append( insert( insert( insert( insert( insert( insert( insert( insert( insert( Object obj ); String str ); char str[] ); char str[],int offset,int len ); boolean b ); int i ); long l ); float f ); double d ); char ch ); int offset,Object obj ); int offset,String str ); int offset,char str[] ); int offset,boolean b ); int offset,int i ); int offset,long l ); int offset,float f ); int offset,double d ); int offset,char ch );

Operadores de Concatenacin
Hay que recordar que los operadores "+" y "+=" tambin se pueden aplicar a cadenas. Ambos realizan una concatenacin y estn implementados con objetos StringBuffer. Por ejemplo, la sentencia:

String s = "Qu" + " tal ?";

es interpretada por el compilador como:


String s = new StringBuffer().append( "Qu" ).append( " tal ?" ).toString();

y se marcara el StringBuffer para borrarlo ya que el contenido pasa al objeto String. Tambin, la sentencia:
s += " por ah!";

sera interpretada por el sistema como:


String s = new StringBuffer().append( s ).append( " por ah!" ).toString();

y volvera a marcar para borrar el nuevo StringBuffer.

USO DE CONVERSIONES
Veamos un ejemplo de utilidad de estas funciones. En el applet Conversion.java, que se muestra en el cdigo que sigue, se usan estas funciones para producir una salida til en un programa, presentando las coordenadas en las que se ha hecho click con el botn del ratn.
public class Conversion extends Applet { int RatonX = 25; int RatonY = 25; String Status = "Haz click con el ratn"; public void paint( Graphics g ) { g.drawString( Status,RatonX,RatonY ); } public boolean mouseDown( Event evt,int x,int y ) { Integer X = new Integer( x ); Integer Y = new Integer( y ); RatonX = x; RatonY = y; Status = X.toString()+","+Y.toString(); repaint(); return true; }

Introduccin al AWT
AWT es el acrnimo del X Window Toolkit para Java, donde X puede ser cualquier cosa: Abstract, Alternative, Awkward, Another o Asqueroso; aunque parece que Sun se decanta por Abstracto, seriedad por encima de todo. Se trata de una biblioteca de clases Java para

el desarrollo de Interfaces de Usuario Grficas. La versin del AWT que Sun proporciona con el JDK se desarroll en slo dos meses y es la parte ms dbil de todo lo que representa Java como lenguaje. El entorno que ofrece es demasiado simple, no se han tenido en cuenta las ideas de entornos grficos novedosos, sino que se ha ahondado en estructuras orientadas a eventos, llenas de callbacks y sin soporte alguno del entorno para la construccin grfica; veremos que la simple accin de colocar un dibujo sobre un botn se vuelve una tarea harto complicada. Quiz la presin de tener que lanzar algo al mercado haya tenido mucho que ver en la pobreza de AWT. JavaSoft, asegura que esto slo era el principio y que AWT ser multi-idioma, tendr herramientas visuales, etc. En fin, al igual que dicen los astrlogos, el futuro nos deparar muchas sorpresas. La estructura bsica del AWT se basa en Componentes y Contenedores. Estos ltimos contienen Componentes posicionados a su respecto y son Componentes a su vez, de forma que los eventos pueden tratarse tanto en Contenedores como en Componentes, corriendo por cuenta del programador (todava no hay herramientas de composicin visual) el encaje de todas las piezas, as como la seguridad de tratamiento de los eventos adecuados. Nada trivial. No obstante y pese a ello, vamos a abordar en este momento la programacin con el AWT para tener la base suficiente y poder seguir profundizando en las dems caractersticas del lenguaje Java, porque como vamos a ir presentando ejemplos grficos es imprescindible el conocimiento del AWT. Mientras tanto, esperemos que JavaSoft sea fiel a sus predicciones y lo que ahora veamos nos sirva de base para migrar a un nuevo y maravilloso AWT.

INTERFACE DE USUARIO
La interface de usuario es la parte del programa que permite a ste interactuar con el usuario. Las interfaces de usuario pueden adoptar muchas formas, que van desde la simple lnea de comandos hasta las interfaces grficas que proporcionan las aplicaciones ms modernas. La interface de usuario es el aspecto ms importante de cualquier aplicacin. Una aplicacin sin un interfaz fcil, impide que los usuarios saquen el mximo rendimiento del programa. Java proporciona los elementos bsicos para construir decentes interfaces de usuario a travs del AWT. Al nivel ms bajo, el sistema operativo transmite informacin desde el ratn y el teclado como dispositivos de entrada al programa. El AWT fue diseado pensando en que el programador no tuviese que preocuparse de detalles como controlar el movimiento del ratn o leer el teclado, ni tampoco atender a detalles como la escritura en pantalla. El AWT constituye una librera de clases orientada a objeto para cubrir estos recursos y servicios de bajo nivel. Debido a que el lenguaje de programacin Java es independiente de la plataforma en que

se ejecuten sus aplicaciones, el AWT tambin es independiente de la plataforma en que se ejecute. El AWT proporciona un conjunto de herramientas para la construccin de interfaces grficas que tienen una apariencia y se comportan de forma semejante en todas las plataformas en que se ejecute. Los elementos de interface proporcionados por el AWT estn implementados utilizando toolkits nativos de las plataformas, preservando una apariencia semejante a todas las aplicaciones que se creen para esa plataforma. Este es un punto fuerte del AWT, pero tambin tiene la desventaja de que una interface grfica diseada para una plataforma, puede no visualizarse correctamente en otra diferente.

ESTRUCTURA DEL AWT


La estructura de la versin actual del AWT podemos resumirla en los puntos que exponemos a continuacin: Los Contenedores contienen Componentes, que son los controles bsicos No se usan posiciones fijas de los Componentes, sino que estn situados a travs de una disposicin controlada (layouts) El comn denominador de ms bajo nivel se acerca al teclado, ratn y manejo de eventos Alto nivel de abstraccin respecto al entorno de ventanas en que se ejecute la aplicacin (no hay reas cliente, ni llamadas a X, ni hWnds, etc.) La arquitectura de la aplicacin es dependiente del entorno de ventanas, en vez de tener un tamao fijo Es bastante dependiente de la mquina en que se ejecuta la aplicacin (no puede asumir que un dilogo tendr el mismo tamao en cada mquina) Carece de un formato de recursos. No se puede separar el cdigo de lo que es propiamente interface. No hay ningn diseador de interfaces (todava)

COMPONENTES Y CONTENEDORES
Una interface grfica est construida en base a elementos grficos bsicos, los Componentes. Tpicos ejemplos de estos Componentes son los botones, barras de desplazamiento, etiquetas, listas, cajas de seleccin o campos de texto. Los Componentes permiten al usuario interactuar con la aplicacin y proporcionar informacin desde el programa al usuario sobre el estado del programa. En el AWT, todos los Componentes de la interface de usuario son instancias de la clase Component o uno de sus subtipos. Los Componentes no se encuentran aislados, sino agrupados dentro de Contenedores. Los Contenedores contienen y organizan la situacin de los Componentes; adems, los Contenedores son en s mismos Componentes y como tales pueden ser situados dentro de otros Contenedores. Tambin contienen el cdigo necesario para el control de eventos,

cambiar la forma del cursor o modificar el icono de la aplicacin. En el AWT, todos los Contenedores son instancias de la clase Container o uno de sus subtipos. En la imagen siguiente presentamos una interface de usuario muy simple, con la apariencia que presenta cuando se visualiza bajo Windows '95. (IMAGEN 1) Los Componentes deben circunscribirse dentro del Contenedor que los contiene. Esto hace que el anidamiento de Componentes (incluyendo Contenedores) en Contenedores crean rboles de elementos, comenzando con un Contenedor en la raiz del rbol y expandindolo en sus ramas. A continuacin presentamos el rbol que representa la interface que corresponde con la aplicacin grfica generada anteriormente.
(IMAGEN 2)

www.cica.es/formacion/Javatut

You might also like