2010-07-16 109 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進行編程,如果您喜歡,也不要使用導入語句,儘管人們可能會奇怪地看着您。