Contenidos
Paquetes
A medida que se incorporan clases de terceros aumenta la posibilidad de encontrarse clases con el mismo nombre
Las posibilidades son aún mayores en Java, donde las clases de millones de programadores viajan a través de la red
La solución que aporta Java son los paquetes (packages)
Para especificar la clase deseada basta con indicar el nombre del paquete al que pertenece
Sun dió en su día unas recomendaciones para que los nombres de los paquetes fueran únicos:
-
Si se va a utilizar dentro de la empresa podrán usar cualquier convenio interno
-
Si se va a utilizar fuera de la empresa deberá usarse como prefijo el dominio de Internet de la compañía invertido (esto asegura que sea único), por ejemplo com.sun.graphics3D
-
Las clases estándar tienen reservado los prefijos java y javax
Toda clase debe pertenecer a algún paquete
Las clases Java se reparten en varios paquetes básicos:
java | javax |
---|---|
java.applet | javax.accessibility |
java.awt | javax.activation |
java.beans | javax.activity |
java.io | javax.annotation |
java.lang | javax.crypto |
java.math | javax.imageio |
java.net | javax.jws |
java.nio | javax.lang |
java.rmi | javax.management |
java.security | javax.naming |
java.sql | javax.net |
java.text | javax.print |
java.util | javax.rmi |
javax.script | |
javax.security | |
javax.smartcardio | |
javax.sound | |
javax.sql | |
javax.swing | |
javax.tools | |
javax.transaction | |
javax.xml |
El nombre de una clase incluye un prefijo el paquete al que pertenece
En el ejemplo, la clase Vector se encuentra dentro del paquete java.util
En el ejemplo se ha utilizado la palabra reservada import que permite indicar el paquete al que pertenece una o más clases, de tal manera que no haya que repetirlo con cada uso de las mismas
import no produce la carga de ningún tipo de fichero (no equivale al #include de C / C++)
El paquete java.lang es importado automáticamente
Colisión de nombres
En el caso de que se repita el nombre de una clase en dos paquetes importados habría que utilizar el nombre completo de la clase para deshacer la ambigüedad
En el ejemplo se ha especificado el paquete del que se desea coger la clase Vector, con el símbolo asterisco le estamos diciendo que tome todo el paquete
En el ejemplo se ha usado un import de la clase concreta Vector y otro de todo el paquete
Hay que tener en cuenta que el import de la clase tendrá prioridad sobre el import de todo un paquete
Por lo que podría eliminarse si no queremos usar el resto de las clases de ese paquete, al ser redundante
Creación de paquetes
Para indicar que una clase pertenece a un paquete hay que usar la cláusula package
En el ejemplo se ha creado el paquete ejemplos que contiene sólo la clase Ejemplo1
Si hemos de utilizar en otra clase, el nombre del paquete podrá estar formado por varias palabras separadas por punto
En este caso el nombre de la clase será ejemplos.Ejemplo1
Si quisiéramos ejecutarla para usarla en otras clases desde línea de comandos:
Classpath
Java no tiene el concepto de fichero ejecutable (fichero con extensión .EXE o .COM)
Cada clase genera un fichero class independiente
Para ejecutar un programa hay que indicar el nombre de una clase que contenga al menos una función main
El resto de clases se irán cargando dinámicamente bajo demanda
Puede haber varias clases con main pero sólo puede haber un main que sea el principal
En el caso de aplicaciones locales se localizará el código de las clases:
-
La JVM añade al nombre de la clase la extensión class para formar el nombre del fichero
-
Para localizar dicho fichero se utiliza la variable de entorno CLASSPATH
-
CLASSPATH indica una serie de localizaciones en las cuales buscar las clases que pueden ser:
- Un directorio
- Un fichero ZIP o JAR (Java Archive Resource)
En el ejemplo se ha usado la línea de comandos de Windows para definir el CLASSPATH
La clase Prueba buscaría (en este orden) en:
- c:\ejemplos\Prueba.class
- dentro del fichero
- c:\java\lib\classes.zip y en ningún lugar más
Cuando se utilizan clases hechas por terceros es necesario incluir su directorio (o ZIP, JAR) en el CLASSPATH para que la JVM se capaz de encontrarlas
Paquetes y Classpath
En el JDK hay relación entre el paquete de una clase y el directorio en el que se encuentra
Todas las clases de un paquete deberán estar en un directorio con el mismo nombre
Si el nombre de un paquete tiene varias palabras cada palabra se corresponde con el nombre de un subdirectorio
Por ejemplo, las clases del paquete ur.mis.ejemplos estarían en el directorio ur/mis/ejemplos
Este directorio deberá ser accesible a partir de alguna de las localizaciones del CLASSPATH
El mecanismo de la JVM del JDK para localizar la implementación de una clase en tiempo de ejecución es:
- añade .class al nombre completo de la clase
- transforma los puntos en separadores de directorio \
- añade la cadena resultante a cada una de las localizaciones del CLASSPATH
- si no se encuentra en ninguna de ellas se produce un error de ejecución
Sigamos el proceso con un ejemplo en el que queremos cargar en el JDK la clase UR.ejemplos.ejemplo1:
-
Definimos el CLASSPATH como:
-
La JVM busca la clase en el fichero UR\ejemplos\ejemplo1.class
-
El fichero será buscado en las localizaciones del CLASSPATH c:\programas\UR\ejemplos\ejemplo1.class y c:\temp\UR\ejemplos\ejemplo1.class
-
Si la clase no se encuentra en ninguno de estos dos sitios, se producirá un error de ejecución