29
TUTORIAL DE UML Introducción El Lenguaje de Modelamiento Unificado (UML - Unified Modeling Language) es un lenguaj e gráfi co para visualizar, especi ficar y documentar cada una de las partes que comprende el desarrollo de soft war e. UML entrega una forma de modela r cosas conceptuales como lo son procesos de negocio y funciones de sistema, además 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 Introducción 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, métodos y visibilidad. Relaciones: Herencia, Composición, Agregación, Asociación y Uso. Elementos Clase Es la unidad básica que encapsula toda la información de un Objeto (un objeto es una instancia de una clase). A través de ella podemos modelar el entorno en estudio (una Casa, un Auto, una Cuenta Corriente, etc.). En UML, una clase es representada por un rectángulo que posee tr es 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 métodos u operaciones, los cuales son la forma como int eractúa el obj eto con su ent orno (dep endiendo de la visibilidad: pri vate , protected o public). Ejemplo: Una Cuenta Corriente que posee como característica: o Balance Puede realizar las operaciones de: o Depositar o Girar o y Balance El diseño asociado es:

Tutorial de UML y Java

  • Upload
    jorge

  • View
    389

  • Download
    0

Embed Size (px)

Citation preview

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 1/29

 

TUTORIAL DE UML

IntroducciónEl Lenguaje de Modelamiento Unificado (UML - Unified Modeling Language) es unlenguaje gráfico para visualizar, especificar y documentar cada una de las partes quecomprende el desarrollo de software. UML entrega una forma de modelar cosasconceptuales como lo son procesos de negocio y funciones de sistema, además decosas concretas como lo son escribir clases en un lenguaje determinado, esquemasde base de datos y componentes de software reusables.

1. MODELO DE CLASES

Introducción Un diagrama de clases sirve para visualizar las relaciones entre las clases queinvolucran el sistema, las cuales pueden ser asociativas, de herencia, de uso y decontenimiento.Un diagrama de clases esta compuesto por los siguientes elementos:

• Clase: atributos, métodos y visibilidad.• Relaciones: Herencia, Composición, Agregación, Asociación y Uso.

Elementos • Clase 

Es la unidad básica que encapsula toda la información de un Objeto (un objetoes una instancia de una clase). A través de ella podemos modelar el entorno enestudio (una Casa, un Auto, una Cuenta Corriente, etc.).En UML, una clase es representada por un rectángulo que posee tresdivisiones:

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 métodos u operaciones, los cuales son la forma como

interactúa el objeto con su entorno (dependiendo de la visibilidad: private,protected o public).

Ejemplo:Una Cuenta Corriente que posee como característica:

o BalancePuede realizar las operaciones de:

o Depositar o Girar o y Balance

El diseño asociado es:

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 2/29

 

• Atributos: Los atributos o características de una Clase pueden ser de tres tipos,los que definen el grado de comunicación y visibilidad de ellos con elentorno, estos son:

o public (+, ): Indica que el atributo será visible tanto dentro comofuera de la clase, es decir, es accsesible desde todos lados.

o private (-, ): Indica que el atributo sólo será accesible desde dentro

de la clase (sólo sus métodos lo pueden accesar).

o protected (#, ): Indica que el atributo no será accesible desdefuera de la clase, pero si podrá ser accesado por métodos de la claseademás de las subclases que se deriven (ver herencia).

• Métodos: Los métodos u operaciones de una clase son la forma en como ésta interactúacon su entorno, éstos pueden tener las características:

o public (+, ): Indica que el método será visible tanto dentro comofuera de la clase, es decir, es accsesible desde todos lados.

o private (-, ): Indica que el método sólo será accesible desde dentrode la clase (sólo otros métodos de la clase lo pueden accesar).

o protected (#, ): Indica que el método no será accesible desdefuera de la clase, pero si podrá ser accesado por métodos de la claseademás de métodos de las subclases que se deriven (ver herencia).

• Relaciones entre Clases: Ahora ya definido el concepto de Clase, es necesario explicar como se puedeninterrelacionar dos o más clases (cada uno con características 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, seanotan en cada extremo de la relación y éstas pueden ser:

o uno o muchos: 1..* (1..n)o 0 o muchos: 0..* (0..n)o número fijo: m (m denota el número).

i. Herencia (Especialización/Generalización):Indica que una subclase hereda los métodos y atributos especificadospor una Super Clase, por ende la Subclase además de poseer sus

propios métodos y atributos, poseerá las características y atributosvisibles de la Super Clase (public y protected), ejemplo:

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 3/29

 

En la figura se especifica que Auto y Camión heredan de Vehículo, es decir, Autoposee las Características de Vehículo (Precio, VelMax, etc) además posee algoparticular que es Descapotable, en cambio Camión también hereda las característicasde Vehículo (Precio, VelMax, etc) pero posee como particularidad propia Acoplado,Tara y Carga.Cabe destacar que fuera de este entorno, lo único "visible" es el métodoCaracterísticas aplicable a instancias de Vehículo, Auto y Camión, pues tienedefinición pública, en cambio atributos como Descapotable no son visibles por ser privados.

ii. Agregación:Para modelar objetos complejos, n bastan los tipos de datos básicos queproveen los lenguajes: enteros, reales y secuencias de caracteres. Cuandose requiere componer objetos que son instancias de clases definidas por eldesarrollador de la aplicación, tenemos dos posibilidades:

Por Valor : Es un tipo de relación estática, en donde el tiempo devida del objeto incluido esta condicionado por el tiempo de vida delque lo incluye. Este tipo de relación es comunmente llamadaComposición (el Objeto base se contruye a partir del objetoincluido, es decir, es "parte/todo"). Por Referencia: Es un tipo de relación dinámica, en donde eltiempo de vida del objeto incluido es independiente del que lo

incluye. Este tipo de relación es comunmente llamada Agregación(el objeto base utiliza al incluido para su funcionamiento).Un Ejemplo es el siguiente:

En donde se destaca que: Un Almacén posee Clientes y Cuentas (los rombos van en elobjeto que posee las referencias).

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 4/29

 

Cuando se destruye el Objeto Almacén también son destruidoslos objetos Cuenta asociados, en cambio no son afectados los objetosCliente asociados. La composición (por Valor) se destaca por un rombo relleno. La agregación (por Referencia) se destaca por un rombotransparente.

La flecha en este tipo de relación indica la navegabilidad del objetoreferenciado. Cuando no existe este tipo de particularidad la flecha se elimina.

iii. Asociación:La relación entre clases conocida como Asociación, permite asociar objetosque colaboran entre si. Cabe destacar que no es una relación fuerte, esdecir, el tiempo de vida de un objeto no depende del otro.

Ejemplo:

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

iv. Dependencia o Instanciación (uso):Representa un tipo de relación muy particular, en la que una clase es instanciada(su instanciación es dependiente de otro objeto/clase). Se denota por una flechapunteada.El uso más particular de este tipo de relación es para denotar la dependencia quetiene una clase de otra, como por ejemplo una aplicación grafica que instancia unaventana (la creación del Objeto Ventana esta condicionado a la instanciaciónproveniente desde el objeto Aplicación):

Cabe destacar que el objeto creado (en este caso la Ventana gráfica) no sealmacena dentro del objeto que lo crea (en este caso la Aplicación).• Casos Particulares:

o Clase Abstracta:

Una clase abstracta se denota con el nombre de la clase y de los métodos conletra "itálica". Esto indica que la clase definida no puede ser instanciada puesposee métodos abstractos (aún no han sido definidos, es decir, sinimplementación). La única forma de utilizarla es definiendo subclases, queimplementan los métodos abstractos definidos.

Clase parametrizada:

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 5/29

 

Una clase parametrizada se denota con un subcuadro en el extremo superior de la clase, en donde se especifican los parámetros que deben ser pasados ala clase para que esta pueda ser instanciada. El ejemplo más típico es el casode un Diccionario en donde una llave o palabra tiene asociado un significado,pero en este caso las llaves y elementos pueden ser genéricos. La genericidadpuede venir dada de un Template (como en el caso de C++) o bien de algunaestructura predefinida (especialización a través de clases).

En el ejemplo no se especificaron los atributos del Diccionario, pues ellos

dependerán exclusivamente de la implementación que se le quiera dar.

Ejemplo:Supongamos que tenemos tenemos un el caso del Diccionario implementadomediante un árbol binario, en donde cada nodo posee:

• key: Variable por la cual se realiza la búsqueda, puede ser genérica.• ítem: Contenido a almacenar en el diccionario asociado a "key", cuyo tipo

también puede ser genérico.Para este caso particular hemos definido un Diccionario para almacenar String yPersonas, las cuales pueden funcionar como llaves o como ítem, solo se mostrarán lasrelaciones para la implementación del Diccionario:

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 6/29

 

2. CASOS DE USO (USE CASE)

Introducción El diagrama de casos de uso representa la forma en como un Cliente (Actor) operacon el sistema en desarrollo, además de la forma, tipo y orden en como los elementos

interactúan (operaciones o casos de uso).Un diagrama de casos de uso consta de los siguientes elementos:

Elementos • Actor :

Una definición previa, es que un Actor  es un rol que un usuario juega conrespecto al sistema. Es importante destacar el uso de la palabra rol, pues conesto se especifica que un Actor no necesariamente representa a una personaen particular, sino más bien la labor que realiza frente al sistema.Como ejemplo a la definición anterior, tenemos el caso de un sistema deventas en que el rol de Vendedor con respecto al sistema puede ser realizadopor un Vendedor o bien por el Jefe de Local.

• Caso de Uso:

Es una operación/tarea específica que se realiza tras una orden de algúnagente externo, sea desde una petición de un actor o bien desde la invocación

desde otro caso de uso.• Relaciones:

o Asociación Es el tipo de relación más básica que indica la invocación desde unactor o caso de uso a otra operación (caso de uso). Dicha relación sedenota con una flecha simple.

o Dependencia o Instanciación Es una forma muy particular de relación entre clases, en la cual unaclase depende de otra, es decir, se instancia (se crea). Dicha relaciónse denota con una flecha punteada.

o Generalización Este tipo de relación es uno de los más utilizados, cumple una doblefunción dependiendo de su estereotipo, que puede ser de Uso(<<uses>>) o de Herencia (<<extends>>).Este tipo de relación esta orientado exclusivamente para casos de uso(y no para actores).extends: Se recomienda utilizar cuando un caso de uso es similar aotro (características).uses: Se recomienda utilizar cuando se tiene un conjunto decaracterísticas que son similares en más de un caso de uso y no sedesea mantener copiada la descripción de la característica.De lo anterior cabe mencionar que tiene el mismo paradigma en diseño

y modelamiento de clases, en donde esta la duda clásica de usar  oheredar .

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 7/29

 

Ejemplo: Como ejemplo esta el caso de una Máquina Recicladora:Sistema que controla una máquina de reciclamiento de botellas, tarros y jabas. Elsistema debe controlar y/o aceptar:

• Registrar el número de ítems ingresados.• Imprimir un recibo cuando el usuario lo solicita:

a. Describe lo depositado

 b. El valor de cada ítemc. Total

• El usuario/cliente presiona el botón de comienzo• Existe un operador que desea saber lo siguiente:

a. Cuantos ítems han sido retornados en el día.b. Al final de cada día el operador solicita un resumen de todo lo

depositado en el día.• El operador debe además poder cambiar:

a. Información asociada a ítems.

b. Dar una alarma en el caso de que:i. ítem se atora.ii. No hay más papel.

Como una primera aproximación identificamos a los actores que interactúan con elsistema:

Luego, tenemos que un Cliente puede Depositar Items y un Operador puede cambiar 

la información de un ítem o bien puede Imprimir un informe:

Además podemos notar que un ítem puede ser una Botella, un Tarro o una Jaba.

Otro aspecto es la impresión de comprobantes, que puede ser realizada después dedepositar algún ítem por un cliente o bien puede ser realizada a petición de unoperador.

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 8/29

 

Entonces, el diseño completo del diagrama Use Case es:

3. DIAGRAMA DE INTERACCIÓN

Introducción El diagrama de interacción, representa la forma en como un Cliente (Actor) u Objetos(Clases) se comunican entre si en petición a un evento. Esto implica recorrer toda lasecuencia de llamadas, de donde se obtienen las responsabilidades claramente.Dicho diagrama puede ser obtenido de dos partes, desde el Diagrama Estático deClases o el de Casos de Uso (son diferentes).Los componentes de un diagrama de interacción son:

• Objeto/Actor :

El rectángulo representa una instancia de un Objeto en particular, y la líneapunteada representa las llamadas a métodos del objeto.

• Mensaje a Otro Objeto:

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 9/29

 

Se representa por una flecha entre un objeto y otro, representa la llamada deun método (operación) de un objeto en particular.

• Mensaje al Mismo Objeto:

No solo llamadas a métodos de objetos externos pueden realizarse, también esposible visualizar llamadas a métodos desde el mismo objeto en estudio.

Ejemplo 

En el presente ejemplo, tenemos el diagrama de interacción proveniente del siguientemodelo estático:

Aquí se representa una aplicación que posee una Ventana gráfica, y ésta a su vezposee internamente un botón.Entonces el diagrama de interacción para dicho modelo es:

En donde se hacen notar las sucesivas llamadas a Draw() (entre objetos) y la llamadaa Paint() por el objeto Botón.

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 10/29

 

PROGRAMACION EN JAVA

Cuando se programa en Java, se coloca todo el código en métodos, de la mismaforma que se escriben funciones en lenguajes como C.ComentariosEn Java hay tres tipos de comentarios:

// Comentarios para una sola línea

/* Comentarios de una omás líneas

*/

/** Comentario de documentación, de una o más líneas*/

Los dos primeros tipos de comentarios son los que todo programador conoce y seutilizan del mismo modo. Los comentarios de documentación, colocadosinmediatamente antes de una declaración (de variable o función), indican que esecomentario ha de ser colocado en la documentación que se genera automáticamentecuando se utiliza la herramienta de Java,  javadoc . Dichos comentarios sirven comodescripción del elemento declarado permitiendo generar una documentación denuestras clases escrita al mismo tiempo que se genera el código.

En este tipo de comentario para documentación, se permite la introducción de algunostokens o palabras clave, que harán que la información que les sigue aparezca deforma diferente al resto en la documentación.

Identificadores

Los identificadores nombran variables, funciones, clases y objetos; cualquier cosa queel programador necesite identificar o usar.En Java, un identificador comienza con una letra, un subrayado (_) o un símbolo dedólar ($). Los siguientes caracteres pueden ser letras o dígitos. Se distinguen lasmayúsculas de las minúsculas y no hay longitud máxima.Serían identificadores válidos:

identificador nombre_usuarioNombre_Usuario_variable_del_sistema$transaccion

y su uso sería, por ejemplo:int contador_principal;char _lista_de_ficheros;float $cantidad_en_Ptas;

Palabras claveLas siguientes son las palabras clave que están definidas en Java y que no se puedenutilizar como indentificadores:

abstractcontinue

for newswitch

booleandefaultgoto

nullsynchronized

breakdoif 

packagethis

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 11/29

 

bytedoubleimplementsprivatethreadsafe

byvalueelseimportprotectedthrowcase

extendsinstanceof publictransientcatch

falseintreturntruechar final

interfaceshorttryclassfinallylong

staticvoidconstfloatnativesuper while

Palabras ReservadasAdemás, el lenguaje se reserva unas cuantas palabras más, pero que hasta ahora notienen un cometido específico. Son:

castfuture

genericinner 

operator outer 

rest var  

LiteralesUn valor constante en Java se crea utilizando una representación 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 código fuente deJava. Cada uno de estos literales tiene un tipo correspondiente asociado con él.Enteros:

byte 8 bits complemento a dosshort 16 bits complemento a dosint 32 bits complemento a doslong 64 bits complemento a dosPor ejemplo: 21 077 0xDC00

Reales en coma flotante:float 32 bits IEEE 754

double 64 bits IEEE 754Por ejemplo: 3.14 2e12 3.1E12

Booleanos:truefalse

Caracteres:Por ejemplo: a \t \u???? [????] es un número unicode

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

 ArraysSe 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 límites de los arrays se comprueban en tiempo de ejecución para evitar desbordamientos y la corrupción de memoria.

En Java un array es realmente un objeto, porque tiene redefinido el operador  [] . Tieneuna función miembro: length. Se puede utilizar este método para conocer la longitudde cualquier array.

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 12/29

 

int a[][] = new int[10][3];a.length; /* 10 */a[0].length; /* 3 */

Para crear un array en Java hay dos métodos básicos. Crear un array vacío: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 estáticos en tiempo de compilación:int lista[50]; // generará un error en tiempo de compilación

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

lista[i] = i;

Es decir, todos los arrays en Java son estáticos. Para convertir un array en elequivalente a un array dinámico en C/C++, se usa la clase vector , que permite

operaciones de inserción, borrado, etc. en el array.

OperadoresLos operadores de Java son muy parecidos en estilo y funcionamiento a los de C. Enla siguiente tabla aparecen los operadores que se utilizan en Java, por orden deprecedencia:

. [] ()++ --! ~ instanceof * / %+ -<< >> >>>

< > <= >= == !=& ^ |&& ||? := op= (*= /= %= += -= etc.) ,

Los operadores numéricos se comportan como esperamos:int + int = int

Los operadores relacionales devuelven un valor booleano.

Para las cadenas, se pueden utilizar los operadores relacionales para comparacionesademás de + y += para la concatenación:String nombre = "nombre" + "Apellido";

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 13/29

 

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

SeparadoresSólo hay un par de secuencias con otros caracteres que pueden aparecer en el códigoJava; son los separadores simples, que van a definir la forma y función del código. Losseparadores admitidos en Java son:() - paréntesis. Para contener listas de parámetros en la definición y llamada amétodos. También 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 automáticamente.También se utiliza para definir un bloque de código, para clases, métodos y ámbitoslocales. []  - corchetes. Para declarar tipos matriz. También se utiliza cuando se referencianvalores de matriz.; - punto y coma. Separa sentencias.

, - coma. Separa identificadores consecutivos en una declaración de variables.También se utiliza para encadenar sentencias dentro de una sentencia for .. - punto. Para separar nombres de paquete de subpaquetes y clases. También seutiliza para separar una variable o método de una variable de referencia.

CONTROL DE FLUJOMuchas de las sentencias de control del flujo del programa se han tomado del C:Sentencias de Saltoif/else  if( Boolean ) {

sentencias;

}else {

sentencias;}

switch  switch( expr1 ) {

case expr2:sentencias;break;

case expr3:sentencias;break;

default:sentencias;break;

}

SENTENCIAS DE BUCLEBucles for   for( expr1 inicio; expr2 test; expr3 incremento ) {

sentencias;}

El siguiente trocito de código Java que dibuja varias líneas en pantalla alternando suscolores entre rojo, azul y verde. Este fragmento sería parte de una función Java(método):

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 14/29

 

  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 );}

También se soporta el operador coma (,) en los bucles for for( a=0,b=0; a < 7; a++,b+=2 )

Bucles whilewhile( Boolean ) {

sentencias;}

Bucles do/whiledo {

sentencias;}while( Boolean );

Excepcionestry-catch-throw 

try {sentencias;

} catch( Exception ) {sentencias;

}

Java implementa excepciones para facilitar la construcción de código robusto. Cuandoocurre un error en un programa, el código que encuentra el error lanza una excepción,que se puede capturar y recuperarse de ella. Java proporciona muchas excepcionespredefinidas.

CONTROL GENERAL DEL FLUJObreak [etiqueta]continue [etiqueta]return expr;etiqueta: sentencia;

En caso de que nos encontremos con bucles anidados, se permite el uso de etiquetaspara poder salirse de ellos, por ejemplo:

uno: for( ){

dos: for( ){continue; // seguiría en el bucle internocontinue uno; // seguiría en el bucle principalbreak uno; // se saldría del bucle principal}

}

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 15/29

 

En el código de una función siempre hay que ser consecuentes con la declaración quese haya hecho de ella. Por ejemplo, si se declara una función para que devuelva unentero, es imprescindible que se coloque un return final para salir de esa función,independientemente de que haya otros en medio del código que también provoquen lasalida de la función. En caso de no hacerlo se generará un Warning , y el código Javano 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 más simple de Java. Todo en Java forma parte de una clase, es unaclase o describe como funciona una clase. El conocimiento de las clases esfundamental para poder entender los programas Java.

Todas las acciones de los programas Java se colocan dentro del bloque de una claseo un objeto. Todos los métodos se definen dentro del bloque de la clase, Java nosoporta funciones o variables globales. Esto puede despistar a los programadores deC++, que pueden definir métodos fuera del bloque de la clase, pero esta posibilidad esmás un intento de no separarse mucho y ser compatible con C, que un buen diseñoorientado a objetos. Así pues, el esqueleto de cualquier aplicación Java se basa en ladefinición de una clase.

Todos los datos básicos, como los enteros, se deben declarar en las clases antes dehacer uso de ellos. En C la unidad fundamental son los ficheros con código fuente, enJava son las clases. De hecho son pocas las sentencias que se pueden colocar fueradel bloque de una clase. La palabra clave import (equivalente al #include) puedecolocarse al principio de un fichero, fuera del bloque de la clase. Sin embargo, elcompilador reemplazará esa sentencia con el contenido del fichero que se indique, queconsistirá, como es de suponer, en más clases.

Tipos de ClasesHasta ahora sólo se ha utilizado la palabra clave public para calificar el nombre de lasclases que hemos visto, pero hay tres modificadores más. Los tipos de clases quepodemos definir son:

abstract Una clase abstract  tiene al menos un método abstracto. Una clase abstracta no seinstancia, 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 sepuede heredar de una clase final. Por ejemplo, la clase Math es una clase final.

public 

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 16/29

 

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. Paraacceder desde otros paquetes, primero tienen que ser importadas.

synchronizable Este modificador especifica que todos los métodos definidos en la clase sonsincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desdedistintos threads; el sistema se encarga de colocar los flags necesarios para evitarlo.Este mecanismo hace que desde threads diferentes se puedan modificar las mismasvariables sin que haya problemas de que se sobreescriban.

VARIABLES Y METODOS DE INSTANCIAUna clase en Java puede contener variables y métodos. Las variables pueden ser tipos primitivos como int, char, etc. Los métodos son funciones.

Por ejemplo, en el siguiente trozo de código 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 métodos, MiClase que es elconstructor de la clase y Suma_a_i( int j ).

 Ambito de una variableLos bloques de sentencias compuestas en Java se delimitan con dos llaves. Lasvariables de Java sólo son válidas desde el punto donde están declaradas hasta elfinal de la sentencia compuesta que la engloba. Se pueden anidar estas sentenciascompuestas, y cada una puede contener su propio conjunto de declaraciones devariables locales. Sin embargo, no se puede declarar una variable con el mismonombre que una de ámbito exterior.

El siguiente ejemplo intenta declarar dos variables separadas con el mismo nombre.En C y C++ son distintas, porque están declaradas dentro de ámbitos diferentes. EnJava, esto es ilegal.

Class Ambito {int i = 1; // ámbito exterior 

{ // crea un nuevo ámbitoint i = 2; // error de compilación}

}

MÉTODOS Y CONSTRUCTORESLos métodos son funciones que pueden ser llamadas dentro de la clase o por otrasclases. El constructor es un tipo específico de método que siempre tiene el mismo

nombre que la clase.

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 17/29

 

Cuando se declara una clase en Java, se pueden declarar uno o más constructoresopcionales que realizan la inicialización cuando se instancia (se crea una ocurrencia)un objeto de dicha clase.

Utilizando el código de ejemplo anterior, cuando se crea una nueva instancia deMiClase, se crean (instancian) todos los métodos 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 declaración de tipo.Después 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 métodos de MiClase, se puede usar la primerasintaxis para llamar al método Suma_a_i() utilizando el nuevo nombre de clase mc:mc.Suma_a_i( 10 );

y ahora la variable mc.i vale 21.

FinalizadoresJava no utiliza destructores (al contrario que C++) ya que tiene una forma de recoger automáticamente todos los objetos que se salen del alcance. No obstante proporcionaun método que, cuando se especifique en el código de la clase, el reciclador dememoria (garbage collector ) llamará:

// Cierra el canal cuando este objeto es recicladoprotected void finalize() {

close();}

ALCANCE DE OBJETOS Y RECICLADO DE MEMORIALos objetos tienen un tiempo de vida y consumen recursos durante el mismo. Cuandoun objeto no se va a utilizar más, debería liberar el espacio que ocupaba en lamemoria de forma que las aplicaciones no la agoten (especialmente las grandes).

En Java, la recolección y liberación de memoria es responsabilidad de un thread llamado automatic garbage collector  (recolector automático de basura). Este threadmonitoriza el alcance de los objetos y marca los objetos que se han salido de alcance.Veamos un ejemplo:

String s; // no se ha asignado todavias = new String( "abc" ); // memoria asignadas = "def"; // se ha asignado nueva memoria

// (nuevo objeto)Más adelante veremos en detalle la clase String, pero una breve descripción de lo quehace 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

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 18/29

 

llamado s y contiene "def". Es marcado y eliminado en la siguiente iteración del threadreciclador de memoria.

HERENCIA

La Herencia es el mecanismo por el que se crean nuevos objetos definidos entérminos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se puedecrear la subclase Pato, que es una especialización de Ave.

class Pato extends Ave {int numero_de_patas;}

La palabra clave extends se usa para generar una subclase (especialización) de unobjeto. Una Pato es una subclase de Ave. Cualquier cosa que contenga la definiciónde Ave será copiada a la clase Pato, además, en Pato se pueden definir sus propiosmétodos y variables de instancia. Se dice que Pato deriva o hereda de Ave.Además, se pueden sustituir los métodos proporcionados por la clase base. Utilizandonuestro anterior ejemplo de MiClase, aquí hay un ejemplo de una clase derivada

sustituyendo a la función 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 también seinicializa a 10, pero la llamada al método Suma_a_i() produce un resultado diferente:

MiNuevaClase mnc;mnc = new MiNuevaClase();mnc.Suma_a_i( 10 );

En Java no se puede hacer herencia múltiple. Por ejemplo, de la clase aparato conmotor y de la clase animal no se puede derivar nada, sería como obtener el objeto toromecánico a partir de una máquina motorizada (aparato con motor) y un toro (aminal).En realidad, lo que se pretende es copiar los métodos, es decir, pasar la funcionalidaddel toro de verdad al toro mecánico, con lo cual no sería necesaria la herencia múltiplesino simplemente la compartición de funcionalidad que se encuentra implementada enJava a través de interfaces.

CONTROL DE ACCESOCuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que

se quiere para las variables de instancia y los métodos definidos en la clase:

public public void CualquieraPuedeAcceder(){}Cualquier clase desde cualquier lugar puede acceder a las variables y métodos deinstacia públicos.

protected protected void SoloSubClases(){}Sólo las subclases de la clase y nadie más puede acceder a las variables y métodosde instancia protegidos.

private private String NumeroDelCarnetDeIdentidad;

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 19/29

 

Las variables y métodos de instancia privados sólo pueden ser accedidos desdedentro de la clase. No son accesibles desde las subclases.

friendly (sin declaración específica)void MetodoDeMiPaquete(){}Por defecto, si no se especifica el control de acceso, las variables y métodos deinstancia se declaran friendly (amigas), lo que significa que son accesibles por todoslos objetos dentro del mismo paquete, pero no por los externos al paquete. Es lomismo que protected.

Los métodos protegidos (protected) pueden ser vistos por las clases derivadas, comoen C++, y también, en Java, por los paquetes (packages). Todas las clases de unpaquete pueden ver los métodos protegidos de ese paquete. Para evitarlo, se debendeclarar como private protected , lo que hace que ya funcione como en C++ en dondesólo se puede acceder a las variables y métodos protegidos de las clases derivadas.

VARIABLES Y METODOS ESTATICOS En un momento determinado se puede querer crear una clase en la que el valor deuna variable de instancia sea el mismo (y de hecho sea la misma variable) para todoslos objetos instanciados a partir de esa clase. Es decir, que exista una única copia dela 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 laclase Documento. Siempre que un objeto instanciado de Documento cambie lavariable version, ésta cambiará para todos los objetos.

De la misma forma se puede declarar un método como estático, lo que evita que elmétodo pueda acceder a las variables de instancia no estáticas:

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 modificación de la variable numero_de_capitulos no funciona porque se estáviolando una de las reglas de acceso al intentar acceder desde un método estático auna variable no estática.

Todas las clases que se derivan, cuando se declaran estáticas, comparten la mismapágina de variables; es decir, todos los objetos que se generen comparten la mismazona de memoria. Las funciones estáticas se usan para acceder solamente a variablesestáticas.

class UnaClase {int var;UnaClase()

{

var = 5;}

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 20/29

 

UnaFuncion(){var += 5;}

}En el código anterior, si se llama a la función UnaFuncion a través de un puntero a

función, no se podría acceder a var, porque al utilizar un puntero a función no se pasaimplícitamente el puntero al propio objeto (this). Sin embargo, sí se podría acceder avar si fuese estática, porque siempre estaría en la misma posición de memoria paratodos los objetos que se creasen de UnaClase.

this Y super Al acceder a variables de instancia de una clase, la palabra clave this hace referenciaa los miembros de la propia clase. Volviendo al ejemplo de MiClase, se puede añadir otro constructor de la forma siguiente:

public class MiClase {int i;public MiClase() {

i = 10;}

// Este constructor establece el valor de ipublic 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 método padre dentro de una clase que ha reemplazado esemétodo, se puede hacer referencia al método 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 código, el constructor establecerá el valor de i a 10, después locambiará a 15 y finalmente el método Suma_a_i() de la clase padre (MiClase) lodejará en 25:

MiNuevaClase mnc;mnc = new MiNuevaClase();mnc.Suma_a_i( 10 );

CLASES ABSTRACTASUna de las características más útiles de cualquier lenguaje orientado a objetos es laposibilidad de declarar clases que definen como se utiliza solamente, sin tener queimplementar métodos. Esto es muy útil cuando la implementación es específica paracada usuario, pero todos los usuarios tienen que utilizar los mismos métodos. Unejemplo 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 );

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 21/29

 

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 métodos se declaran en la clase Graphics, pero el código que ejecutará elmétodo está en algún otro sitio:public class MiClase extends Graphics {

public void drawLine( int x1,int y1,int x2,int y2 ) {  <código para pintar líneas -específico de

la arquitectura->}

}Cuando una clase contiene un método abstracto tiene que declararse abstracta. Noobstante, no todos los métodos de una clase abstracta tienen que ser abstractos. Lasclases abstractas no pueden tener métodos privados (no se podrían implementar) nitampoco estáticos. 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 aque al derivar de la clase haya que implementar forzosamente los métodos de esaclase abstracta.

INTERFACES Los métodos abstractos son útiles cuando se quiere que cada implementación de laclase parezca y funcione igual, pero necesita que se cree una nueva clase para utilizar los métodos abstractos.Los interfaces proporcionan un mecanismo para abstraer los métodos a un nivelsuperior.

Un interface contiene una colección de métodos que se implementan en otro lugar.Los métodos de una clase son public , static y final .La principal diferencia entre interface y abstract es que un interface proporciona unmecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario autilizar la herencia.Por ejemplo:

public interface VideoClip {// comienza la reproduccion del videovoid play();// reproduce el clip en un buclevoid bucle();// detiene la reproduccion

void stop();}

Las clases que quieran utilizar el interface VideoClip utilizarán la palabra implements yproporcionarán el código necesario para implementar los métodos que se han definidopara el interface:

class MiClase implements VideoClip {void play() {

<código>}

void bucle() {<código>}

void stop() {

<código>}

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 22/29

 

Al utilizar implements para el interface es como si se hiciese una acción de copiar-y-pegar del código del interface, con lo cual no se hereda nada, solamente se puedenusar los métodos.La ventaja principal del uso de interfaces es que una clase interface puede ser implementada por cualquier número de clases, permitiendo a cada clase compartir elinterfaz de programación sin tener que ser consciente de la implementación que haganlas otras clases que implementen el interface.

class MiOtraClase implements VideoClip {void play() {

<código nuevo>}

void bucle() {<código nuevo>}

void stop() {<código nuevo>

}

METODOS NATIVOS Java proporciona un mecanismo para la llamada a funciones C y C++ desde nuestrocódigo fuente Java. Para definir métodos como funciones C o C++ se utiliza la palabraclave native.

public class Fecha {int ahora;public Fecha() {

ahora = time();}

private native int time();static {System.loadLibrary( "time" );}

}

Una vez escrito el código Java, se necesitan ejecutar los pasos siguientes para poder integrar el código 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

declaración de las funciones• Escribir el código del método nativo en C o C++, es decir, rellenar el código de

la función, completando el trabajo de javah al crear el fichero de stubs• Compilar el fichero de stubs y el fichero .c en una librería de carga dinámica

(DLL en Windows '95 o libXX.so en Unix)• Ejecutar la aplicación con el appletviewer 

Más adelante trataremos en profundidad los métodos nativos, porque añaden una granpotencia a Java, al permitirle integrar a través de librería dinámica cualquier algoritmodesarrollado en C o C++, lo cual, entre otras cosas, se utiliza como método deprotección contra la descompilación completa del código Java.

PAQUETES 

La palabra clave  package permite agrupar clases e interfaces. Los nombres de lospaquetes son palabras separadas por puntos y se almacenan en directorios quecoinciden con esos nombres.

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 23/29

 

Por ejemplo, los ficheros siguientes, que contienen código fuente Java:Applet.java, AppletContext.java, AppletStub.java, AudioClip.javacontienen en su código la línea:

package java.applet;

Y las clases que se obtienen de la compilación de los ficheros anteriores, seencuentran 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 elnombre 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 ningún  package, se coloca en el paquete por 

defecto sin nombre. Es decir, en el mismo directorio que el fichero fuente, y la clasepuede ser cargada con la sentencia import :import MiClase;

Paquetes de JavaEl lenguaje Java proporciona una serie de paquetes que incluyen ventanas, utilidades,un sistema de entrada/salida general, herramientas y comunicaciones. En la versiónactual del JDK, los paquetes Java que se incluyen son:

 java.appletEste paquete contiene clases diseñadas para usar con applets. Hay una clase Applet ytres interfaces: AppletContext, AppletStub y AudioClip.

 java.awtEl paquete Abstract Windowing Toolkit (awt) contiene clases para generar widgets ycomponentes GUI (Interfaz Gráfico de Usuario). Incluye las clases Button, Checkbox,Choice, Component, Graphics, Menu, Panel, TextArea y TextField.

 java.ioEl paquete de entrada/salida contiene las clases de acceso a ficheros: FileInputStreamy FileOutputStream.

 java.langEste paquete incluye las clases del lenguaje Java propiamente dicho: Object, Thread,Exception, System, Integer, Float, Math, String, etc.

 java.netEste paquete da soporte a las conexiones del protocolo TCP/IP y, además, incluye lasclases Socket, URL y URLConnection.

 java.utilEste paquete es una miscelánea de clases útiles para muchas cosas en programación.Se incluyen, entre otras, Date (fecha), Dictionary (diccionario), Random (númerosaleatorios) y Stack (pila FIFO).

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 24/29

 

REFERENCIAS Java se asemeja mucho a C y C++. Esta similitud, evidentemente intencionada, es lamejor herramienta para los programadores, ya que facilita en gran manera sutransición a Java. Desafortunadamente, tantas similitudes hacen que no nos paremosen algunas diferencias que son vitales. La terminología utilizada en estos lenguajes, a

veces es la misma, pero hay grandes diferencias subyacentes en su significado. Ctiene tipos de datos básicos y punteros. C++ modifica un poco este panorama y leañade los tipos referencia. Java también especifica sus tipos primitivos, eliminacualquier tipo de punteros y tiene tipos referencia mucho más claros.

Todo este maremágnum de terminología provoca cierta consternación, así que vamosa intentar aclarar lo que realmente significa.

Conocemos ya ampliamente todos los tipos básicos de datos: datos base, integrados,primitivos e internos; que son muy semejantes en C, C++ y Java; aunque Javasimplifica un poco su uso a los desarrolladores haciendo que el chequeo de tipos seabastante más rígido. Además, Java añade los tipos boolean y hace imprescindible el

uso de este tipo booleano en sentencias condicionales.

PUNTEROS Y REFERENCIAS C++PunterosC y C++ permiten la declaración y uso de punteros, que pueden ser utilizados encualquier lugar. Esta tremenda flexibilidad resulta muy útil, pero también es la causade que podamos colgar todo el sistema.

La intención principal en el uso de los punteros es comunicarnos más directamentecon el hardware, haciendo que el código se acelere. Desafortunadamente, estemodelo de tan bajo nivel hace que perdamos robustez y seguridad en la programacióny hace muy difíciles tareas como la liberación automática de memoria, la

defragmentación de memoria, o realizar programación distribuida de forma clara yeficiente.

Referencias en C++Las referencias se incorporaron a C++ en un intento de manejar punteros de C deforma más limpia y segura. Sin embargo, como no elimina los punteros, la verdad esque su propósito lo consigue a medias. Es más, podríamos decir que con lasreferencias C++, el lenguaje se vuelve más complicado y no es más poderoso queantes.

Las referencias deben ser inicializadas cuando se declaran y no se pueden alterar 

posteriormente. Esto permite incrementar la eficiencia en tiempo de ejecución sobre lasolución basada en punteros, pero es más por las deficiencias de los punteros que por las ventajas de las referencias.

REFERENCIAS EN JAVALas referencias en Java no son punteros ni referencias como en C++. Este hecho creaun poco de confusión entre los programadores que llegan por primera vez a Java. Lasreferencias en Java son identificadores de instancias de las clases Java. Unareferencia dirige la atención a un objeto de un tipo específico. No tenemos por quésaber cómo lo hace ni necesitamos saber qué hace ni, por supuesto, suimplementación.

Pensemos en una referencia como si se tratase de la llave electrónica de la habitaciónde un hotel. Vamos a utilizar precisamente este ejemplo del Hotel para demostrar eluso y la utilización que podemos hacer de las referencias en Java. Primero crearemos

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 25/29

 

la clase Habitacion, implementada en el fichero Habitacion.java, mediante instanciasde 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 código anterior sería el corazón de la aplicación. Vamos pues a construir nuestroHotel creando Habitaciones y asignándole a cada una de ellas su llave electrónica; talcomo muestra el código siguiente, Hotel1.java:public class Hotel1 {

public static void main( String args[] ) {Habitacion llaveHab1; // paso 1Habitacion llaveHab2;

llaveHab1 = new Habitacion( 222 ); // pasos 2, 3, 4 y 5

llaveHab2 = new Habitacion( 1144,3 );// ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^// A B y D C

}}

Para explicar el proceso, dividimos las acciones en los cinco pasos necesarios parapoder entrar en nuestra habitación. Aunque no se incluye, podemos tambiénconsiderar el caso de que necesitemos un cerrajero, para que cuando perdamos lallave, nos abra la puerta; y que en nuestro caso sería el garbage collector , que reciclala habitación una vez que se hayan perdido todas las llaves.

El primer paso es la creación de la llave, es decir, definir la variable referencia, por 

defecto nula.

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 26/29

 

El resto de los pasos se agrupan en una sola sentencia Java. La parte B en el códigoanterior indica al gerente del Hotel que ya dispone de una nueva habitación. La parteC llama al decorador de interiores para que "vista" la habitación según un patróndeterminado, para que no desentonen unas habitaciones con otras y no se pierdan lasseñas de identidad del hotel. El código electrónico que nos permitirá acceder a lahabitación se genera en la parte D, una vez conocido el interior de la habitación y seprograma en la llave en la parte A.

Si dejamos el ejemplo real a un lado y nos vamos a lo que ocurre en la ejecución delcódigo, vemos que el operador new busca espacio para una instancia de un objeto deuna clase determinada e inicializa la memoria a los valores adecuados. Luego invocaal método constructor de la clase, proporcionándole los argumentos adecuados. Eloperador new devuelve una referencia a sí mismo, que es inmediatamente asignada ala variable referencia.Podemos tener múltiples llaves para una misma habitación:. . .Habitacion llaveHab3,llaveHab4;

llaveHab3 = llaveHab1;llaveHab4 = llavehab2;

De este modo conseguimos copias de las llaves. Las habitaciones en sí mismas no sehan tocado en este proceso. Así que, ya tenemos dos llaves para la habitación 222 yotras dos para la habitación 1144.

Una llave puede ser programada para que funcione solamente con una habitación encualquier momento, pero podemos cambiar su código electrónico para que funcionecon alguna otra habitación; por ejemplo, para cambiar una habitación anteriormenteutilizada por un empedernido fumador por otra limpia de olores y con vistas al mar.Cambiemos pues la llave duplicada de la habitación del fumador (la 222) por la

habitación con olor a sal marina, 1144:. . .llaveHab3 = llaveHab2;Ahora tenemos una llave para la habitación 222 y tres para la habitación 1144.Mantendremos una llave para cada habitación en la conserjería, para poder utilizarlacomo llave maestra, en el caso de que alguien pierda su llave propia.

Alguien con la llave de una habitación puede hacer cambios en ella, y los compañerosque tengan llave de esa misma habitación, no tendrán conocimiento de esos cambioshasta que vuelvan a entrar en la habitación. Por ejemplo, vamos a quitar una de lascamas de la habitación, entrando en ella con la llave maestra:. . .

llaveHab2.camas( 2 );Ahora cuando los inquilinos entren en la habitación podrán comprobar el cambiorealizado:. . .llaveHab4.printData();

REFERENCIAS Y ARRAYSComo en C y C++, Java dispone de arrays de tipos primitivos o de clases. Los arraysen C y C++ son básicamente un acompañante para los punteros. En Java, sinembargo, 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 {

// Número de habitaciones por ala

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 27/29

 

public static final int habPorAla = 12;

public static void main( String args[] ) {Habitacion llavesMaestras[]; // paso 1llavesMaestras = new Habitacion[ habPorAla ]; // pasos 2-5

// ^^^^^^^^^^^^̂ ^ ^^^^^^^^^^^^^^̂ ^^^^^^^^^^^^

// A B, C, D y Eint 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-11llavesMaestras[i].printData();

}}

Cada paso en el ejemplo es semejante al que ya vimos antes. El paso 1 especifica queel 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 habitación,el gerente ordena construir un grupo contiguo de habitaciones. El número de llaves seespecifica entre corchetes y todas se crean en blanco.Los pasos 6 a 9 son idénticos a los pasos 2 a 5 del ejemplo anterior, excepto en queen este caso todas las llaves pasan a formar parte del juego maestro. Los números depiso se dan en miles para que cuando se creen las habitaciones, todas tengan elmismo formato. También todas las habitaciones de número par tienen una sola cama,mientras que las habitaciones impares tendrán dos camas.Los pasos 10 y 11 nos permiten obtener información de cada una de las habitaciones.

REFERENCIAS Y LISTASHay gente que piensa que como Java no dispone de punteros, resulta demasiadocomplejo construir listas enlazadas, árboles binarios y grafos. Vamos a demostrar quequien así piense está bastante equivocado.Retomemos el ejemplo de los arrays, y en vez de éstos vamos a usar una listadoblemente enlazada. El paquete de la lista simple se compone de dos clases. Cadaelemento 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 yuna referencia al nodo que le sigue. También contiene una referencia genérica acualquier clase que se use para proporcionar acceso a los datos que el usuarioproporcione.La lista enlazada, ListaEnlazada.java, contiene un nodo principio-fin y un contador para el número de nodos en la lista:public class ListaEnlazada {

public NodoListaEnlazada PrincipioFin;private int numNodos;// . . .}

El nodo especial PrincipioFin es sencillo, para simplificar el código. El contador se usapara optimizar los casos más habituales.Revisemos pues el código de nuestro Hotel, ahora Hotel3.java, que seráprácticamente el mismo que en el caso de los arrays:

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 28/29

 

public class Hotel3 {// Número de habitaciones por alapublic static final int habPorAla = 12;

public static void main( String args[] ) {ListaEnlazada llaveMaestra; // paso 1

llaveMaestra = new ListaEnlazada(); // 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 genérica; es

decir, una lista de llaves que cumple la convención que nosotros hemos establecido.Podríamos acelerar el tiempo de compilación metiendo la lista genérica ListaEnlazadadentro de una ListaEnlazadaHabitacion.

Los pasos 2 a 5 son equivalentes a los del primer ejemplo. Construimos einicializamos una nueva ListaEnlazada, que usaremos como juego de llaves maestras.Los pasos 6 a 9 son funcionalmente idénticos a los del ejemplo anterior con arrays,pero con diferente sintaxis. En Java, los arrays y el operador [] son internos dellenguaje. Como Java no soporta la sobrecarga de operadores por parte del usuario,tenemos que usarlo siempre en su forma normal.

La ListaEnlazada proporciona el método insertAt() que coge el índice en la lista, dondeel nuevo nodo ha de ser insertado, como primer argumento. El segundo argumento esel objeto que será almacenado en la lista. Obsérvese que no es necesario colocar moldeo alguno para hacer algo a una clase descendiente que depende de uno de suspadres.

Los pasos 10 a 12 provocan la misma salida que los pasos 10 y 11 del ejemplo conarrays. El paso 10 coge la llave del juego que se indica en el método getAt(). En estemomento, el sistema no sabe qué datos contiene la llave, porque el contenido de lahabitación es genérico. Pero nosotros sí sabemos lo que hay en la lista, así queinformamos al sistema haciendo un moldeado a la llave de la habitación (este casting generará un chequeo en tiempo de ejecución por el compilador, para asegurarse de

que se trata de una Habitacion). El paso 12 usa la llave para imprimir la información.

PUNTEROS C/C++ Y REFERENCIAS JAVAAhora que ya sabemos un poco más sobre las referencias en Java, vamos acompararlas con los punteros de C y C++.Los punteros en C y C++ están orientados hacia un modelo físico de funcionamiento.Es decir, que el modelo de punteros se mapea directamente sobre el modelohardware. Este modelo asume cosas como el no movimiento, lo que hace quemecanismos como la liberación automática resulten mucho menos eficientes osimplemente imposibles. Cosas como la distribución en redes y la   persistencia deobjetos son muy difíciles de conseguir en C y C++. Aunque no hay implementaciones

en Java, por ahora, para la persistencia y la distribución, la característica opaca de las

5/7/2018 Tutorial de UML y Java - slidepdf.com

http://slidepdf.com/reader/full/tutorial-de-uml-y-java 29/29

 

referencias en Java hace que el soporte para estas prestaciones sea mucho mássimple.

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 sería abortado por el compilador o por el sistema en ejecución (lanzando unaexcepción). C y C++ dejan la protección de memoria al sistema operativo, quesolamente tiene el recurso de generar un error del sistema cuando un puntero accedea una posición no válida. Por el contrario, con el uso de las referencias, Java nosprotege contra nuestras propias tendencias autodestructivas.