例如
import org.apache.nutch.plugin.Extension,
虽然多次使用,
我没有太多的想法是什么基本上完成。
编辑 :是否org.apache.nutch.plugin
基本上4个目录或少于4像一个名为org.apache
?
例如
import org.apache.nutch.plugin.Extension,
虽然多次使用,
我没有太多的想法是什么基本上完成。
编辑 :是否org.apache.nutch.plugin
基本上4个目录或少于4像一个名为org.apache
?
我想你可能试图要问的问题是,“什么是Java包,以及如何将import
关键字涉及到他们?” 。 您对目录结构混乱可能来自一个事实,即一些其它语言有茎include
在编译时使用的文件名从字面上包含指定文件的内容在你的源代码指令。 C / C ++是使用这种类型的语言的示例include
指令。 Java的import
关键字不会以这种方式工作。 正如其他人所说,在import
关键词是简单地在一个包引用一个或多个类的简便方法。 真正的工作是由Java虚拟机的类加载器(详情如下)完成。
让我们从一个“Java包”的定义开始,作为中描述的维基百科的文章 :
一个Java包是用于组织Java类成类似于MODULA的模块名称空间的机构。 Java包可以存储在一个名为JAR文件的压缩文件,允许类,下载速度更快作为一个群体,而不是一次一个。 程序员通常还用包来组织属于同一类别或提供类似功能的类。
在Java中,类的源代码文件实际上是由目录组织,而是由Java虚拟机(JVM)所在的班级方法是像C / C ++语言的不同。
假设在源代码中有一个名为“com.foo.bar”包,该包内有一个名为“MyClass的”类。 在编译时,在文件系统类的源代码的位置必须是{source}/com/foo/bar/MyClass.java
,其中{source}
是您正在编译源代码树的根。
Java和像C / C ++语言的一个区别是类加载器的概念。 事实上,一个类加载器的概念是Java虚拟机的架构的关键组成部分。 类加载器的任务就是找到并加载任何class
程序需要的文件。 在“原始”或“默认”的Java类加载器通常由JVM提供。 它是一个普通的类类型的ClassLoader
,并且包含称为方法loadClass()
具有以下定义:
// Loads the class with the specified name.
// Example: loadClass("org.apache.nutch.plugin.Extension")
Class loadClass(String name)
此loadClass()
方法将尝试找到class
用于与给定名称的类文件,并可以产生一个Class
,其具有对象newInstance()
能够实例化的类的方法。
哪里的类加载器搜索class
文件? 在JVM的类路径。 类路径是一个简单的位置列表,其中class
文件可以被找到。 这些位置可以是包含目录class
文件。 它甚至可以包含jar
文件,这些文件本身包含更多的class
文件。 默认的类加载器能够寻找这些内部的jar
文件中搜索class
文件。 作为一个侧面说明,你可以实现自己的类加载器,例如,允许网络位置(或任何其他位置)要搜索class
文件。
所以,现在我们知道,无论是否“com.foo.bar.MyClass”是一class
在你自己的源代码树中的文件或class
一个内部文件jar
文件某处类路径,类加载器会帮您找到它(如果存在)。 如果它不存在,你会得到一个ClassNotFoundException
。
而现在,以解决import
关键字:我将引用下面的例子:
import com.foo.bar.MyClass;
...
public void someFunction() {
MyClass obj1 = new MyClass();
org.blah.MyClass obj2 = new org.blah.MyClass("some string argument");
}
第一行是一个简单的方法来告诉编译器“当你看到声明仅仅作为类型的变量MyClass
,假设我的意思是com.foo.bar.MyClass
。这就是正在发生的事情的情况下obj1
在的情况下obj2
,您明确告诉编译器:“我不希望类com.foo.bar.MyClass
,其实我是想org.blah.MyClass
”。所以, import
的关键字是削减打字程序员的数量只是一个简单的方法已经为了使用其他类的事情。所有的有趣的东西在JVM的类加载器来完成。
有关的类加载器做什么,我建议你阅读的文章的详细信息叫的Java类加载器的基础知识
所有它做的是为您节省打字。 而不必键入“org.apache.nutch.plugin.Extension”你想用它每一次的,进口允许你通过它的简称,“扩展”来称呼它。
不要被这个词“进口”相混淆 - 这不加载.class文件或类似的东西。 类加载器将搜索它的CLASSPATH并将其加载到烫发空间第一次你的代码需要它。
更新:作为一个开发者,你必须知道,包装与目录有关。 如果您在您的.java文件包“com.foo.bar.baz”,这将有被存储在一个目录COM /富/酒吧/巴兹。
但是,当你下载一个JAR文件,像Apache的Nutch的图书馆,有没有从你的观点涉及目录。 谁创造了JAR的人不得不拉上正确的目录结构,你可以为路径的.class文件,如果你使用WinZip打开JAR看到。 你只要把该JAR的类路径中您的应用程序,当你编译和运行。
进口只是提示编译器,告诉他如何找出类的全名。
所以,如果你有“进口的java.util。*;” 并在代码中,你正在做的,如“新的ArrayList()”,一些当编译器处理这种表达它首先需要找到ArrayList类型的全名。 它通过去通进口的列表,并追加ArrayList的每个进口这样做。 具体而言,当其附加的ArrayList到java.util中它得到了FQN java.util.ArrayList中。 然后查找这个FQN在同级车路径。 如果发现有这样一个名称的类,那么它知道java.util.ArrayList的名称是正确的。
在“org.apache.nutch.plugin”基本上4个目录?
如果你有一个类名是org.apache.nutch.plugin.Extension
,然后将其保存在某个地方在classpath的文件org/apache/nutch/plugin/Extension.class
。 所以根目录下包含四个嵌套子目录(“组织”,“阿帕奇”,“Nutch的”,“插件”),又包含类文件。
import org.apache.nutch.plugin.Extension
是一个编译时的快捷方式,使您可以参考扩展类不使用类的全名。 它在运行时没有任何意义,它只是一个编译时间骗局拯救打字。
按照惯例这个类的.class文件将位于文件夹中组织/阿帕奇/ Nutch的/插件无论是在文件系统或一个jar文件,其中任何一个需要在你的classpath中,无论是在编译时和运行时。 如果.class文件是一个jar文件,然后该JAR文件必须在类路径中。 如果.class文件是一个文件夹中,那么这就是文件夹“组织”的父文件夹需要在你的classpath。 例如,如果类是位于文件夹C:\ MyProject的\ BIN \组织\阿帕奇\ Nutch的\插件则文件夹C:\ MyProject的\ BIN将需要的类路径的一部分。
如果你有兴趣了解其中类是从当你运行你的程序加载,使用-verbose:class
java命令行选项。 它会告诉你哪个文件夹或JAR文件中的JVM中的类。
基本上,当你犯了一个类,你可以声明它是一个包的一部分。 我个人没有与包做太多的经验。 然而,据我所知,这基本上意味着你从org.apache.nutch.plugin包导入扩展类。
关栋的托马斯的回答,org.apache.nutch.plugin是要导入的类文件(S)的路径。 我不知道这个特定的软件包,但通常你必须要添加到您的类路径中一个.jar文件,你的import语句指向目录” ./[classpath]/[jarfile]/org/apache/ Nutch的/插件”
你不能有一个名为org.apache
作为一个包。 编译器将无法理解这个名字,并会查找的目录结构org/apache
当您从包中导入的任何类。
同时,不要弄错了Java import
与C语句#include
预处理指令。 在import
语句,就像他们已经说过了,为你指向一个类的名字时,键入较少的字符的简写。