You are on page 1of 29

TUTORIAL DE UML Introduccin El Lenguaje de Modelamiento Unificado (UML - Unified Modeling Language) es un lenguaje grfico para visualizar, especificar

y documentar cada una de las partes que comprende el desarrollo de software. UML entrega una forma de modelar cosas conceptuales como lo son procesos de negocio y funciones de sistema, adems de cosas concretas como lo son escribir clases en un lenguaje determinado, esquemas de base de datos y componentes de software reusables.

1. MODELO DE CLASES
Introduccin Un diagrama de clases sirve para visualizar las relaciones entre las clases que involucran el sistema, las cuales pueden ser asociativas, de herencia, de uso y de contenimiento. Un diagrama de clases esta compuesto por los siguientes elementos: Clase: atributos, mtodos y visibilidad. Relaciones: Herencia, Composicin, Agregacin, Asociacin y Uso. Elementos Clase Es la unidad bsica que encapsula toda la informacin de un Objeto (un objeto es una instancia de una clase). A travs de ella podemos modelar el entorno en estudio (una Casa, un Auto, una Cuenta Corriente, etc.). En UML, una clase es representada por un rectngulo que posee tres divisiones:

En donde: Superior: Contiene el nombre de la Clase Intermedio: Contiene los atributos (o variables de instancia) que caracterizan a la Clase (pueden ser private, protected o public). Inferior: Contiene los mtodos u operaciones, los cuales son la forma como interacta el objeto con su entorno (dependiendo de la visibilidad: private, protected o public). Ejemplo: Una Cuenta Corriente que posee como caracterstica: o Balance Puede realizar las operaciones de: o Depositar o Girar o y Balance El diseo asociado es:

Atributos: Los atributos o caractersticas de una Clase pueden ser de tres tipos, los que definen el grado de comunicacin y visibilidad de ellos con el entorno, estos son:
o

public (+, ): Indica que el atributo ser visible tanto dentro como fuera de la clase, es decir, es accsesible desde todos lados. private (-, ): Indica que el atributo slo ser accesible desde dentro de la clase (slo sus mtodos lo pueden accesar). protected (#, ): Indica que el atributo no ser accesible desde fuera de la clase, pero si podr ser accesado por mtodos de la clase adems de las subclases que se deriven (ver herencia).

Mtodos: Los mtodos u operaciones de una clase son la forma en como sta interacta con su entorno, stos pueden tener las caractersticas:
o

public (+, ): Indica que el mtodo ser visible tanto dentro como fuera de la clase, es decir, es accsesible desde todos lados. private (-, ): Indica que el mtodo slo ser accesible desde dentro de la clase (slo otros mtodos de la clase lo pueden accesar). protected (#, ): Indica que el mtodo no ser accesible desde fuera de la clase, pero si podr ser accesado por mtodos de la clase adems de mtodos de las subclases que se deriven (ver herencia).

Relaciones entre Clases: Ahora ya definido el concepto de Clase, es necesario explicar como se pueden interrelacionar dos o ms clases (cada uno con caractersticas y objetivos diferentes). Antes es necesario explicar el concepto de cardinalidad de relaciones: En UML, la cardinalidad de las relaciones indica el grado y nivel de dependencia, se anotan en cada extremo de la relacin y stas pueden ser: o uno o muchos: 1..* (1..n) o 0 o muchos: 0..* (0..n) o nmero fijo: m (m denota el nmero).
i.

Herencia (Especializacin/Generalizacin): Indica que una subclase hereda los mtodos y atributos especificados por una Super Clase, por ende la Subclase adems de poseer sus propios mtodos y atributos, poseer las caractersticas y atributos visibles de la Super Clase (public y protected), ejemplo:

En la figura se especifica que Auto y Camin heredan de Vehculo, es decir, Auto posee las Caractersticas de Vehculo (Precio, VelMax, etc) adems posee algo particular que es Descapotable, en cambio Camin tambin hereda las caractersticas de Vehculo (Precio, VelMax, etc) pero posee como particularidad propia Acoplado, Tara y Carga. Cabe destacar que fuera de este entorno, lo nico "visible" es el mtodo Caractersticas aplicable a instancias de Vehculo, Auto y Camin, pues tiene definicin pblica, en cambio atributos como Descapotable no son visibles por ser privados.
ii.

Agregacin: Para modelar objetos complejos, n bastan los tipos de datos bsicos que proveen los lenguajes: enteros, reales y secuencias de caracteres. Cuando se requiere componer objetos que son instancias de clases definidas por el desarrollador de la aplicacin, tenemos dos posibilidades: Por Valor: Es un tipo de relacin esttica, en donde el tiempo de vida del objeto incluido esta condicionado por el tiempo de vida del que lo incluye. Este tipo de relacin es comunmente llamada Composicin (el Objeto base se contruye a partir del objeto incluido, es decir, es "parte/todo"). Por Referencia: Es un tipo de relacin dinmica, en donde el tiempo de vida del objeto incluido es independiente del que lo incluye. Este tipo de relacin es comunmente llamada Agregacin (el objeto base utiliza al incluido para su funcionamiento). Un Ejemplo es el siguiente:

En donde se destaca que: Un Almacn posee Clientes y Cuentas (los rombos van en el objeto que posee las referencias).

Cuando se destruye el Objeto Almacn tambin son destruidos los objetos Cuenta asociados, en cambio no son afectados los objetos Cliente asociados. La composicin (por Valor) se destaca por un rombo relleno. La agregacin (por Referencia) se destaca por un rombo transparente. La flecha en este tipo de relacin indica la navegabilidad del objeto referenciado. Cuando no existe este tipo de particularidad la flecha se elimina.
iii.

Asociacin: La relacin entre clases conocida como Asociacin, permite asociar objetos que colaboran entre si. Cabe destacar que no es una relacin fuerte, es decir, el tiempo de vida de un objeto no depende del otro. Ejemplo:

Un cliente puede tener asociadas muchas Ordenes de Compra, en cambio una orden de compra solo puede tener asociado un cliente.
iv.

Dependencia o Instanciacin (uso): Representa un tipo de relacin muy particular, en la que una clase es instanciada (su instanciacin es dependiente de otro objeto/clase). Se denota por una flecha punteada. El uso ms particular de este tipo de relacin es para denotar la dependencia que tiene una clase de otra, como por ejemplo una aplicacin grafica que instancia una ventana (la creacin del Objeto Ventana esta condicionado a la instanciacin proveniente desde el objeto Aplicacin):

Cabe destacar que el objeto creado (en este caso la Ventana grfica) no se almacena dentro del objeto que lo crea (en este caso la Aplicacin). Casos Particulares: o Clase Abstracta:

Una clase abstracta se denota con el nombre de la clase y de los mtodos con letra "itlica". Esto indica que la clase definida no puede ser instanciada pues posee mtodos abstractos (an no han sido definidos, es decir, sin implementacin). La nica forma de utilizarla es definiendo subclases, que implementan los mtodos abstractos definidos.
Clase parametrizada:

Una clase parametrizada se denota con un subcuadro en el extremo superior de la clase, en donde se especifican los parmetros que deben ser pasados a la clase para que esta pueda ser instanciada. El ejemplo ms tpico es el caso de un Diccionario en donde una llave o palabra tiene asociado un significado, pero en este caso las llaves y elementos pueden ser genricos. La genericidad puede venir dada de un Template (como en el caso de C++) o bien de alguna estructura predefinida (especializacin a travs de clases). En el ejemplo no se especificaron los atributos del Diccionario, pues ellos dependern exclusivamente de la implementacin que se le quiera dar. Ejemplo: Supongamos que tenemos tenemos un el caso del Diccionario implementado mediante un rbol binario, en donde cada nodo posee: key: Variable por la cual se realiza la bsqueda, puede ser genrica. tem: Contenido a almacenar en el diccionario asociado a "key", cuyo tipo tambin puede ser genrico. Para este caso particular hemos definido un Diccionario para almacenar String y Personas, las cuales pueden funcionar como llaves o como tem, solo se mostrarn las relaciones para la implementacin del Diccionario:

2. CASOS DE USO (USE CASE)


Introduccin El diagrama de casos de uso representa la forma en como un Cliente (Actor) opera con el sistema en desarrollo, adems de la forma, tipo y orden en como los elementos interactan (operaciones o casos de uso). Un diagrama de casos de uso consta de los siguientes elementos: Elementos Actor:

Una definicin previa, es que un Actor es un rol que un usuario juega con respecto al sistema. Es importante destacar el uso de la palabra rol, pues con esto se especifica que un Actor no necesariamente representa a una persona en particular, sino ms bien la labor que realiza frente al sistema. Como ejemplo a la definicin anterior, tenemos el caso de un sistema de ventas en que el rol de Vendedor con respecto al sistema puede ser realizado por un Vendedor o bien por el Jefe de Local.

Caso de Uso:

Es una operacin/tarea especfica que se realiza tras una orden de algn agente externo, sea desde una peticin de un actor o bien desde la invocacin desde otro caso de uso. Relaciones:
o

Asociacin Es el tipo de relacin ms bsica que indica la invocacin desde un actor o caso de uso a otra operacin (caso de uso). Dicha relacin se denota con una flecha simple. Dependencia o Instanciacin Es una forma muy particular de relacin entre clases, en la cual una clase depende de otra, es decir, se instancia (se crea). Dicha relacin se denota con una flecha punteada. Generalizacin Este tipo de relacin es uno de los ms utilizados, cumple una doble funcin dependiendo de su estereotipo, que puede ser de Uso (<<uses>>) o de Herencia (<<extends>>). Este tipo de relacin esta orientado exclusivamente para casos de uso (y no para actores). extends: Se recomienda utilizar cuando un caso de uso es similar a otro (caractersticas). uses: Se recomienda utilizar cuando se tiene un conjunto de caractersticas que son similares en ms de un caso de uso y no se desea mantener copiada la descripcin de la caracterstica. De lo anterior cabe mencionar que tiene el mismo paradigma en diseo y modelamiento de clases, en donde esta la duda clsica de usar o heredar.

Ejemplo: Como ejemplo esta el caso de una Mquina Recicladora: Sistema que controla una mquina de reciclamiento de botellas, tarros y jabas. El sistema debe controlar y/o aceptar: Registrar el nmero de tems ingresados. Imprimir un recibo cuando el usuario lo solicita: a. Describe lo depositado b. El valor de cada tem c. Total El usuario/cliente presiona el botn de comienzo Existe un operador que desea saber lo siguiente: a. Cuantos tems han sido retornados en el da. b. Al final de cada da el operador solicita un resumen de todo lo depositado en el da. El operador debe adems poder cambiar: a. Informacin asociada a tems. b. Dar una alarma en el caso de que: i. tem se atora. ii. No hay ms papel. Como una primera aproximacin identificamos a los actores que interactan con el sistema:

Luego, tenemos que un Cliente puede Depositar Items y un Operador puede cambiar la informacin de un tem o bien puede Imprimir un informe:

Adems podemos notar que un tem puede ser una Botella, un Tarro o una Jaba.

Otro aspecto es la impresin de comprobantes, que puede ser realizada despus de depositar algn tem por un cliente o bien puede ser realizada a peticin de un operador.

Entonces, el diseo completo del diagrama Use Case es:

3. DIAGRAMA DE INTERACCIN
Introduccin El diagrama de interaccin, representa la forma en como un Cliente (Actor) u Objetos (Clases) se comunican entre si en peticin a un evento. Esto implica recorrer toda la secuencia de llamadas, de donde se obtienen las responsabilidades claramente. Dicho diagrama puede ser obtenido de dos partes, desde el Diagrama Esttico de Clases o el de Casos de Uso (son diferentes). Los componentes de un diagrama de interaccin son: Objeto/Actor:

El rectngulo representa una instancia de un Objeto en particular, y la lnea punteada representa las llamadas a mtodos del objeto. Mensaje a Otro Objeto:

Se representa por una flecha entre un objeto y otro, representa la llamada de un mtodo (operacin) de un objeto en particular. Mensaje al Mismo Objeto:

No solo llamadas a mtodos de objetos externos pueden realizarse, tambin es posible visualizar llamadas a mtodos desde el mismo objeto en estudio. Ejemplo En el presente ejemplo, tenemos el diagrama de interaccin proveniente del siguiente modelo esttico:

Aqu se representa una aplicacin que posee una Ventana grfica, y sta a su vez posee internamente un botn. Entonces el diagrama de interaccin para dicho modelo es:

En donde se hacen notar las sucesivas llamadas a Draw() (entre objetos) y la llamada a Paint() por el objeto Botn.

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 continu e for new switch boolean default goto null synchro nized break do if packag e this

byte double implem ents private threads afe

byvalue else import protecte d throw case

extends instance of public transien t catch

false int return true char final

interfac e short try class finally long

static void const float native super while

Palabras Reservadas Adems, el lenguaje se reserva unas cuantas palabras ms, pero que hasta ahora no tienen un cometido especfico. Son: cast future generic inner operator outer rest 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 8 bits complemento a dos short 16 bits complemento a dos int 32 bits complemento a dos long 64 bits complemento a dos Por ejemplo: 21 077 0xDC00 Reales en coma flotante: float 32 bits IEEE 754 double 64 bits IEEE 754 Por ejemplo: 3.14 2e12 3.1E12 Booleanos: true false Caracteres: Por ejemplo: Cadenas: Por ejemplo: a "Esto \t \u???? es [????] es un nmero unicode 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( "Juan" ); nombres[1] = new String( "Pepe" ); nombres[2] = new String( "Pedro" ); nombres[3] = new String( "Maria" ); No se pueden crear arrays estticos en tiempo de compilacin: int lista[50]; // 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: . [] () ++ -! ~ instanceof * / % + << >> >>> < > <= >= == != & ^ | && || ? : = op= (*= /= %= += -= 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; // mbito exterior { // crea un nuevo mbito int i = 2; // 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; // no se ha asignado todavia s = new String( "abc" ); // memoria asignada s = "def"; // 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> }

METODOS NATIVOS
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; // paso 1 Habitacion llaveHab2; llaveHab1 = new Habitacion( 222 ); llaveHab2 = new Habitacion( 1144,3 ); ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^ A ByD C } } // 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.

You might also like