util statement significa scanner que importing java import

statement - package java



¿Cómo se realiza la importación en Java? (8)

es "org.apache.nutch.plugin" esencialmente 4 directorios?

Si tiene una clase cuyo nombre es org.apache.nutch.plugin.Extension , entonces se almacena en algún lugar del classpath como un archivo org/apache/nutch/plugin/Extension.class . Entonces, el directorio raíz contiene cuatro subdirectorios anidados ("org", "apache", "nutch", "plugin") que a su vez contienen el archivo de clase.

Por ejemplo

import org.apache.nutch.plugin.Extension,

aunque usado muchas veces,

No tengo mucha idea de lo que se hace esencialmente.

EDITAR : ¿Es org.apache.nutch.plugin esencialmente 4 directorios o menos de 4 como un directorio llamado org.apache ?


A partir de Thomas'' respuesta de Thomas'' , org.apache.nutch.plugin es una ruta a los archivos de clase que desea importar. No estoy seguro de este paquete en particular, pero en general tendrá un archivo .jar que agregue a su ruta de clase, y su declaración de importación apunta al directorio "./[classpath◆/[jarfile◆/org/apache/ nutch / plugin "


Básicamente, cuando creas una clase puedes declararla como parte de un paquete. Personalmente no tengo mucha experiencia haciendo paquetes. Sin embargo, afaik, eso significa básicamente que está importando la clase de Extensión del paquete org.apache.nutch.plugin.


Creo que la pregunta que podría estar tratando de formular es: "¿Qué son los paquetes en Java y cómo se relaciona la palabra clave de import con ellos?" . Su confusión acerca de las estructuras de directorios puede deberse al hecho de que otros idiomas include directivas que usan nombres de archivo para incluir literalmente el contenido del archivo especificado en su código fuente en el momento de la compilación. C / C ++ son ejemplos de lenguajes que usan este tipo de directiva de include . La palabra clave de import de Java no funciona de esta manera. Como han dicho otros, la palabra clave de import es simplemente una forma abreviada de hacer referencia a una o más clases en un paquete. El trabajo real lo realiza el cargador de clases de la máquina virtual Java (detalles a continuación).

Comencemos con la definición de un "paquete Java", como se describe en el artículo de Wikipedia :

Un paquete de Java es un mecanismo para organizar las clases de Java en espacios de nombres similares a los módulos de Modula. Los paquetes Java se pueden almacenar en archivos comprimidos llamados archivos JAR, lo que permite que las clases se descarguen más rápido como un grupo en lugar de una a la vez. Los programadores también suelen utilizar paquetes para organizar clases que pertenecen a la misma categoría o que proporcionan una funcionalidad similar.

En Java, los archivos de código fuente para las clases de hecho están organizados por directorios, pero el método por el cual la Máquina Virtual de Java (JVM) localiza las clases es diferente de los lenguajes como C / C ++.

Supongamos que en su código fuente tiene un paquete llamado "com.foo.bar", y dentro de ese paquete tiene una clase llamada "MyClass". En el momento de la compilación, la ubicación del código fuente de esa clase en el sistema de archivos debe ser {source}/com/foo/bar/MyClass.java , donde {source} es la raíz del árbol de origen que está compilando.

Una diferencia entre Java y lenguajes como C / C ++ es el concepto de un cargador de clases. De hecho, el concepto de un cargador de clases es una parte clave de la arquitectura de la Máquina Virtual de Java. El trabajo del cargador de clases es localizar y cargar cualquier archivo de class que su programa necesite. El cargador de clases Java "primordial" o "predeterminado" normalmente lo proporciona la JVM. Es una clase regular de tipo ClassLoader y contiene un método llamado loadClass() con la siguiente definición:

// Loads the class with the specified name. // Example: loadClass("org.apache.nutch.plugin.Extension") Class loadClass(String name)

Este método loadClass() intentará ubicar el archivo de class para la clase con el nombre dado, y produce un objeto Class que tiene un método newInstance() capaz de crear una instancia de la clase.

¿Dónde busca el cargador de class archivo de class ? En la ruta de clases de la JVM. La ruta de clase es simplemente una lista de ubicaciones donde se pueden encontrar los archivos de class . Estas ubicaciones pueden ser directorios que contienen archivos de class . Incluso puede contener archivos jar , que a su vez pueden contener incluso más archivos de class . El cargador de clases predeterminado es capaz de mirar dentro de estos archivos jar para buscar archivos de class . Como nota al margen, podría implementar su propio cargador de clases para, por ejemplo, permitir que las ubicaciones de red (o cualquier otra ubicación) busquen archivos de class .

Entonces, ahora sabemos que si "com.foo.bar.MyClass" está o no en un archivo de class en su propio árbol de origen o en un archivo de class dentro de un archivo jar en su ruta de clase, el cargador de clases lo encontrará por usted , si existiera. Si no existe, obtendrá una ClassNotFoundException .

Y ahora para abordar la palabra clave de import : haré referencia al siguiente ejemplo:

import com.foo.bar.MyClass; ... public void someFunction() { MyClass obj1 = new MyClass(); org.blah.MyClass obj2 = new org.blah.MyClass("some string argument"); }

La primera línea es simplemente una forma de decirle al compilador "Siempre que vea una variable declarada simplemente como tipo MyClass , suponga que me refiero a com.foo.bar.MyClass . Eso es lo que sucede en el caso de obj1 . En el caso de obj2 , le está diciendo explícitamente al compilador "No quiero la clase com.foo.bar.MyClass , realmente quiero org.blah.MyClass ". Por lo tanto, la palabra clave de import es solo una forma sencilla de reducir la cantidad de programadores que org.blah.MyClass . Hay que hacer para usar otras clases. Todas las cosas interesantes se realizan en el cargador de clases de la JVM.

Para obtener más información sobre lo que hace exactamente el cargador de clases, recomiendo leer un artículo llamado Lo básico de los cargadores de clases de Java.


Las importaciones son solo sugerencias al compilador que le dice cómo averiguar el nombre completo de las clases.

Así que si tienes "import java.util. *;" y en su código está haciendo algo como "nuevo ArrayList ()", cuando el compilador procesa esta expresión, primero debe encontrar el nombre completo del tipo ArrayList. Lo hace revisando la lista de importaciones y agregando ArrayList a cada importación. Específicamente, cuando agrega ArrayList a java.util, obtiene el FQN java.util.ArrayList. Luego busca este FQN en su ruta de clase. Si encuentra una clase con tal nombre, entonces sabe que java.util.ArrayList es el nombre correcto.


Todo lo que está haciendo es guardarte escribiendo. En lugar de tener que escribir "org.apache.nutch.plugin.Extension" cada vez que quiera usarlo, la importación le permite referirse a él por su nombre corto, "Extensión".

No se confunda con la palabra "importar": no está cargando el archivo .class ni nada de eso. El cargador de clases lo buscará en la CLASSPATH y lo cargará en el espacio permanente la primera vez que su código lo requiera.

ACTUALIZACIÓN: como desarrollador, debe saber que los paquetes están asociados con directorios. Si crea un paquete "com.foo.bar.baz" en su archivo .java, tendrá que almacenarlo en un directorio com / foo / bar / baz.

Pero cuando descarga un archivo JAR, como esa biblioteca de Apache Nutch, no hay directorios involucrados desde su punto de vista. La persona que creó el JAR tuvo que comprimir la estructura de directorios adecuada, que puede ver como la ruta al archivo .class si abre el JAR utilizando WinZip. Solo tiene que poner ese JAR en la CLASSPATH para su aplicación cuando compile y ejecute.


no puede tener un directorio llamado org.apache como un paquete. el compilador no entenderá ese nombre y buscará la estructura de directorios org/apache cuando importe cualquier clase de ese paquete.

Además, no confunda la instrucción de import Java con la instrucción del preprocesador C #include . La declaración de import es, como han dicho, una abreviatura para que escriba menos caracteres al referirse a un nombre de clase.


import org.apache.nutch.plugin.Extension es un método abreviado de tiempo de compilación que le permite referirse a la clase de Extensión sin usar el nombre completo de la clase. No tiene ningún significado en el tiempo de ejecución, solo es un truco de tiempo de compilación para guardar la escritura.

Por convención, el archivo .class para esta clase se ubicará en la carpeta org / apache / nutch / plugin en el sistema de archivos o en un archivo jar, cualquiera de los cuales debe estar en su classpath, tanto en tiempo de compilación como en tiempo de ejecución. Si el archivo .class está en un archivo jar, entonces ese archivo jar debe estar en su ruta de clase. Si el archivo .class está en una carpeta, entonces la carpeta que es el padre de la carpeta "org" debe estar en su classpath. Por ejemplo, si la clase estaba ubicada en la carpeta c: / myproject / bin / org / apache / nutch / plugin, entonces la carpeta c: / myproject / bin tendría que ser parte de la ruta de clase.

Si está interesado en saber de dónde se cargó la clase cuando ejecuta su programa, use la opción de línea de comandos -verbose:class java. Debería indicarle en qué carpeta o archivo jar la JVM encontró la clase.