如何在Java中进行导入?

如何在Java中进行导入?,java,import,Java,Import,比如说 import org.apache.nutch.plugin.Extension, 虽然使用了很多次 我不知道基本上做了什么 EDIT:是org.apache.nutch.plugin基本上是4个目录还是少于4个目录,就像一个名为org.apache的目录一样?它所做的一切就是保存您键入的内容。每次你想使用它时,不必键入“org.apache.nutch.plugin.Extension”,导入允许你用它的简称“Extension”来引用它 不要被“导入”这个词弄糊涂了——它没有加载.

比如说

import org.apache.nutch.plugin.Extension,
虽然使用了很多次

我不知道基本上做了什么


EDIT:是
org.apache.nutch.plugin
基本上是4个目录还是少于4个目录,就像一个名为
org.apache
的目录一样?

它所做的一切就是保存您键入的内容。每次你想使用它时,不必键入“org.apache.nutch.plugin.Extension”,导入允许你用它的简称“Extension”来引用它

不要被“导入”这个词弄糊涂了——它没有加载.class文件或类似的东西。类加载器将在类路径上搜索它,并在代码第一次需要时将其加载到perm空间

更新:作为开发人员,您必须知道包与目录相关联。如果在.java文件中创建一个包“com.foo.bar.baz”,那么它必须存储在com/foo/bar/baz目录中


但是,当您下载JAR文件时,比如ApacheNutch库,从您的角度来看,并没有涉及目录。创建JAR的人必须压缩适当的目录结构,如果使用WinZip打开JAR,您可以将其视为.class文件的路径。编译和运行应用程序时,只需将JAR放在应用程序的类路径中。

导入只是提示编译器如何计算类的全名


因此,如果您有“import java.util.*”,并且在代码中执行类似于“new ArrayList()”的操作,那么当编译器处理此表达式时,它首先需要找到类型ArrayList的完全限定名。它通过遍历导入列表并将ArrayList附加到每个导入来实现。具体来说,当它将ArrayList附加到java.util时,它将获得FQN java.util.ArrayList。然后在其类路径中查找此FQN。如果它找到一个具有这样名称的类,那么它就知道java.util.ArrayList是正确的名称。

基本上,当您创建一个类时,您可以将其声明为包的一部分。我个人在做软件包方面没有太多经验。但是,恕我直言,这基本上意味着您正在从org.apache.nutch.plugin包导入扩展类。

在answer的基础上,org.apache.nutch.plugin是要导入的类文件的路径。我不确定这个特定的包,但一般来说,您将有一个.jar文件添加到类路径中,并且您的import语句指向目录“/[classpath]/[jarfile]/org/apache/nutch/plugin”

“org.apache.nutch.plugin”实际上是4个目录吗


如果您有一个名为
org.apache.nutch.plugin.Extension
的类,那么它将作为文件
org/apache/nutch/plugin/Extension.class
存储在类路径中的某个位置。因此根目录包含四个嵌套的子目录(“org”、“apache”、“nutch”、“plugin”),它们依次包含类文件。

import org.apache.nutch.plugin.Extension
是一个编译时快捷方式,允许您引用扩展类,而无需使用类的完全限定名。它在运行时没有任何意义,它只是一个编译时的技巧来保存键入

按照惯例,这个类的.class文件将位于文件系统或jar文件中的org/apache/nutch/plugin文件夹中,无论是在编译时还是在运行时,这两个文件都需要位于类路径中。如果.class文件位于jar文件中,则该jar文件需要位于类路径中。如果.class文件位于文件夹中,则文件夹“org”的父文件夹需要位于类路径中。例如,如果类位于文件夹c:\myproject\bin\org\apache\nutch\plugin中,那么文件夹c:\myproject\bin需要是类路径的一部分


如果您想在运行程序时找到类的加载位置,请使用
-verbose:class
java命令行选项。它应该告诉您JVM找到类的文件夹或jar文件。

您不能将名为
org.apache
的目录作为包。当您从该包导入任何类时,编译器将无法理解该名称,并将查找目录结构
org/apache


另外,不要将Java
import
语句与C
#include
预处理器指令混淆。正如他们所说,
import
语句是在引用类名时键入更少字符的简写。我想你可能想问的问题是,Java中的包是什么,以及
import
关键字与它们有什么关系?
。您对目录结构的混淆可能源于这样一个事实,即某些其他语言具有
include
指令,这些指令使用文件名在编译时将指定文件的内容直接包含在源代码中。C/C++是使用此类
include
指令的语言示例。Java的
import
关键字不能以这种方式工作。正如其他人所说,
import
关键字只是引用包中一个或多个类的简写方式。真正的工作是由Java虚拟机的类加载器完成的(详情如下)

让我们从“Java包”的定义开始,如中所述:

Java包是一种用于 将Java类组织成 与的模块类似的名称空间 模。Java包可以存储在 压缩文件称为JAR文件, 允许类以更快的速度下载 一次一组而不是一个。 程序员通常也使用 用于组织所属类的包 属于同一类别或提供 类似的功能

在Java中,类的源代码文件实际上是按目录组织的,但Java虚拟机(JVM)定位类的方法与C/C++等语言不同

假设您在源代码中使用了h
// Loads the class with the specified name.
// Example: loadClass("org.apache.nutch.plugin.Extension")
Class loadClass(String name)
import com.foo.bar.MyClass;

...

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