Java导入如何工作?

我想知道import声明是如何工作的。

我问这是因为我的项目中有以下imports

 import static com.googlecode.javacv.jna.highgui.cvCreateCameraCapture; import static com.googlecode.javacv.jna.highgui.cvGrabFrame; import static com.googlecode.javacv.jna.highgui.cvReleaseCapture; import com.googlecode.javacv.CanvasFrame; import com.googlecode.javacv.FrameGrabber; import com.colorfulwolf.webcamapplet.gui.ImagePanel; import com.googlecode.javacv.OpenCVFrameGrabber; import com.googlecode.javacv.jna.cxcore.IplImage; 

我的项目中没有这些软件包,那么如何导入?

如果我用我所有的类创build一个JAR文件,我的服务器将托pipe这个JAR文件,必须通过免费的Internet访问才能获得这些package

我在Applet中遇到了一些有这些导入问题的问题,我在问这个问题,了解是否可以成为Internet规则。

 <applet code="com.colorfulwolf.webcamapplet.WebcamApplet" archive="http://san.redenetimoveis.com/teste.jar, http://san.redenetimoveis.com/core.jar, http://san.redenetimoveis.com/javacv.jar, http://san.redenetimoveis.com/javase.jar, http://san.redenetimoveis.com/jna.jar, http://san.redenetimoveis.com/customizer.jar, http://san.redenetimoveis.com/jmf.jar, http://san.redenetimoveis.com/mediaplayer.jar, http://san.redenetimoveis.com/multiplayer.jar, http://san.redenetimoveis.com/sound.jar" height="550" width="550"> </applet> 

在dynamic语言中,当解释器import ,它只是读取文件并对其进行评估。

在C中,如果库是静态编译的 ,则外部库在编译时由链接器定位以构build最终对象,而对于dynamic库 ,在运行时调用较小版本的链接器,这重新映射地址并使得库中的代码可用到可执行文件。

在Java中,编译器简单地使用import来让你用非限定名称来命名类,让我们说String而不是java.lang.String 。 你并不需要导入java.lang.*因为编译器默认是这样做的。 然而这个机制只是为了节省一些打字。 Java中的types是完全限定的类名,所以当代码运行时, String实际上就是一个java.lang.String对象。 包旨在防止名称冲突,并允许两个类具有相同的简单名称 ,而不是依靠像这样的前缀types的 C约定。 java_lang_String 。 这被称为命名空间

顺便说一下,在Java中有静态导入结构,如果您使用某个类的大量常量,它可以进一步节省input。 在声明的编译单元(.java文件)中

 import static java.lang.Math.*; 

您可以在代码中使用常量PI ,而不是通过Math.PI引用,而使用方法cos()而不是Math.cos() 。 所以例如你可以写

 double r = cos(PI * theta); 

一旦你了解到类在最终的字节码中总是被完全限定的名字引用,你就必须理解类代码是如何加载的。 第一次创build该类的对象时,或者第一次访问该类的静态成员时,会发生这种情况。 此时, ClassLoader试图find类并实例化它。 如果找不到该类,则抛出ClassNotFoundException 。 为了find这个类, ClassLoader通常检查$CLASSPATH环境variables中列出的path。

为了解决你的问题, 似乎你需要一个像这样的applet元素

 <applet codebase = "http://san.redenetimoveis.com" archive="test.jar, core.jar" code="com.colorfulwolf.webcamapplet.WebcamApplet" width="550" height="550" > 

顺便说一句,你不需要导入标准JRE中的档案。

Java的import语句是纯粹的语法糖。 导入仅在编译时进行评估,以向编译器指示在代码中查找名称的位置。

当您总是指定完整的课程名称时,您可能没有任何导入声明。 像这条线一样不需要任何导入语句:

 javax.swing.JButton but = new javax.swing.JButton(); 

导入语句将使您的代码更具可读性,如下所示:

 import javax.swing.*; JButton but = new JButton(); 

在Java中导入根本不起作用,因为它仅在编译时进行评估。 (把它当作快捷键,这样你就不必写完全合格的类名)。 在运行时,根本就没有导入,只有FQCN。

在运行时,所有你引用的类都可以被类加载器find。 (类加载器基础结构有时是黑暗的魔法,高度依赖于环境。)如果使用applet,则必须正确地configurationHTML标记,并在服务器上提供必要的JAR归档。

PS:在运行时的匹配是通过合格的类名完成的 – 在这个名字下find的类不一定是相同的,或者与你编译的类相匹配。

javac (或运行时的java )查找正在classpath中导入的classpath 。 如果它们不在classpath则抛出classnotfoundexception。

classpath就像shell中的pathvariables一样,shell使用它来查找命令或可执行文件。

整个目录或单个jar文件可以放在classpath 。 另外,是的, classpath可能包含一个不是本地的path,而是在互联网上的某个地方。 请阅读更多有关classpath的信息,以解决您的疑惑。

您正在导入的类必须位于类path中。 所以你的Applet的用户必须把这些库放在正确的位置,或者你只需​​要把它们包含在你的jar文件中来提供这些库。 例如像这样: 将发布合并到一个JAR文件中的最简单的方法