Manual Java avanzado

Page 1

JAVA 1. Introducción: Java es un lenguaje orientado a objetos, cuya sintaxis deriva de C y C++. Desde Mayo 2007, de acuerdo con las especificaciones del Java Community Process, Sun pone disponibles las tecnologías Java como software libre bajo licencia GNU (GNU General Public License). Un “Interprete” es un traductor que toma el programa fuente y lo traduce y ejecuta línea a línea, a diferencia de un “compilador” de un programa que traduce los programas escritos en lenguaje de alto nivel a lenguaje máquina.

Una API (Application Programming Interface) es un conjunto de funciones, procedimientos o clases que un sistema operativo, librería o servicio proporciona para soportar peticiones realizadas por un programa de ordenador.

La técnica de programación orientada a objetos incluye el encapsulamiento, modularidad, polimorfismo y herencia. -Conceptos de la OPP: ·Clase: Es un plano o molde que describe la naturaleza de algo. ·Objeto: Es un ejemplar de una clase. ·Instancia: Es el objeto creado a partir del una clase en tiempo de ejecución. ·Método: Son habilidades de un objeto. ·Paso de mensajes: Es el proceso mediante el cual un objeto envía datos a otro objeto o pide a otro objeto que invoque a un método. ·Abstracción: Es simplificar la realidad compleja mediante el modelado de una clase apropiada al problema, y trabajar al nivel más apropiado de herencia para un aspecto concreto del problema. ·Encapsulación: Se consigue especificando qué clases podría usar los miembros de un objeto. ·Herencia: Las “Subclases” son versiones más específicas de una clase, que hereda atributos y propiedades de las clases padres, y pueden introducir las suyas propias. 1


·Polimorfismo: Permite al programador tratar miembros de las clases derivadas como los miembros de las clases padres. -Las principales diferencias entre C/C++ y Java son las siguientes: ·Java no tiene punteros. ·Todo el código esta encapsulado en una clase. ·Java no tiene destructores. ·Java no incluye la sentencia goto. 2. Los Tipos de Datos: Java es un lenguaje fuertemente tipado, además no existe conversión automática entre tipos en la que haya un conflicto. -Los tipos de datos simples: Los tipos son byte, short, int long float, doublé, char y boolean; los cuales se agrupan el 4 grupos: ·Enteros: En este grupo están los tipos byte, short, int y long; que sirven para números con signo de valor completo. Además tienen todos signos. -int: Son 32 bits con signo, es el más utilizado en bucles e indexación de matrices. Siempre que tenga una expresión con enteros que incluya byte, short, int y números literales, la expresión completa promociona a int antes de realizar el cálculo. Java usa el complemento a2. -byte: Es el tipo entero más pequeño (8 bits con signo). Son utilizadas cuando trabajamos con un flujo de datos recibido desde una red o un archivo. -short: Es un tipo de 16 bits con signo. Es el tipo de datos menos utilizado. -long: Está formado por 64 bits con signo. Es el tipo de dato más grande y se usa para operaciones aritméticas grandes. ·Números en coma flotante: Este grupo incluye los tipos float y double que representan números con precisión fraccionaria. -float: Está formado por el primer bit de signo, los 8 siguientes de exponente y los 23 siguientes de mantisa. -double: Está formado por el primer bit de signo, los 11 siguientes de exponente y los 53 restantes para la mantisa; en total 65 bits. ·Caracteres: Corresponden al tipo char. -char: Tienes una longitud de 2 bytes. Se usa la codificación UTF8, consiste en: ·Cualquier byte que comience con un bit 0 es un carácter de 1 byte ASCII ·Cualquier byte que comience por 110 es un carácter de 2 bytes. ·Cualquiera que comience por 1110 es un carácter de 3 bytes ·Por último, cualquier byte que comience por 10 será el segundo de un carácter multibytes ·Boolean: Es el tipo boolean, que es un tipo especial de valores lógicos. -boolean: Solo puede tomar dos posibles valores (true y false). Es el tipo que devuelven todos los operadores de comparación. -Literales: Un valor constante en Java se crea utilizando una representación literal de él. Pueden ser enteros, números en coma flotante, boolean y caracteres y tipo cadena. Los literales se identifican con letras mayúsculas para diferenciarlos de las variables. -Literales enteros: Son del tipo más utilizado. Se pueden poner en diferentes bases octal (07) y hexadecimal (0x7). -Literales en coma flotante: Se pueden escribir en notación estándar (3.1215, .666, 3.0f) y en notación científica (6.022E23, 314E-05, 2e+10f). -Literales booleanos. -Literales tipo carácter. -Variables: Es la unidad básica de almacenamiento. Se define mediante la combinación de un identificador, un tipo y un inicializador opcional.

2


-Conversión de tipos: Se puede asignar un valor de un tipo a una variable de otro tipo, siempre y cuando los dos tipos sean compatibles y no se pierda información, excepto que uses la conversión forzada o cast. 3. Operadores: -Aritméticos: Lo más destacado es que no se pueden utilizar con tipos booleanos y si se pueden usar con tipos char.

-Al nivel de bits: Se pueden aplicar a los tipos enteros.

-Relacionales: El resultado de estas operaciones es siempre de tipo booleano.

-Lógicos Booleanos: Operan únicamente con operandos booleanos.

-Asignación: Es un único signo igual (=). En Java funciona igual que en el resto de lenguajes de programación. 3


-Operador?: Su formato es “Expresión1?expresión2:expresión3”. -Precedencia de los operadores:

-Asociatividad: Todos los operadores binarios excepto los operadores de asignación se evalúan de izquierda a derecha. Los de asignación de derecha a izquierda. 4. Sentencias de Control: -Sentencias de selección: Permite la selección de distintos caminos de ejecución en función del resultado de una expresión o del estado de una variable. Estas son las siguientes: ·if: ·switch: if (condición){ switch(expresión){ sentencia1{ case valor1: }else{ secuencia de sentencias sentencia2; break; } case valor2: secuencia de sentencias break; case valorN: secuencia de sentencias break; default: secuencia de sentencias } -Sentencias de iteración: ·while: ·do-while: ·for: while(condición){ do{ for(inicializ.;condición;iteración){ cuerpo bucle cuerpo bucle Cuerpo } }while(condición); } -Sentencias de salto: ·break: Se usa en sentencias switch, para salir de bucles (evitar), una forma goto (evitar). ·continue. ·return: Devuelve explícitamente desde un método, provoca que el control del programa vuelva al método llamante. 5. Matrices: Son grupos de variables del mismo tipo a las que se hace referencia con el mismo nombre. -Matrices unidimensionales: Colección de variables del mismo tipo accesible mediante un índice. (int tabla = new int [10]; ó int tabla[] = {0,1,2,3,4};) -Matrices multidimensionales: Se necesitan dos índices para el acceso a la matriz. Los índices de la izquierda identifica a la fila y el de la derecha a la columna. 4


·Las formas de crear matrices es la siguiente: int tabla [] = new int [10] [5]; int m [] [] = {{0,1,2,3},{1,2,3,4},{2,3,4,5},{3,4,5,6}}; También se puede usar una forma alternativa para declararla: Int[] tabla = new int[3]; Char[][] caracteres = new char [3][4]; ·Cadenas: Son secuencias de caracteres. El método main usa string en su declaración (args[]). Ejemplos de cadenas son las siguientes: string s = ”Hola”; string s = new string (“Hola”); Una propiedad importante que tienen las cadenas en Java que no existían en C/C++ es la concatenación automática de cadena. string s3 = s2 + s1; 6. Clases: La clase es el núcleo de Java, además de constituir la base de la programación orientada a objetos en Java. Cualquier concepto que desee implementar en un programa Java debe ser encapsulado en una clase. La clase representa un nuevo tipo de dato, una vez definido, este nuevo tipo se puede utilizar para crear objetos de ese tipo. Una clase se declara utilizando la palabra clave class. La forma general de una clase es la siguiente: class nombre_de_clase{ tipo variable_de_instancia1; . . tipo variable_de_instanciaN; tipo nombre_de_método1 (lista_de_parametros){ cuerpo del método } . . tipo nombre_de_métodoN (lista_de_parametros){ cuerpo del método } } ·Los objetos: Para obtener objetos de una clase es necesario realizar dos pasos: -Declarar una variable del tipo de la clase. -Obtener una copia física y real del objeto y asignarla a esa variable. Esto se hace con el operador new. -El ciclo de vida de vida de un objeto es el siguiente (mesa m1 = new Mesa ();): ·Creación del objeto: -Declaración. -Instanciación. -Inicialización. ·Uso del objeto. ·Eliminación. ·El operador new: Permite una asignación dinámica en tiempo de ejecución. Si la maquina no tiene disponible la capacidad pedida con new se produce una excepción. Su sintaxis es la siguiente: variable = new nombre_de_la_clase (parametros); De forma que dependiendo de los parámetros se invoca a un constructor u otro de la clase.

5


·Constructor: Define que ocurre cuando se crea un objeto de una clase, si no se ha especificado explícitamente el constructor, entonces Java automáticamente utiliza un constructor por defecto. Tiene el mismo nombre que la clase y está dentro de esta. ·Métodos: Su sintaxis general es la siguiente: tipo nombre_de_metodo (lista_de_parametros) { cuerpo del método } El tipo especifica el tipo de dato devuelto por el método, sino devuelve nada el tipo es void. Para devolver el valor dentro del método se usa la sentencia return expresión;. ·this: Permite hacer referencia al objeto que lo invocó, puede ser utilizada entro de cualquier método para referirse al objeto actual. ·Recogida de basura: Cuando no hay ninguna referencia a un objeto determinado, se asume que ese objeto no se va a utilizar más, y la memoria ocupada por el objeto se libera. No hay necesidad explícita de destruir los objetos, como sucede en C++. La recogida de basura ocurre de forma esporádica durante la ejecución de un programa y no se produce simplemente porque uno o más objetos hayan dejado de utilizarse, dependiendo de las diferentes implementaciones de los intérpretes de Java siguen un procedimiento diferente cuando realizan la recogida de basura. Los objetos que ya no se van a seguir usando, tenemos que llamar al método finalize, cuyo formato es el siguiente: Protected void finalize () { Código de finalización } Además se puede pedir la ejecución del recolector de basura en cualquier momento con la siguiente línea de código: system.gc () 7. Polimorfismo: Es la capacidad que tienen los objetos de una clase de responder al mismo mensaje o evento en función de los parámetros utilizados durante su invocación. La sobrecarga de métodos la utiliza Java para implementar el Polimorfismo. Se puede aplicar tanto a métodos como a tipos de datos. De forma que los métodos polimórficos son aquellos que pueden evaluarse o ser aplicados a diferentes tipos de datos de forma indistinta y los tipos de datos polimórficos son aquellos tipos que contienen al menos un elemento cuyo tipo no está especificado. -Sobrecarga: Es la posibilidad de tener dos o más funciones con el mismo nombre pero funcionalidad diferente dependiendo de los parámetros de entrada.

·Sobrecarga de constructores: Se trata de usar la sobrecarga pero aplicado a constructores de clases, los cuales tienen el mismo nombre de la clase a construir y diferentes parámetros de entrada.

6


-Objeto como par谩metro: 路Por valor:

路Por referencia:

7


-Devolución de objetos:

-Recursividad: Es la forma en la cual se especifica un proceso basado en su propia definición:

-Stactic: Definición de un miembro de una clase que será utilizado independientemente de cualquier objeto de esa clase. Las variables de instancia estáticas son variables globales. Los métodos estáticos solo pueden llamar a métodos estáticos y no pueden referirse a this o super. -Final: Su contenido no puede ser modificado. -Argumentos en la línea de comandos: El acceso se raliza mediante cadenas almacenadas en la matriz de string que se pasa a main (). 8. Herencia: Las subclases son versiones más especializadas de una clase, que hereda atributos y propiedades de las clases padres, y pueden introducir las suyas propias.

8


-Herencia múltiple: Es una herencia de más de una clase antecesora, con las antecesoras sin ser antecesoras de las otras. No siempre se usa y es difícil de implementar. -Variable de la superclase referenciado a un objeto de la subclase: Este es una de las propiedades más usadas que tiene la herencia y que se aplicarán de forma reiterada. -Super: Una clase puede referirse a su superclase inmediata, mediante la palabra clave super. Se puede usar para: ·Llamar al constructor de la superclase: Debe ser la primera línea de todas, su sintaxis es la siguiente: super (listaparametros); ·Para acceder a un miembro de la superclase que ha sido ocultado por un miembro de la subclase que se llama igual. Es similar a this. Su formato es super.miembro. -Jerarquía multinivel: Se pueden construir jerarquías que contengan tantos niveles de herencia como se desee. -Orden de ejecución de los constructores: Se ejecutan en orden de derivación desde la superclase hasta la subclase. La sentencia super (parámetrosentrada) tiene que ser la primera sentencia que se ejecute dentro del constructor de la subclase, sino se usa entonces se ejecuta el constructor por defecto. -Sobrescritura de métodos: Se dice que un método de la subclase sobrescribe al método de la superclase en una jerarquía de clases, cuando un método de una subclase tiene el mismo nombre y tipo que un método de su superclase. -Sobrecarga de métodos: Se dice que un método de la superclase está sobrecargado cuando en la subclase existe un método con el mismo nombre al de la superclase pero con distintos parámetros de entrada. -Selección de método dinámico: Es el mecanismo mediante el cual una llamada a una función sobrescrita se resuelve en tiempo de ejecución en lugar de durante la compilación. Es muy importante, ya que es la forma que tiene Java de implementar el polimorfismo durante la ejecución. Se utilizan dos cosas: ·Una variable de referencia de la superclase pudiendo referirse a un objeto de la subclase. ·Sobrescritura de método.

-final: ·Para atributos no permite que se cambie su valor. ·Para clases no permite que sea superclase. ·Para métodos no se permite sobrescritura. -Object: Es la clase raíz de todo el árbol de la jerarquía de clases Java. Esta proporciona métodos de utilidad general que pueden utilizar todos los objetos:

9


-protected: Modificador de acceso. Es visible por todas las subclases. -Clases abstractas: Define una superclase que declara la estructura de una abstracción sin proporcionar implementación completa de todos los métodos. Deja a cada subclase la tarea de completar los detalles. Además no se pueden instanciar clases abstractas. Su sintaxis es la siguiente: ·Para métodos: abstrac tipo nombre (listaparametros); ·Para clases: abstrac class nombre {Codigo} -Herencia en UML: -Clases abstractas en UML:

9. Paquetes: Es un mecanismo para organizar de forma estructurada las clases. Todas las clases incorporadas a Java están almacenadas en paquetes. -Definición: Un ejemplo de sentencia para la creación de un paquete nuevo es la siguiente: package java.awt.Image; De forma que este paquete tiene asociado una estructura de directorios. -Variable de entorno CLASSPATH: La localización que el compilador de Java considera como raíz de cualquier jerarquía de paquetes está controlada por CLASSPATH. -Protección de acceso:

10


-Importar paquetes: La sentencia import , importa un paquete determinado al programa en el que aparezca. Un ejemplo de esta sentencia es la siguiente: import java.util.Date; import java.io.*; import java.lang.*; -Modelado UML de un paquete:

10. Interfaces: Una interfaz es similar a una clase abstracta pero con ningún método implementado. De forma que cuando se dice que una clase tiene una interfaz es que la propia clase implementa los métodos definidos en la interfaz. Además las clases abstractas también pueden implementar interfaces. De esta forma Java admite la resolución de método dinámica. -Definición de una interfaz: Acceso interface nombre{ Tipo var_final1=valor; … Tipo var_finalN=valor; Tipo_devuelto metodo1 (lista_de_parametros); … Tipo_devuelto metodoN (lista_de_parametros); } -Herencia con interfaces: Una interfaz puede heredar otra utilizando la palabra clave extends. De forma que la sintaxis es la misma que se usa con clases. Cuando una clase implementa una interfaz que hereda de otra, tiene que implementar todos los métodos definidos en la cadena de herencia de la interfaz. -Interfaces en UML: Es un elemento estructurar que describe el comportamiento visible externamente de ese elemento. Esto se representa de la siguiente forma en UML:

·Diagrama de casos de uso: Es una representación gráfica de parte o el total de los actores y casos de uso del sistema, incluyendo sus interfaces. El actor es una entidad que utiliza alguno de los casos de uso del sistema. Existen 3 tipos de relaciones entre casos de uso: -Comunica: Relación (asociación) entre un actor y un caso de uso que denota la participación del actor en dicho caso de uso. -Usa: Relación de dependencia entre dos casos de uso que denota la inclusión del comportamiento de un escenario en otro. -Extiende: Relación de dependencia entre dos casos de uso que denota que un caso de uso es una especialización de otro.

11


11. Excepciones: -Introducción: Se usan cuando hay una condición anormal que surge en una secuencia de código durante la ejecución. -Excepciones en Java: Cuando surge una excepción excepcional, se crea un objeto que representa la excepción y se envía al método que ha provocado la excepción, este método puede elegir gestionar la excepción él o pasarla. En algún punto del programa son capturas las excepciones y gestionadas. -Generación de excepciones: Pueden ser generadas por el intérprete de Java o el propio código. Las excepciones se gestionan con 5 palabras claves (try, catch, throw, throws y finally). -Funcionamiento: Las sentencias del programa que se quieren controlar se incluyen en un bloque try; si se produce una excepción dentro del bloque, esta es lanzada. El código puede capturar esta excepción, utilizando catch, y tratarla de una manera racional. Para generar una excepción manualmente se utiliza la palabra clave throw. Además cualquier excepción que se lanza fuera de un método debe ser especificada como tal utilizando la sentencia throws. Cualquier código que se tenga que ejecutar antes de que finalice un método se introduce en un bloque finally. La sintaxis es la siguiente: try { //bloque código } catch (TipoExcepcion1 ex0b) { //gestor de excepciones para TipoExcepcion1 } catch (TipoExcepcion2 ex0b) { //gestor de excepciones para TipoExcepcion2 } finally { //Se ejecuta antes de que termine el bloque try } Todas las excepciones son subclase de la clase Throwable (lanzable), existiendo justo después en la jerarquía dos tipos de excepciones Exception y Error. ·Exception: Esta clase se utiliza para condiones excepcionales que los programas de usuario deberían capturar. Es la clase de partida que usaremos para crear nuestras propias excepciones. Una subclase importante de Exception es RutimeException, la cual se produce por errores en ejecución. ·Error: Define las excepciones que no se suelen capturar en los programas en condiciones normales. Las utiliza el intérprete de Java para iniciar lo que tiene que hacer con los errores que se producen en tiempo de ejecución. Suelen corresponder a fallos catastróficos que no pueden ser gestionados por el propio programa. ·Bloques UML de las clases antes nombradas:

12


-Descripción de una excepción: La clase Throwable sobrescribe el método toString () definido por la clase Object, devolviendo una cadena que contiene la descripción de la excepción tratada. Además se puede mostrar esta descripción simplemente pasando la excepción como argumento de una sentencia println (). -Clausulas catch múltiples: La misma secuencia de código puede activar más de un tipo de excepción, de esta forma se puede especificar dos o más cláusulas catch, cada una para capturar un tipo distinto de excepción. Cuando se lanza una excepción, se mirar por orden las sentencias catch y se ejecuta la primera que coincida con el tipo de excepción que se ha producido. -Sentencias try anidadas: Las sentencias try pueden estar anidadas, de forma que cuando se produce una excepción determinada se examinan todos los catch del nivel más interno al más externo en busca de la gestión de esa excepción y si no aparece la gestiona el interprete de Java. -Throws: Esta sentencia sirve para lanzar una excepción de forma explícita. La forma de este comando es el siguiente: throw Instanciathrowable; La Instanciathrowable tiene que ser un objeto de tipo Throwable o una subclase de Throwable. ·La forma de obtener un objeto Throwable es utilizando un parámetro en la cláusula catch o creando uno con el operador new. -Uso de los constructores: Todas las excepciones que están en el núcleo de Java tienen dos constructores uno sin parámetros y otro que tiene un parámetro de tipo cadena, seria así: throw new NullPointerException (“demo”); Cuando vamos a imprimir este objeto aparece la cadena que ponemos cuando construimos el objeto. -Throws: Si un método es capaz de provocar una excepción que no maneja él mismo, debe especificar este comportamiento para que los métodos que lo llaman puedan protegerse frente a esta excepción. Su sintaxis es el siguiente: Tipo nombre_del_metodo (lista_de_parametros) throws lista_de_excepciones { //Cuerpo del método } La lista de excepciones va separada por comas y es necesario ponerlo excepto que lace excepciones del tipo Error o RutimeException. -Finally: Sirve principalmente para cerrar descriptores de archivo y liberar cualquier otro recurso que se hubiese asignado al comienzo de un método con la intención de liberarlo antes de terminar. Es opcional esta clausula, sin embargo cada sentencia try necesita, al menos, una clausula catch o finally. Crea un bloque de código que se ejecuta después del bloque try/catch y antes del siguiente bloque try/catch, de forma que se ejecuta justo antes del final del método. 12. Programación Multihilo: -Introducción: Un programa multihilo contiene dos o más partes que pueden ejecutarse de forma concurrente. Cada parte de ese programa se llama hilo (Thread) y cada hilo establece un camino de ejecución independiente. Esta es una forma especializada de multitarea aparte de la basada en procesos. ·Multitarea basada en procesos: Un proceso es un programa que se está ejecutando en una computadora. Son muy pesados y es costoso el cambio de contexto de un proceso a otro. ·Multitarea basada en hilos: Es la unidad de código más pequeña que se puede seleccionar, requiere menos recursos, son más ligeros ya que comparten cooperativamente el mismo proceso pesado, además la comunicación entre ellos es ligera. -El modelo de hilo en Java: Java utiliza hilos para permitir que el entorno en su globalidad sea asíncrono. ·Estados de los hilos: -Ejecutandose 13


-Preparado para ejecutarse tan pronto como disponga de tiempo de CPU. -Suspenderse si se está ejecutando. -Reanudarse estando suspendido. -Bloqueado esperando un recurso determinado. -Detenido no pudiendo continuar su ejecución mas tarde. El ciclo de vida de un hilo es el siguiente:

-Prioridades de los hilos: El intérprete de Java utiliza prioridades para determinar cómo debe tratar cada hilo con respecto a los demás. Este es un valor entero que asigna un orden de ejecución cuando los hilos estén preparados para ejecutarse o ejecutándose. La prioridad de un hilo se utiliza para decidir cuándo se pasa a ejecutar otro hilo, a esto se denomina cambio de contexto. ·Reglas para el cambio de contexto: -Un hilo puede ceder voluntariamente el control: Esto se hace por abandono explícito, al quedarse dormido o al bloquearse en espera de un recurso pendiente. En este caso, se examinan todos los hilos restantes y se selecciona para su asignación a la CPU aquél que, estando listo para su ejecución, tenga la prioridad más alta. -Un hilo puede ser desalojado por otro con prioridad más alta. -Sincronización: Los hilos permiten y potencian el comportamiento asíncrono de los programas, la forma de forzar el sincronismo donde sea necesario es haciendo que coincidan en el tiempo dos o más hilos de ejecución. Java implementa una versión de modelo clásico de sincronización entre procesos, llamado monitor. ·Monitor: Es un mecanismo de control que fue definido en primer lugar por C.A.R. Hoare y que puede entenderse como una pequeña caja en la que sólo cabe un hilo. Una vez que un hilo entra en el monito, los demás deben esperar a que éste salga. Se utilizan principalmente para proteger un bien compartido y evitar que sea manipulado por más de un hilo simultáneamente. Cada objeto tiene su propio monitor implícito en el que entra automáticamente cuando se llama a uno de los métodos sincronizados del objeto. Una vez que un hilo está dentro de un método sincronizado, ningún otro hilo puede llamar a otro método sincronizado del mismo objeto. -Creación de un hilo: Hay dos formas de crear un hilo: ·Implementando la interfaz Runnable: Permite utilizar herencia de cualquier otra clase diferente. A continuación un ejemplo que se aprecia cómo crear un hilo con este método

14


·Extendiendo la clase Thread: La clase Thread define varios métodos que pueden sobrescribir las clases derivadas, el único que tiene que ser sobrescrito es run (), que es exactamente el mismo que es necesario para implementar la interfaz Runnable. Un ejemplo de este método es el siguiente:

15


-Creaci贸n de m煤ltiples hilos: Se pueden generar tantos hilos como se necesite.

16


-Comunicación entre hilos: Una forma de determinar si un hilo ha terminado de ejecutarse es llamando al método de la clase ThreadisAlive (): final boolean isAlive () throws InterruptedException; Devuelve true si el hilo al que se hace referencia está todavía ejecutándose y devuelve false en caso contrario. El método join () se utiliza para esperar la finalización de un hilo. final void join () throws InterruptedException; Este método espera hasta que finalice el hilo sobre el que se llama. Su nombre surge de la idea de que el hilo llamante espera hasta que el hilo especificado se reúne con él. Hay otras formas de join () que permiten especificar el tiempo máximo que se quiere esperar la finalización de un hilo. final void join (long millis) throws Iterrupted Exception final void join (long millis, int nanos) throws InterruptedException Ejemplo de comunicación entre hilos:

17


-Suspensión y reanudación de un hilo: ·Son dos métodos marcados como “Deprecated”: final void resume (); final void suspend (); ·La clase Object proporciona los siguientes métodos: void wait (); void wait (long timeout); void wait (long timeout, int nanos); El método anterior provoca que el hilo actual espere hasta que otro hilo invoque a notify () o notifyAll (). void notify () void notifyAll () El método notify despierta un solo hilo que estaba esperando en este monitor del objeto. Y el método notifyAll despierta todos los hilos que estaban esperando en este monitor del objeto. -Prioridad: El planificador de hilos utiliza las prioridades de los hilos para determinar cuándo debe permitir que se ejecute cada hilo. Si dos hilos están preparados para ejecutarse se ejecutará el de mayor prioridad. La prioridad es un valor entero (5 por defecto) comprendido entre Thread.MIN_PRIORITY y Tread.MAX_PRIORITY, estos se pueden configurar con los siguientes métodos: final void setPriority (int nivel); final int getPriority (); -Sincronización: Cuando dos o más hilos necesitan acceder de manera simultánea a un recurso compartido, necesita asegurarse de que sólo uno de ellos accede al mismo en un instante dado. El proceso mediante el cual se consigue esto se llama sincronización. Un monitor es un objeto que se utiliza como cerrojo exclusivo, o mutex, de forma que sólo uno de los hilos puede ser el propietario del monitor en un instante dado. Cuando un hilo adquiere un mutex, se dice que ha entrado en el monitor; los restantes hilos que estuviesen intentando ecceder al monitor bloqueado quedan en suspensión hasta que el primer hilo salga del monitor. Se dice que estos hilos están esperando al monitor, además un hilo que posea un monitor puede volver a acceder al mismo si así lo desea. ·La sincronización del código se puede realizar mediante la palabra clave synchronized (sincronizado).

18


Ejemplo de código sincronizado y sin sincronizar: Código no sincronizado:

Para solucionar la sincronización habría que cambiar la siguiente línea:

Esto evitará que otros métodos puedan acceder a llama () mientras otro lo está utlizando. La salida del programa nueva sería la siguiente:

Otra forma es sincronizar un objeto en un conjunto de sentencias:

-Modelado UML para la programación multihilo, las clases activas: Una clase activa es una clase cuyos objetos tiene uno o mas procesos o hilos que constituyen flujos de control independientes pero concurrentes con otros flujos de control (con los que muy probablemente se deberán sincronizar).

13. Convenciones al código: (No completo, solo lo más importante): -Nombres de ficheros: Tipo de archivo Extensión Fuente Java .java Bytecode de Java .class GNUmakefile El nombre preferido para ficheros “make”. Usamos gnumake para construir nuestro software README El nombre preferido para el fichero que resume los contenidos de un directorio particular 19


-Organización de los ficheros: ·Ficheros fuente Java: Cada fichero fuente Java contiene una única clase o interfaz pública que debe ser la primera del fichero. Los ficheros fuentes Java tiene la siguiente ordenación: -Comentarios de comienzo: Todos los ficheros fuente deben comenzar con un comentario (al estilo C) en el que se muestra el nombre de la clase, información de la versión, fecha, y copyright. -Sentencias package e import: La primera línea de los ficheros fuente Java que no sea un comentario, es la sentencia package, y después de esta las sentencias import. -Declaraciones de clases e interfaces: Orden Partes de la declaración de una clase o Notas interfaz 1 Comentario de documentación de la clase o interfaz (/**…*/) 2 Sentencia class o interface 3 Comentario de implementación de la Debe contener cualquier información clase o interfaz si fuera necesario aplicable a toda clase o interfaz que no (/*…*/) era apropiada para estar en los comentarios de documentación de la clase o interfaz 4 Variables de clase (static) Primero las variables de clase public, después las protected, después las de nivel de paquete y después las prívate. 5 Variables de instancia Primero las public, después las protected, después las de nivel de paquete, y después las prívate. 6 Constructores 7 Métodos Estos métodos se deben agrupar por funcionalidad más que por visión o accesibilidad. -Indentación: Se deben emplear cuatro espacios como unidad de indentación, y los tabuladores deben ser exactamente cada ocho espacios. Se debe evitar las líneas de más de 80 caracteres. -Comentarios: Existen dos tipos, comentarios de implementación y comentarios de documentación. ·Comentarios de implementación: /*…*/ y //

20


·Comentarios de documentación: /**…*/

-Declaraciones: ·Se recomienda una declaración por línea. -Inicialización: ·Las variables locales donde se declaran salvo si el valor inicial depende de algunos cálculos previos. -Declaración de clases e interfaces: ·No se puede dejar un espacio en blanco entre el nombre de un método y el paréntesis. 14. Java.lang: -Introducción: Contiene las clases para los objetos fundamentales de Java, además este paquete se importa automáticamente en cualquier programa java que se realice. Este paquete contiene 28 clases, 4 interfaces y 5 paquetes. ·Clases generales:

-Gestión de cadenas: Para ello existen dos clases la string y la stringBuffer. ·string: Secuencia de caracteres (char de 16 bits) con longitud fija y no modificable. Para instanciar un objeto de esta clase es igual que las demás.

21


·stringBuffer: Secuencia de caracteres con longitud variable y modificable, sus constructores son los siguientes: -stringBuffer (): Reserva 16 caracteres. -stringBuffer (int dim): Reserva dim caracteres. -stringBuffer (string str): Reserva el tamaño del string mas 16 caracteres. ·El método append de stringBuffer: Este método lo usa el compilador cuando ponemos una instrucción de este tipo: x=”a”+4+”c”. Siendo este expresión final equivalente a: stringBuffer().append(“a”).append(4).append(“c”).toString(); -Number: Es una clase abstracta, superclase de BigDecimal (java.math), BigInteger (java.math), Byte, Double, Float, Integer, Long y Short. Sus métodos son los siguientes:

-Envolventes a los tipos de datos simples: ·Boolean ·Integer: Tiene como atributos los siguientes: -static int MAX_VALUE ( ) -static int MIN_VALUE ( ) -static Class TYPE (Instancia de Class representado a Integer) -Constructores: ·Integer (int value) ·Integer (String s) ·Character -Programación del sistema: Permite interactuar con el sistema operativo. ·System: -Atributos: ·static PrintStream err: Flujo de salida de error estándar. ·static InputStream in: El flujo de entrada estándar. ·static PrintStream out: El flujo de salida estándar. -Métodos estáticos para el manejo del sistema: ·static void srraycopy (Object src, int srcPos, Object dest, int desPos, int length): Este método copia una array de un lugar a otro. ·static long currentTimeMillis (): Devuelve la hora actual que se ejecuta en le Java Virtual Machine. ·static void exit (int status): Termina el hilo actual que se ejecuta en el Java Virtual Machine. ·static void gc (): Ejecuta el garbage collector. ·Rutime: Toda aplicación Java tiene una instancia de la clase Rutime que permite a la aplicación tener una interfaz con el entorno en el que se ejecuta. -Métodos: ·long freeMemory () / long totalMemory (): Devuelve la memoria libre/total de la Máquina Virtual de Java. ·static Rutime getRutime (): Devuelve el objeto de ejecución asociado con la aplicación Java actual. ·Process exec (String command)) ·Process exec (String [] cmdarray) ·Process exec (String [] cmdarray, String [] envp) ·Process exec (String [] cmdarray, String [] envp, File dir) ·Process exec (String [] cmd, String [] envp) ·Process exec (String cmd, String [] envp, File dir) 22


Void exit (int status) ·Process: El método Rutime.exec crea un proceso nativo y devuelve una instancia de una subclase de Process que puede ser usado para controlar el proceso y obtener información. -Métodos: ·abstract int waitFor (): Hace que el hilo actual espere, si fuera necesario, hasta que el proceso representado mediante este objeto Process se termine. ·abstract void destroy (): Mata el subproceso. ·abstract int exitValue (): Devuelve el valor de salida del subproceso. ·Flujos del subproceso: -abstract InputStream getErrorStream (): Flujo del subproceso de error. -abstract InputStream getInputStream (): Flujo del subproceso de entrada. -abstract OutputStream getOutputStream (): Flujo del subproceso de salida. 15. Entrada/Salida: -Introducción: ·El paquete java.io define la Entrada/Salida en términos de stream (o flujos). ·Un flujo es una secuencia ordenada de datos que contiene fuente/destino. ·Los flujos son abstracciones que proceden o consumen información. ·Esto te abstrae de los detalles del Sistema Operativo. -Clasificación de los flujos: Existen dos tipos de flujos de caracteres y de byte. ·Caracteres: Son de 16 bits de tipo Unicode, principalmente se usa para transmitir texto. ·Bytes: Son de 8 bits y principalmente se usar para el intercambio de datos binarios (imagen, …). Estos no transportan adecuadamente los caracteres. ·Casi todo flujo de entrada tiene su correspondiente de salida. ·La mayoría de flujos de caracteres tiene su equivalente de byte. -Clases del paquete java.io: Consta de clases generales con una clasificación de bytes y caracteres, lectura y escritura, clases e interfaces. ·Clasificación de los flujos: -Filter: Operaciones de filtrado y construcción filtros encadenados. -Buferred: No necesita acceder al sistema de archivos en cada invocación. -Piped: Diseñados por parejas. -ByteArray: Usan una matriz de bytes. -CharArray: Usan una matriz de chars. -String: Usan una cadena de caracteres. -Print: Impresión en formato legible. -LineNumberReader: Cuenta líneas. -SequenceInputStream: Da un flujo de varios. -Pushback: Envía datos de retorno. -StreamTokenizer: Divide un flujo en tokens.

23


·Flujos de bytes:

·Flujos de caracteres:

-OutputStreamWriter y InputStreamReader: Realizan conversión entre flujos Unicode y flujos de bytes usando una codificación. ·InputStreamReader: Recibe bytes y produce caracteres Unicode. ·OutputStreamWriter: Recibe caracteres y bytes. ·Por defecto, usan la codificación de la plataforma. ·FileReader y FileWriter son subclases: Ayudan a la lectura y escritura de archivos locales usando la codificación Unicode. -Filter: FilterInputStream, FilterOutputStream, FilterReader, FilterWriter.

24


·Los flujos de entrada contienen algún otro lujo de entrada que se usa como fuente de datos básica, posiblemente transformando los datos o proporcionando funcionalidades adicionales. -ByteArray, CharArray y String: ·Uso de array de bytes (char) o String como fuente o destino de flujos. ·Para ellos se usan las clases: ByteArrayInputStream, ByteArrayOutputStream, CharArrayReader, CharArrayWriter, StringReader, StringWriter. -Print: ·PrintStream: Añade funcionalidades para otro flujo de salida, para imprimir la representación de varios valores de datos de forma apropiada. ·PrintWriter: Imprime representaciones formateadas de objetos para flujos de salida de texto. -Buffered: Almacena datos en un bufer. Sus clases principales son. ·BufferedInputStream: Añade funcionalidades para otro flujo entrada, la habilidad para buferar la entrada y para soportar mark y los métodos de reset. ·BufferedOutputStream: Esta clase implementa un flujo de salida buferado. ·BufferedReader: Lee texto de un flujo de caracteres de entrada, buferando los caracteres para proporcionar una lectura eficiente de los caracteres, arrays y líneas. ·BufferedWriter: Escribe texto para un flujo de salida de caracteres, buferando los caracteres para proporcionar una escritura eficiente de un solo carácter, array y cadena. -Piped: ·PipedInputStream: Un flujo de entrada conducido debería conectarse a un flujo de salida conducido. El flujo de entrada proporciona bytes de datos que son escritos en un flujo de salida conducido. ·PipedOutputStream: Es un flujo de salida conectado a su correspondiente de entrada para crear un conducto de comunicación. ·PipedReader: Es un flujo de entrada de caracteres conducido. ·PipedWriter: Es un flujo de caracteres de salida conducido. -LineNumberReader: Es un flujo de entrada de caracteres buferados que mantiene el número de líneas. Esta clase proporciona los siguientes métodos: ·setLineNumber (int) y getLineNumber (): Sirven para configurar y obtener la línea actual. ·Por defecto, la línea comienza en 0. Este número se incrementa al leer y puede modificarse con setLineNumber (int). ·Se considera que una línea termina mediante el carácter nueva línea (‘\n’), un retorno de carro (‘\r’), o un retorno de carro seguido inmediatamente de un (‘\n’). -Pushback: Permite enviar de vuelta caracteres después de leerlos. Sus métodos son: ·void unread (char [] cbuf) ·void unread (char [] cbuf, int off, int len) ·void unread (int c) -DataInput y DataOutput: ·Los flujos Data soportan entrada/salida binaria de los tipos de datos primitivos (boolean, char, byte, short, int, long, float y doublé) así como para los String. ·Todos estos flujos implementan las interfaces DataInput o DataOutput, para la entrada y salida respectivamente. -File: Las clases son las siguientes: ·FileInputStream: Obtiene bytes de entrada de un fichero en un sistema de ficheros. ·FileOutputStream: Es un flujo de salida para escribir datos a un File o a un FileDescriptor. ·FileReader: Clase para leer ficheros de caracteres. ·FileWriter: Clase para escribir ficheros de caracteres. 25


-RandomAccessFile: ·Son archivos de acceso aleatorio. Se comportan como un gran array de bytes almacenados en el sistema de archivos. Con un puntero de archivo. Leen bytes desde donde indican el punterío y lo dejan donde acaba. Pueden ser de lectura y escritura. No es subclase de InputStream, OutStream, Reader y Writer. -Serialización: Transforma un objeto en un flujo de datos con la posibilidad de reconstruirlo posteriormente el objeto. Su principal uso es la transferencia en la red. Las clases e interfaces asociadas son: ·Serializable ·ObjectOutputStream ·ObjectInputStream ·ObjectOutput ·ObjectInput ·Externalizable 16. Comunicaciones en red: -Introducción: Se puede realizar las comunicaciones con cualquier lenguaje, en el caso de java para ello se usa el paquete java.net. Para ello se implementa con el concepto de sockets, estando el programa en java en la capa de aplicación del modelo OSI. ·TCP: Son comunicaciones fiables, tiene establecimiento de conexión y comunicaciones en ambos sentidos. El orden en que se envían y reciben los datos es crítico. ·UDP: No está orientada a conexión, además de no garantizarse la entrega. ·Puertos: Los puertos multiplexan los datos de entrada en un equipo. Los puertos van desde el 0 al 65535, estando algunos de ellos normalizados para algún fin. ·DNS: Existe una jerarquía de nombres asociada a los números que representan las direcciones que se conoce como DNS. ·El paquete java.net: -Socketlmpl: Clase abstracta. -Socket: Implementa un cliente socket. -ServerSocket: Implementa un servidor socket. -SoketPermission: Acceso a la red vía socket. -URL: Puntero a un recurso en la world wide web. -URLConnection: Clase abstracta. Superclase para comunicación entre aplicaciones y URL. -URLClassLoader: Carga clases y recursos. -URLDecoder: Convierte el formato MIME en String. -URLEncoder: Convierte el formato String en MIME. -URLStreamHandler: Clase abstracta. -HttpURLConnection: Un URLConnection con soporte para características http. -JarURLConnection: Uso de archivos JAR. -ContentHandler: Clase abstracta. -DatagramPacket: Clase que representa un datagrama. -DatagramSocket: Tx/Rx de datagramas en un socket. -MulticastSocket: Tx/Rx de paquetes IP multicast. -InetAddress: Representa una dirección de IP. ·Encapsula direcciones IP y sus nombres. ·No tiene constructores visibles, pero se proporcionan métodos estáticos: -static InetAddress getLocalHost (): Devuelve el objeto que representa al nodo local. -static InetAddress getByName (String nomNodo): Devuelve el nombre del nodo que se le pasa. Puede lanzar UnknownHostException. 26


-static InetAddress[] getAllByName (String nomNodo): Devuelve una matriz que representa todas las direcciones en las que se traduce un nombre dado. Puede lanzar UnknownHostException. ·Métodos no estáticos: -string getHostName (): Devuelve como cadena el nombre del nodo. -byte[] getAddress (): Devuelve una matriz de bytes de cuatro elementos que representa la dirección en internet del objeto en el “orden de bytes de la red”. -string toString (): Devuelve el nombre del nodo y la dirección IP. -boolean equals (InetAddress otroNodo): Devuelve true si los objetos tiene la misma dirección. -Authenticator: Autentificación para una conexión a la red. -NetPermission: Clase para permisos en la red. -PasswordAuthentication: Para autentificación. -Socket: Las comunicaciones por socket es de bajo nivel, mientras que la comunicación por URL y URLConnection es de alto nivel. Cada programa establece una conexión (cliente-servidor) y va ligado a un socket.

·Constructores para el cliente: Cuando se crea un objeto socket, se establece una conexión entre cliente y servidor. En total son 8 constructores. Los más importantes son: -Socket (string nodo, int puerto): Crea un conector que conecta el nodo local con el nodo y puerto específicos. -Socket (InetAddress dirección, int puerto): Crea un conector utilizando un objeto InetAddress ya existente y un puerto. -Puede lanzar UnknownHostException o IOException. ·Información del socket y flujos: -InetAddress getInetAddress (): Devuelve la InetAddress asociada con el objeto Socket. -int getPort (): Devuelve el puerto remoto al que está conectado este objeto Socket. -int getLocalPort (): Devuelve el puerto local al que está conectado este Socket. -InputStream getInputStream (): Devuelve el InputStream (flujo de entrada) asociado con este conector. -OutputStream getOutputStream (): Devuelve el OutputStream (flujo de salida) asociado con este conector. -void close (): Cierra el InputStream y el OutputStream. ·Constructores para el Servidor: -ServerSocket (int puerto): Crea un conector en el servidor en un puerto específico. -ServerSocket (int puerto, int backlog): Se configura la longitud máxima de la cola de entrada. -ServerSocket (int port, int backlog, InetAddress dir): Ligada a una dirección. ·Creación de flujos de Entrada: -En el cliente: Se crea un flujo de entrada para recibir las respuestas del servidor (DataInputStream). Socket sock = new Socket (“host”, puerto); DataInputStream in = new DataInputStream (sock.getInputStream ()); 27


-En el servidor: Se crea para recibir a los clientes. ServerSocket sock = new ServerSocket (puerto); ·Creación de flujos de salida: -En el cliente: Se crea un flujo de salida para enviar información al servidor (DataOutputStream o PrintStream). PrintStream out = new PrintStream (sock.getOutputStream ()); DataOutputStream out = new DataInputStream (sock.getOutputStream ()); -En el servidor: Se envía información al cliente. PrintStream out = new PrintStream (sock.getOutputStream ()); -URL (Uniform Resource Locator): Referencia (dirección) de un recurso de internet. http ://java.sun.com Identificación protocolo Nombre del recurso ·Los protocolos son: HTTP, FTP, Gopher, File y News ·Nombre del recurso: Esta formado por los siguientes campos: -Nombre del host: Nombre de la máquina en la que está el recurso. -Nombre del fichero: Nombre del camino al fichero en la máquina. -Referencia: Referencia al nombre (opcional). ·Constructores: -URL absoluto: Contiene toda la información para alcanzar el recurso. URL (String cad). URL gamelan = new URL (http://www.gamelan.com/); -URL relativo: Los ficheros HTML dan forma relacionada con el fichero en el que están. URL (URL base, String relativo). URL game = new URL (http://www.gamelan.com/pages/); URL gamelan = new URL (game, “Gamelan.html”); -URL (String proto, String host, int port, String file) -URL (String proto, String host, String file): Es el más usado, un ejemplo de ello es: URL gam = new URL (“http”, “www.gamelan.com”, 80, “/pages/Gamelan.html”); ·Excepciones: Puede generar la MalformedURLException, si el protocolo es desconocido o los argumentos del constructor son incorrectos. ·Métodos: -String getProtocol (): Devuelve el componente identificador de protocolo del URL -String getHost (): Devuelve el nombre de host del URL. -int getPort (): Devuelve el número de puerto del componente URL. Devuelve un entero que es el número de puerto. Si el puerto no es asignado explícitamente devuelve -1 -String getFile (): Devuelve el nombre del fichero del componente del URL. -String toExternalFrom (): Devuelve una cadena que representa un URL. ·Ejemplo conexión a un URL:

28


·Ejemplo leyendo de una URL:

·Ejemplo leyendo de un URLConnection:

-Datagramas: Los datagramas se implementan sobre el protocolo UDP, con dos clases: ·DatagramPacket: Contiene los datos. ·DatagramSocket: Es el mecanismo para enviar o recibir los DatagramPacket. ·Métodos: -InetAddress getAddress (): Devuelve la dirección de destino (para envíos). -int getPort (): Devuelve el número de puerto. -byte[] getData (): Devuelve el contenido del datagrama. -int getLength (): Devuelve la longitud de los datos válidos. 17. Java.util: -Tipos genéricos: Estos añaden estabilidad al código proporcionando detección de fallos en compilación. Se introducen en la Java SE 5.0. Permite a un método operar con objetos de varios tipos mientras se proporciona seguridad en los tipos en tiempo de compilación. ·Ejemplo de creación de tipo genérico:

29


-Para crear un tipo genérico se debe insertar <T> después del nombre de la clase, de esta forma se introduce un tipo de variable llamado T, que puede usarse dentro de la clase, además de poder usarse con interfaces. -Es una clase especial de variable, cuyo “valor” se le proporciona, este puede ser de cualquier tipo excepto un tipo de dato de dato primitivo. ·Para referenciar esta clase genérica desde el propio código, se reemplaza T con algún valor concreto, como Integer, Box<Integer> integerBox; ·Se peude pensar en una invocación de un tipo genérico similar a una invocación de método ordinaria, donde se proporciona el tipo del argumento a la propia clase Box. ·Forma de instanciar la clase: Box<Integer> integerBox = new Box<Integer> (); ·Convenios de nombrado: Los tipos gnéricos pueden tener múltiples parámetros y deberían ser únicos en la declaración de la clase o interfaz, las letras por convenio son las siguientes: -E – Element -K – Key -N – Number -T – Type -V – Value -S,U,V, etc.. ·Aplicación a métodos: -Se pueden declarar métodos y constructores que contengan tipos genéricos. -Es similar a declarar un tipo genérico con alcance al método o constructor.

·Límites a los parámetros de tipo:

30


-Bucles for: Considerando el problema de escribir una rutina que imprima todos los elementos de una colección. ·Con las versiones antiguas del lenguaje (anteriores a la 5.0) se puede realizar de la siguiente forma:

·Un mejor intento de escribirlo es usando un tipo genérico y una nueva sintaxis:

-Wildcard type: El supertipo de todas las clases de objetos se escribe con <?>. Jaula<? Extends Animal> unaJaula = … ; ·Es posible especificar un umbral inferior usando la palabra super de extends, siendo este un tipo desconocido que es un supertipo de Animal. -Colecciones: ·Una colección es un objeto que agrupa múltiples elementos en una sola unidad. ·Las colecciones se usan para almacenar, recuperar, manipular y comunicar agregación de datos. ·Clasificaciones de las interfaces:

-La interfaz Collection<E>: ·Raíz de la jerarquía de colleciones. ·Una colección representa un grupo de objetos conocidos como sus elementos. ·La interfaz Collection<E> es el mínimo común denominador de todas las colecciones implementadas y se usa para pasar colecciones y manipularlas cuando se desee tener mayor generalidad. -Unos tipos de colecciones permiten duplicar elementos y otras no. -Unas colecciones mantienen orden y otras no.

31


·Métodos:

·Set, List y Queue: -Set<E>: Es una colección que no puede tener elementos duplicados. -SortedSet<E>: ·Un conjunto que mantiene sus elementos ordenados de forma ascendente. ·Se proporcionan operaciones para mantener la ordenación. ·La ordenación realizada es la natural para estos conjuntos, tales como lista de palabras. -List<E>: ·Es una colección ordenada (en secuencia). Pueden contener elementos duplicados. ·El usuario de List generalmente tiene un control preciso sobre donde está insertado cada elemento de la lista, y puede acceder a los elementos mediante un índice entero que indica la posición. ·La versión anterior es Vector. -Queue<E>: ·Es una colección usada para determinar la forma en que varios elementos se precesan. ·Queue proporciona operaciones adicionales de inserción, extracción e inspección. ·Algunas ordenan sus elementos como FIFO (first-in, first-out). Otras son con prioridades. ·Implementaciones de Collection: -Implementaciónes Set<E>: -Implementaciones SortedSet<E>:

32


-Implementaciones List<E>:

-Implementaciones Queue<E>:

-Mapas: Map<K,V>: ·Son objetos que mapean claves a un valor, además cada clave puede mapear al menos un valor. ·No puede contener elementos duplicados. ·La interfaz proporciona tres vistas de colecciones: -Conjunto de claves -Colección de valores -Conjunto de mapeos clave-valor ·El orden de un mapa está definido como el orden en el cual el iterador en la vista de colección de mapas devuelve sus elementos. -TreeMap: Garantiza en orden. -HashMap: No garantiza el orden. ·Si el valor de una clave del mapa cambia de forma que afecta a la comparación con equals entonces la propiedad de un mapa no está especificada. -Un caso especial de esta prohibición es que no se permite a un mapa que se contenga a sí mismo. ·Método equals: -SortedMap: Es un mapa que mantiene un orden ascendente en las claves. ·Análogo a SortedSet. ·Los mapas ordenados se usan de una forma natural en colecciones ordenadas de pares claves-valor. -Muchos métodos en las interfaces Collections Framework están definidas en términos del método equals. ·Métodos de Map<K,V>:

33


·Implementaciones de Map<K,V>: -Implementaciones Map<K,V>:

-Implementaciones SortedMap<K,V>:

·Recorriendo las colecciones: Hay dos tipos de colecciones para recorrer: -Con la construcción for-each: ·Permite de una forma concisa atravesar una colección ·El siguiente código usa la construcción for-each para imprimir cada elemento de una colección en una línea separada: for (Object o : collection) System.out.println (o); -Usando iteradores: ·Un iterador es un objeto que permite atravesar una colección y borrar elementos de la colección de forma selectiva. ·Se puede obtener un Iterator de una colección invocando al método iterator: Public interface Iterator<E> { boolean hasNext (); E next (); void remove (); } 18. Applets: -Definición: ·Una applets son pequeñas aplicaciones a las que se accede en un servidor de internet, se transmiten a través de la red, se instalan automáticamente y se ejecutan como parte de un documento de la red. ·Las clases interactúan con el usuario a través del AWT ·Cada applet es una subclase de applet. -Funcionamiento: ·Las applet están guiadas por eventos: -El AWT notifica a la applet el evento que se ha producido llamando a un gestor de eventos que la applet ha sobrescrito. -La applet toma una acción y devuelve el control al AWT. ·La applet se ejecuta en un navegador compatible con Java cuando encuentra una etiqueta APPLET en el archivo HTML. ·Applet  Panel AWT  Container Component. -El método paint (): ·Definido en AWT (import java.awt.*). 34


·Debe ser sobrescrito por la applet. ·La applet llama al método paint () cada vez que quiere mostrar su salida. ·El parámetro Graphics: Contiene el contexto gráfico que describe el entorno gráfico (para representar la salida) donde se ejecuta. Public void drawString (String mensaje, int x, int y). La posición 0, corresponde a la esquina superior izquierda (además los caracteres de nueva línea no se reconocen). -Ejecución de una applet: ·Las applets no son ejecutables por el interprete de Java. ·La ejecución se realiza dentro de un navegador web compatible con Java y con el visualizador de applet (appletviewer, JDK). ·Los pasos a realizar son editar un archivo fuente de Java, compilar el programa, y ejecutar el visualizador de applets especificando el archivo fuente de la applet. -El paquete java.applet: ·Interfaces: -AppletContext -AppletStub -Audioclip ·Clases: -Applet ·Estructura: -Inicialización: ·void init (): Es el primer método que se ejecuta. Solo se ejecuta una vez. ·void start (): Se ejecuta después del init (). La reinicializa después de que haya sido parada. ·void paint (): Se ejecuta cada vez que se debe volver a pintar la salida de una applet. -Finalización: ·void stop (): Se ejecuta cuando un navegador deja el documento HTML que contiene la applet. Debe utilizarse para suspender hilos. ·void destroy (): Se ejecuta cuando el entorno determina que la applet tiene que ser borrada completamente de memoria. El método stop () siempre se ejecuta antes que destroy ().

35


-Sobrescritura del método update (): ·El método está definido en AWT. ·Se ejecuta cuando una applet ha solicitado que se vuelva a pintar una parte de su ventana. ·La versión por defecto rellena la applet con el color de fondo y después llama al método paint (). ·Una forma de evitar esto es sobrescribir update ():

-Volver a pintar, repaint (): ·Sirve para actualizar la información mostrada en la applet. -Métodos de gráficos simples: ·Pertenecen a la clase Component. ·void setBackground (Color nuevoColor): Da un color a la ventana de una applet. ·Color getBackground (): Obtiene el color actual de fondo. ·void setForeground (Color nuevoColor): Da el color de primer plano, por ejemplo texto. ·Color getForeground (): Obtiene el color de primer plano. ·La clase Color define las siguientes constantes para especificar colores: -Color.black -Color.orange -Color.blue -Color.pink -Color.cyan -Color.red -Color.darkGray -Color.white -Color.gray -Color.yellow -Color.green -Color.lightGray -Color.magenta -Gestión de eventos: ·Hay varios tipos de eventos, los más comunes son generados por el ratón, teclado y elementos de control. ·Todos los eventos están dentro de un objeto Event. ·La clase Event es parte del AWT. ·Los métodos de los eventos del ratón son heredados por Applet y los hereda de Component (y los puede sobrescribir). -boolean mouseDown (Event o, int x, int y): Se ejecuta cuando se pulsa un botón del ratón. -boolean mouseDrag (Event o, int x, int y): Se ejecuta cuando se mueve el ratón con un botón pulsado. -boolean mouseEnter (Event o, int x, int y): Se ejecuta cuando el ratón entra en la ventana. -boolean mouseExit (Event o, int x, int y): Se ejecuta cuando el ratón sale de la ventana. -boolean mouseMove (Event o, int x, int y): Se ejecuta cuando el ratón se mueve. -boolean mouseUp (Event o, int x, int y): Se ejecuta cuando se deja de pulsar un botón del raton. ·Eventos del teclado: Si el usuario pulsa una tecla cuando la applet está seleccionada se produce un evento de taclado.

36


-boolean keyDown (Event o, int tecla): Se ejecuta cuando se pulsa un botón del teclado. -boolean keyUp (Event o, int tecla): Se ejecuta cuando se pulsa un botón del teclado. -Para letras, números y símbolos de puntuación, el valor contenido en tecla se puede convertir a char. -Teclas especiales:

-Etiqueta APPLET de HTML:

·CODEBASE: URL del código de la applet, que es el directorio en el que busca el archivo de clase ejecutable de la applet. ·CODE: Nombre del archivo compilado (.class). ·ALT: Texto que se muestra si el navegador comprende la etiqueta APPLET pero no puede ejecutar applets de Java. ·NAME: Especifica un nombre para la instancia de la applet. ·WIDTH (HEIGHT): Tamaño en pixeles. ·ALING: Alineamiento de la applet. ·VSPACE y HSPACE: Espaciado en pixeles encima y debajo de la applet. ·PARAM NAME y VALUE: Es la forma de pasar argumentos específicos de la applet desde una página HTML.

37


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.