2010-07-16 101 views
0

假设某处我导入了javax.servlet.http.HttpServletJava包和类名称混淆

我的问题:

  1. 这是否意味着:我能找到的文件夹结构类似的javax/servlet的/ HTTP地方和HttpServlet.class文件里面会存在?

  2. 如果不是,那么这个类文件在哪里可以找到?

  3. 这是否意味着:这些只是嵌套命名空间与文件夹结构没有关系?

  4. 上面提到的进口包名是javax.servletjavax.servlet.http?可能两个都是包,第一个是后者的超级包?

  5. 这个类文件是如何实际包含的?我读过导入不像c/C++ include。

谢谢。

+1

这些不是“怀疑”......他们是“问题”。 – 2010-07-16 06:06:14

+0

@Stephen C:用'questions'代替'疑问':) – understack 2010-07-16 06:08:57

回答

2
  1. 看到1

  2. 看到1

  3. 包的名字是javax.servlet.http

  4. 的类加载器将定位类(从它的类路径)在运行时

1

这是否意味着:我能找到一个文件夹 结构类似的javax/servlet的/ HTTP 地方和 HttpServlet.class文件里面会存在 ?

是(最有可能是jar文件内包装)

Package name in the above mentioned import would be 

的javax.servlet或javax.servlet.http包? 大概都是包和第一个 一个是后来的一个超级包?

是再次

这是怎么类文件实际上 包括在内?我读过导入不像 c/C++ include。

进口packagename.classname而且必须是类声明的前前:

import javax.servlet.http.HttpServlet; 
+0

只是为了澄清:'javax.servlet'不是'javax.servlet.http'的“超级软件包”。包名称(名称空间)总是不相关的,它们是相同或不同的,没有别的。 – 2010-07-16 06:43:15

+0

谢谢Andreas你是对的。我在层次结构的意义上解释了它,http是servlet的一个子包。在阅读其他答复后,我意识到我犯了一个错误。 – Ross 2010-07-16 06:57:12

2
  1. 它也可能是在一个jar文件(在使用javax/servlet的/ HTTP目录)
  2. 否(请参阅1.)
  3. 更准确地说,它是母包
  4. 进口gi对正在编译的文件外部的类进行访问。 .class文件包含对其所需外部类的引用。常量(最终静态变量)可以内联(它们的值由编译器在使用它们的代码中插入)。
+0

“父包装”纯属约定。就Java平台而言,这两个软件包与“com.foo”和“org.bar”无关。 – 2010-07-16 12:04:45

2

1 - 这是否意味着:我能找到的文件夹结构类似javax/servlet/http地方和HttpServlet.class文件里面会存在?

在这种情况下,本身可能不在文件系统中。 (该类是J2SE运行时库的一部分。)

2 - 如果没有,那么这个类文件的确切位置可以找到?

在JVM的类路径或bootclasspath中的JAR文件中。 JAR文件是一个包含.class文件和其他资源的存档。 JAR文件中类的路径名将是/javax/servlet/http/HttpServlet.class。 (在这种情况下,在rt.jar文件中的类。)

3 - 这是否意味着:这些只是嵌套的命名空间,没有相关性的文件夹结构?

号如果你有你的类路径文件系统文件夹,它们可以搜索找到班,之前或之后的JAR文件,不同的地方在classpath他们。类路径有效地覆盖了命名空间。 JAR文件的命名空间可以覆盖文件系统文件夹的命名空间,反之亦然,具体取决于有效的类路径。

4 - 在上面提到的导入中的软件包名称是javax.servlet或javax.servlet.http?

javax.servlet.http

4续 - 也许两者都是包,第一个是后来的一个超级包?

两者都是软件包,但在Java中没有“超级软件包”这样的东西。就Java语言而言,javax.servletjavax.servlet.http是不相关的软件包。有些人可能会说javax.servletjavax.servlet.http的父包,但是从Java语言的角度来看,这个语句没有内在含义。明显的亲子关系纯属传统。

5 - 这个类文件是如何实际包含的?我读过的导入不像C/C++ include。

类文件在任何意义上都不是“包含”的。 Java import只不过是一种简写,它允许您引用导入的名称,而不用限定其全部名称。

+0

请注意,文件名'rt.jar'只是一些实现使用的常用名称,但不是必需的。 – 2010-07-16 12:00:40

+0

我相信所有的Sun JVM ... – 2010-07-16 14:00:24

1

完全合格的类名一个包名称(命名空间)和类名。让我们举一个简单的例子:

java.lang.Object 

的(简单)的类名是Object,该包名称为java.lang。 JLS中有一个实际的建议是构造一个包含标识符分隔的包名。这很实用,因为我们可以将包名映射到文件夹结构。上述示例中的软件包名称映射为./java/lang,即源文件的二进制文件为./java/lang/Object.class,文件为./java/lang/Object.java

这使得类加载器很容易在文件系统上找到类文件。类加载器简单地评估文件夹的名称空间(packagename)和类文件名称的简单类名。

一个常见的误解是思考,包名有些层次。这不是真的。包装com.example.beancom.example.bean.impl之间没有关系。第一个不是父类包。

0

对于稍高层次的答案:软件包名称是创建名称空间的一种方式 - 没有名称空间的层次结构。但是,实际的类(使用完全限定名称,例如javax.servlet.http.HttpServlet)需要由ClassLoader加载。

JVM使用的bog标准ClassLoader是java.net.URLClassLoader(以及子类)的一个实例。这可以查找给定目录或JAR文件起点的类。包名称覆盖文件系统结构以获取类的位置。

还有其他类加载器 - 大多数也遵循这个约定在一定程度上,但它只是一个约定。类加载器可以加载他们选择的类,包括动态生成它们。

对于javax.servlet.http.HttpServlet,您可能会在名为servlet.jarj2ee.jar的罐子中找到类文件。有一个名为JFind的整洁实用程序,它可以帮助您找到可以找到类的位置 - 在IDE中也很容易。

问题5 - 如其他人所说的,import语句只是将导入类或包到局部名字空间,让您使用的HttpServlet便捷的短名称,而不是使用javax.servlet.http.HttpServlet每次的长名字,你需要参考它。您可以使用Java进行编程,如果您喜欢,也不要使用导入语句,尽管人们可能会奇怪地看着您。