簡體   English   中英

Java包和類名的混淆

[英]Java package and class name confusions

假設我在某個地方導入了javax.servlet.http.HttpServlet

我的問題:

  1. 這是否意味着:我可以在某個HttpServlet.class文件中某個位置和內部找到類似javax / servlet / http的文件夾結構?

  2. 如果沒有,那么在哪里可以找到該類文件?

  3. 這是否意味着:這些只是嵌套的名稱空間,與文件夾結構無關?

  4. 上面提到的導入中的包名稱將是javax.servletjavax.servlet.http 可能兩者都是包裝,第一個是后一個的超級包裝?

  5. 該類文件實際上是如何包含的? 我讀過導入不喜歡c / c ++ include。

謝謝。

  1. 也可以放在jar文件中(在javax / servlet / http目錄中)
  2. 否(請參閱1.)
  3. 更確切地說,它是父包
  4. 導入可訪問正在編譯的文件外部的類。 .class文件包含對其所需的外部類的引用。 可以內聯常量(最終靜態變量)(它們的值由編譯器插入使用它們的代碼中)。
  1. 見1。

  2. 見1。

  3. 軟件包名稱是javax.servlet.http

  4. 類加載器將在運行時定位類(從其類路徑)

1-這是否意味着:我可以在某個HttpServlet.class文件存在的地方找到javax/servlet/http類的文件夾結構?

在這種情況下,本質上可能不在文件系統中。 (此類是J2SE運行時庫的一部分。)

2-如果沒有,則在哪里可以找到該類文件?

在JVM的類路徑或引導類路徑上的JAR文件中。 JAR文件是一個包含.class文件和其他資源的存檔。 JAR文件中的類的路徑/javax/servlet/http/HttpServlet.class/javax/servlet/http/HttpServlet.class (在這種情況下, rt.jar文件中的類。)

3-這是否意味着:這些僅僅是嵌套的名稱空間,與文件夾結構無關?

否。如果您的類路徑上有文件系統文件夾,則可能會在JAR文件之前或之后搜索它們以查找類,具體取決於它們在類路徑上的位置。 類路徑有效地覆蓋了名稱空間。 根據有效的類路徑,JAR文件的命名空間可以覆蓋文件系統文件夾的命名空間,反之亦然。

4-在上述導入中的程序包名稱是javax.servlet還是javax.servlet.http?

javax.servlet.http

4繼續-可能都是包裝,第一個是后一個的超級包裝?

兩者都是軟件包,但是在Java中沒有“超級軟件包”之類的東西。 就Java語言而言, javax.servletjavax.servlet.http是無關的軟件包。 有些人可能會說javax.servlet是父包javax.servlet.http ,但這一說法從Java語言的角度看沒有任何內在含義。 明顯的親子關系純屬常規。

5-該類文件實際上是如何包含的? 我讀過導入不像C / C ++ include。

在任何意義上都不“包含”類文件。 Java import只不過是一種簡寫形式,它使您可以引用導入的名稱,而無需使用完整的軟件包名稱對其進行限定。

這是否意味着:我可以在某個HttpServlet.class文件中某個位置和內部找到類似javax / servlet / http的文件夾結構?

是(很可能打包在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;

完全限定的類名一個包名(名稱空間)和類名組成。 讓我們舉一個簡單的例子:

 java.lang.Object

(簡單的)類名是Object ,包名是java.lang 在JLS中,有一個實用的建議是使用點號分隔的標識符構造一個包名。 這是實用的,因為這樣可以將包名映射到文件夾結構。 從上面的例子中包名被映射到./java/lang ,完全合格的類名的文件./java/lang/Object.class用於二進制和./java/lang/Object.java為源文件。

這使得類加載器很容易在文件系統上查找類文件。 類加載器僅評估文件夾的名稱空間(包名稱),並為類文件的名稱評估簡單的類名稱。

一個普遍的誤解是思考,包名有些層次。 這不是真的。 com.example.beancom.example.bean.impl之間沒有關系。 第一個不是父包。

對於更高層次的答案:包名稱是創建名稱空間的一種方法-沒有名稱空間的層次結構。 但是,實際的類(使用標准名稱,例如javax.servlet.http.HttpServlet )需要由ClassLoader加載。

JVM使用的沼澤標准ClassLoader是java.net.URLClassLoader的實例(很好,是一個子類)。 給定目錄或JAR文件的起點,這可以查找類。 程序包名稱是覆蓋在文件系統結構上以獲取類位置的名稱。

還有其他ClassLoader -大多數也都在某種程度上遵循此約定,但這只是一個約定。 ClassLoader可以按自己選擇的方式加載類,包括動態生成它們。

對於javax.servlet.http.HttpServlet ,您可能會在一個名為servlet.jarj2ee.jar之類的jar中找到類文件。 有一個名為JFind的簡潔實用程序,可以幫助您找到可以找到類的位置-通常在IDE中也很容易。

對於問題5-正如其他人所提到的,import語句只是將導入的類或包帶入本地名稱空間,從而使您每次都可以使用HttpServlet的方便簡稱而不是javax.servlet.http.HttpServlet的冗長名稱。需要參考它。 您可以使用Java進行編程,並且不會隨意使用import語句,盡管人們可能會奇怪地看着您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM