[英]Java package and class name confusions
假設我在某個地方導入了javax.servlet.http.HttpServlet
。
我的問題:
這是否意味着:我可以在某個HttpServlet.class文件中某個位置和內部找到類似javax / servlet / http的文件夾結構?
如果沒有,那么在哪里可以找到該類文件?
這是否意味着:這些只是嵌套的名稱空間,與文件夾結構無關?
上面提到的導入中的包名稱將是javax.servlet
或javax.servlet.http
? 可能兩者都是包裝,第一個是后一個的超級包裝?
該類文件實際上是如何包含的? 我讀過導入不喜歡c / c ++ include。
謝謝。
是
見1。
見1。
軟件包名稱是javax.servlet.http
類加載器將在運行時定位類(從其類路徑)
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.servlet
和javax.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.bean
和com.example.bean.impl
之間沒有關系。 第一個不是父包。
對於更高層次的答案:包名稱是創建名稱空間的一種方法-沒有名稱空間的層次結構。 但是,實際的類(使用標准名稱,例如javax.servlet.http.HttpServlet
)需要由ClassLoader加載。
JVM使用的沼澤標准ClassLoader是java.net.URLClassLoader
的實例(很好,是一個子類)。 給定目錄或JAR文件的起點,這可以查找類。 程序包名稱是覆蓋在文件系統結構上以獲取類位置的名稱。
還有其他ClassLoader -大多數也都在某種程度上遵循此約定,但這只是一個約定。 ClassLoader可以按自己選擇的方式加載類,包括動態生成它們。
對於javax.servlet.http.HttpServlet
,您可能會在一個名為servlet.jar
或j2ee.jar
之類的jar中找到類文件。 有一個名為JFind的簡潔實用程序,可以幫助您找到可以找到類的位置-通常在IDE中也很容易。
對於問題5-正如其他人所提到的,import語句只是將導入的類或包帶入本地名稱空間,從而使您每次都可以使用HttpServlet
的方便簡稱而不是javax.servlet.http.HttpServlet
的冗長名稱。需要參考它。 您可以使用Java進行編程,並且不會隨意使用import語句,盡管人們可能會奇怪地看着您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.