Paquetes e interfaces
Paquetes


Un paquete es un contenedor de clases, que
se usa para mantener el espacio de nombres
de clase, dividido en compartimentos.
Es muy conveniente ya que evita conflictos
de nombres cuando se manejan un gran
numero de clases e interfaces
Paquetes




Se almacenan de manera jerárquica,
utilizando los directorios del sistema de
archivos para almacenar los paquetes.
Se importan explícitamente en las
definiciones de nuevas clases.
Permite restringir la visibilidad de las clases
que contiene
Se pueden definir miembros de una clase
que solo sean accesibles por miembros del
mismo paquete
Definición de un paquete

La siguiente instrucción se incluye al inicio del archivo fuente
(.java)




package nombre-paquete
Si no se incluye la instrucción package en el archivo fuente,
entonces java agrega las clases de ese archivo fuente a un
paquete por defecto (default package).
Si se declara que una clase esta dentro de un paquete llamado
PrimerPaquete, entonces el archivo fuente de esa clase se debe
almacenar en un directorio llamado PrimerPaquete.
Se puede crear una jerarquía de paquetes dentro de paquetes
separando los niveles por puntos. Esta es la jerarquía se debe
reflejar en el sistema de archivos de desarrollo de java

Por ejemplo:

package java.awt.imagen;
Significa que imagen esta almacenada en la
siguiente jerarquía de directorios.
java

=> awt

Imagen
Usando paquetes


Se pueden utilizar las clases publicas de un
paquete de dos formas.
Utilizando el nombre completo del paquete.

java.util.GregorianCalendar hoy= new
java.util.GregorianCalendar();
Lo cual resulta muy compolicado o

Lo mas simple y común en importar el paquete.


import java.util.*;
GregorianCalendar hoy= new GregorianCalendar();
Como el compilador localiza los paquetes





Es importante recalcar que todos los archivos del
paquete se deben de encontrar en un subdirectorio
que tenga el mismo nombre del paquete.
Estos subdirectorios no deben de estar en la raíz del
sistema de directorios.
Java busca los paquetes, primero en todos los
archivos del paquete por defecto.
Los archivos del paquete por defecto están
localizados en los directorios definidos en el
CLASSPATH.
Es responsabilidad del programador poner los
paquetes en los subdirectorios correctos.
Importante para ejecutar paquetes



Cuando se intenta poner una clase en un paquete, el primer problema es que la estructura
de directorios debe coincidir con la jerarquía de paquetes exactamente.
No se puede renombrar un paquete sin renombrar el directorio en el cual están
almacenadas las clases.
Otro problema, cuando desee llamar a una clase que se encuentre en un paquete deberá
prestar atención a su ubicación en la jerarquía de paquetes.


Por ejemplo, se crea una clase llamada PaquetePrueba en un paquete llamado prueba. Para ello se
crea el directorio llamado prueba y se pone en él PaquetePrueba.java y se compila. Si intenta
ejecutarlo, el intérprete no lo encontrará. Esto se debe a que esta clase se encuentra ahora en un
paquete llamado prueba y no nos podemos referir a ella simplemente con PaquetePrueba. sin
embargo si es posible referirse a cualquier paquete enumerando su jerarquía de paquetes,
separando los paquetes por puntos. Por lo tanto, si intenta ahora ejecutar ahora Java con
prueba.PaquetePrueba, el intérprete tampoco lo encontrará.
El motivo de este nuevo fracaso se encuentra en la variable CLASSPATH. Probablemente contenga
algo parecido a ".;C:\java\classes" que le dice al intérprete que busque en el directorio de trabajo
actual y en el directorio de instalación del Equipo de herramientas de desarrollo de Java estándar.
El problema es que no hay un directorio prueba en el directorio de trabajo actual porque
usted ya está en el directorio prueba. Tiene dos opciones en este momento: cambiar de
directorio un nivel arriba y ejecutar "java prueba.PaquetePrueba", o añadir el extremo de
su jerarquía de clases de desarrollo a la variable de entorno CLASSPATH. Después podrá
utilizar "java prueba.PaquetePrueba" desde cualquier directorio y Java encontrará el
archivo .class adecuado. Si trabaja con su código fuente en un directorio llamado
C:\mijava, dé a CLASSPATH el valor ".;C:\mijava;C:\java\classes".
Un ejemplo de paquetes
Interfaces



Son sintácticamente como las clases, pero
no tienen variables de instancia y los
métodos declarados no contienen cuerpo.
Se utilizan para especificar lo que debe hacer
una clase, pero no cómo lo hace.
Una clase puede implementar cualquier
número de interfaces.
La instrucción interface

La forma general de una interfaz es
acceso interface nombre {
tipo_devuelto nombre_de_método1(lista_de_parámetros);
tipo_dato nombre_var = valor;
}



acceso puede ser public o no usarse.
 Si no se utiliza (acceso por defecto) la interfaz está sólo
disponible para otros miembros del paquete en el que ha sido
declarada.
 Si se usa public, puede ser usada por cualquier código (todos
los métodos y variables son implícitamente públicos).
Los métodos de una interfaz son básicamente métodos
abstractos (no tienen cuerpo de implementación).
Un interfaz puede tener variables pero serán implícitamente final
y static.
Por que interfaces


Los interfaces se utilizan para definir un protocolo de
comportamiento que puede ser implementado por
cualquier clase del árbol de clases.
Los interfaces son útiles para.
 capturar similitudes entre clases no relacionadas sin
forzar una relación entre ellas.
 declarar métodos que una o varias clases necesitan
implementar.
 revelar la interfase de programación de un objeto sin
mostrar sus clases (los objetos de este tipo son
llamados objetos anónimos y pueden ser útiles
cuando se comparte un paquete de clases con otros
desarrolladores).
Utilizar un Interface




Para utilizar un interface se debe escribir una clase que lo implemente.
Una clase declara todos los interfaces que implementa en su
declaración de clase. Para declarar que una clase implementa uno o
más interfaces, se utiliza la palabra clave implements seguida por una
lista delimitada por comas con los interfaces implementados por la
clase.
Una vez declarada la interfaz, puede ser implementada por varias
clases.
Cuando implementemos un método de una interfaz, tiene que
declararse como public.
Si una clase implementa dos interfaces que declaran el mismo método,
entonces los clientes de cada interfaz usarán el mismo método.
Ejemplo de interfase
interface coleccion
{ int MAXIMO = 500;
void añadir(Object obj);
void borrar(Object obj);
Object buscar(Object obj);
int contadorActual(); }
continuación
class PilaFIFO implements coleccion
{...
void añadir(Object obj) { . . . }
void borrar(Object obj) { . . . }
Object buscar(Object obj) { . . . }
int contadorActual() { . . . }
}
Conceptos de Hilos



Un hilo -algunas veces llamado contexto de
ejecución o proceso ligero- es un flujo de control
secuencial dentro de un programa
Un único hilo es similar a un programa secuencial;
es decir, tiene un comienzo, una secuencia y un
final, además en cualquier momento durante la
ejecución existe un sólo punto de ejecución.
un hilo no es un programa; no puede correr por sí
mismo, corre dentro de un programa
Creación de un hilo

Una forma de crear un hilo es heredando de Thread
class MiThread extends Thread {
public void run() {
...
}

La otra forma es utilizando la interface Runnable
public class MiThread implements Runnable {
Thread t;
public void run() {
// Ejecución del thread una vez creado
}
}
El método run()


Antes que nada, necesitamos proveer a cada hilo
con un método run para indicarle qué debe hacer. El
código de este método implementa el
comportamiento en ejecución del hilo y puede
hacer, prácticamente cualquier cosa capaz de ser
codificada en Java.
Existen dos técnicas para proveer un método run
para un hilo:


Haciendo una subclase de Thread y sobrecargando run
Implementando la interface Runnable. Thread es una
clase, pero Runnable es una interface.
Manejo de Prioridades de los hilos


La gran ventaja que ofrecen los hilos es que corren de
manera concurrente. La mayoría de las computadoras
tienen un sólo procesador, por lo tanto los hilos corren
uno a la vez de forma tal que proveen la ilusión de
concurrencia (esto es llamado scheduling). El sistema
de ejecución de Java soporta un algoritmo
determinístico (para el scheduler) llamado fixed
priority scheduling. Este algoritmo asigna tiempo de
ejecución a un hilo basado en su prioridad relativa a
los demás hilos que están listos para ejecutarse.
Cuando se crea un nuevo hilo, hereda su prioridad del
hilo que lo crea, ésta puede ser modificada con el
método setPriority.
Prioridad

Si dos hilos con la misma prioridad están esperando
que el CPU los ejecute, el scheduler escoge uno
utilizando round-robin (i.e. escoge uno
aleatoriamente, se supone que round-robin ofrece
iguales probabilidades de ejecución a los hilos en
cuestión). El hilo escogido para ejecución, corre
hasta que alguna de estas condiciones sea
verdadera:



Un hilo con mayor prioridad está listo para ejecución.
El hilo cede su lugar (yields), o su método run termina.
En sistemas que soportan rebanadas de tiempo (time
slicing), su tiempo asignado ha expirado
Sincronización.


Cuando tenemos varios hilos, muchas veces
deseamos que éstos pueden compartir
datos, por lo tanto, es indispensable saber
sincronizar sus actividades; esto también nos
permitirá evitar inanición y abrazos mortales.
En muchas situaciones, hilos que se ejecutan
concurrentemente comparten información y
deben considerar el estado de las
actividades de los demás hilos.
Suspensión de un Thread


Puede resultar útil suspender la ejecución de un thread sin
marcar un límite de tiempo. Si, por ejemplo, está construyendo
un applet con un thread de animación, querrá permitir al usuario
la opción de detener la animación hasta que quiera continuar. No
se trata de terminar la animación, sino desactivarla. Para este
tipo de control de thread se puede utilizar el método suspend().
t1.suspend();
El thread es suspendido indefinidamente y para volver a activarlo
de nuevo necesitamos realizar una invocación al método
resume():
t1.resume();
Parada de un Thread


El último elemento de control que se necesita sobre
threads es el método stop(). Se utiliza para terminar
la ejecución de un thread:
t1.stop();
Esta llamada no destruye el thread, sino que
detiene su ejecución. La ejecución no se puede
reanudar ya con t1.start(). Cuando se desasignen
las variables que se usan en el thread, el objeto
thread (creado con new) quedará marcado para
eliminarlo y el garbage collector se encargará de
liberar la memoria que utilizaba .




http://www.geocities.com/CollegePark/Quad/
8901/cap05.htm
http://www.programacion.com/java/tutorial/jav
a_basico/30/
http://leo.ugr.es/~fjgc/CLDC/transjava/node9.
html
http://pisuerga.inf.ubu.es/lsi/Invest/Java/Tuto.
Oct98/2_Lengua/5_Interf.htm
Descargar

Paquetes e interfaces