Las clases en Java pertenecen a algún paquete. Cuando no se especifica ninguna declaración de paquete, se emplea el paquete predeterminado. El paquete predeterminado no tiene nombre, lo que hace que el paquete sea transparente.
El paquete predeterminado está bien para programas de muestra que están escritos con poco código, pero resulta inadecuado para aplicaciones reales. En general, se definirá uno o más paquetes para su código.
Los paquetes agrupan clases relacionadas y definen un espacio de nombres para las clases que contienen.
En general, cuando se le da nombre a una clase, se está asignando un nombre del namespace. Un namespace define una región declarativa. En Java, dos clases no pueden tener el mismo nombre del mismo namespace. Esto hace que dentro de un namespace determinado, cada nombre de clase debe ser único.
La introducción del concepto del paquete, proporciona una manera de particionar el espacio de nombres (namespace) solucionando estos problemas. Cuando se establece una clase dentro de un paquete, el nombre de ese paquete se anexa a cada clase, evitando así las colisiones de nombres con otras clases que tienen el mismo nombre, pero se encuentran en otros paquetes.
Para crear un paquete, se debe colocar un comando de paquete en la parte superior de un archivo fuente de Java. Las clases declaradas dentro de este archivo pertenecerán al paquete creado.
Como un paquete define un espacio de nombres, los nombres de las clases que colocas en el archivo formarán parte del espacio de nombres de ese paquete.
La declaración del paquete, por lo general, tiene la siguiente forma:
package pkg;
Donde, pkg es el nombre del paquete. Por ejemplo, la siguiente declaración creará un paquete de nombre mipaq:
package mipaq
Java utiliza el sistema de archivos para llevar a cabo la administración de paquetes, con cada paquete almacenado en su propio directorio. De este modo, por ejemplo, los archivos .class para cualquier clase que declare que forma parte de mipaquete deben almacenarse en un directorio llamado mipaq.
En Java los nombres de los paquetes distinguen entre mayúsculas y minúsculas. Esto implica que el directorio en el que se almacena un dado paquete debe ser exactamente el mismo que el nombre del paquete.
La mayoría de los paquetes que son parte del mundo real se hallan distribuidos en muchos archivos.
Java permite crear una jerarquía de paquetes, y para hacerlo, solo hay que separar cada nombre de paquete del que está encima de él mediante el uso de un punto.
La forma general para hacer una declaración de paquete multinivel se muestra aquí:
package pack1.pack2.pack3...packN;
Por cierto, se deben crear directorios que admitan la jerarquía de paquetes que crea. Por ejemplo, debe almacenarse en …/alpha/beta/gamma, donde … especifica la ruta a los directorios especificados.
package alpha.beta.gamma;
El sistema de tiempo de ejecución de Java buscará los paquetes creados como se detalla a continuación:
Por ejemplo, asumiendo la siguiente especificación de paquete:
package mipaq
Para que un programa pueda encontrar el paquete mipaq, el programa se puede ejecutar desde un directorio inmediatamente arriba de mipaq, o CLASSPATH debe configurarse para incluir la ruta a mipaq, o la opción -classpath debe especificar la ruta a mipaquete cuando se ejecuta el programa a través de Java.