# Paquete Java

Un Paquete en Java es un contenedor de clases que permite agrupar las distintas partes de un programa y que por lo general tiene una funcionalidad y elementos comunes, definiendo la ubicación de dichas clases en un directorio de estructura jerárquica.

## Ventajas

El uso de paquetes proporciona las siguientes ventajas:
* Agrupamiento de clases con características comunes.
* Reutilización de código al promover principios de programación orientada a objetos como la encapsulación y modularidad.
* Mayor seguridad al existir niveles de acceso.
* Evita la colisión de clases que tengan el mismo nombre. Pueden existir clases con el mismo nombre siempre y cuando su fully qualified class name sean únicos.
* Mantenibilidad de código. Si un paquete se enfoca en la agrupación de clases con características comunes, el cambio en la funcionalidad se limita a las clases contenidas en dicho paquete, además, si es un paquete grande soporta la reusabilidad, si por el contrario es pequeño soporta su mantenibilidad.

## Contenido de un paquete

Un paquete puede contener:
* Clases
* Interfaces
* Tipos Enumerados
* Anotaciones

## Atributos de un paquete Java

Un paquete Java tiene los siguientes atributos:
* Son opcionales. Si no se define un paquete para un fichero de código Java se definirá un paquete llamado "default" automáticamente.
* Es definido un paquete por cada ficheros de código Java.
* Los nombres de paquete que comienzan con el nombre java.* y javax.* son reservados.
* El nombre del paquete equivale a una estructura de ficheros. El nombre de paquete com.dominio_empresa.utilidades debería ser igual al directorio [ruta_directorio]\com\dominio_empresa\utilidades. Si una clase incluida en un paquete no se relaciona con su respectiva estructura de directorio, la clase no podrá usarse.

## Convenciones en la definición de paquetes Java

Los siguientes son convenciones o estándares acordados en la definición de paquetes en Java:
* El nombre del paquete se define de manera inversa al dominio de la organización o grupo. Por ejemplo, dominioempresa.com puede ser usado como nombre de paquete así: com.dominio_empresa.utilidades.
* El nombre del paquete debería definirse en minúscula. Si existen varias palabras en el nombre, se pueden separar con guion bajo (_).

## Uso de paquetes

En los ficheros de código Java se usa la palabra reservada package para especificar a qué paquete pertenecen. Suele indicarse como primera sentencia:
Para usar un paquete dentro del código se usa la declaración import. Si sólo se indica el nombre del paquete, se importarán todas las clases que contiene:
Si además del nombre del paquete se especifica una clase, sólo se importa esa clase:
Después de añadir alguna de las sentencias anteriores, se puede hacer referencia a la clase ActionEvent usando su nombre:
Si no se hubiera importado la clase o el paquete, cada vez que tuviéramos que usarla habría que especificarla por su fully qualified class name, que no es más que el nombre del paquete seguido por el nombre de la clase:
Si lo que se desea es importar todos los miembros estáticos de una clase, note la sentencia static después de import. (A partir de J2SE 5.0 en adelante)
Si lo que se desea es importar un solo miembro estático de una clase. (A partir de J2SE 5.0 en adelante)

## Librerías estándar de java

Estos son la librerías estándar más importantes de la API de Java:
| Paquete | Descripción |
| java.applet | Contiene clases para la creación de applets. |
| java.awt | Contiene clases para crear interfaces de usuario con ventanas. |
| java.io | Contiene clases para manejar la entrada/salida. |
| java.lang | Contiene clases variadas pero imprescindibles para el lenguaje, como Object, Thread, Math... El paquete java.lang es importado por defecto en el ficheros de código Java. |
| java.net | Contiene clases para soportar aplicaciones que acceden a redes TCP/IP. |
| java.util | Contiene clases que permiten el acceso a recursos del sistema, etc. |
| javax.swing | Contiene clases para crear interfaces de usuario mejorando la AWT. |