1. 程式人生 > >java中package(包)的使用理解

java中package(包)的使用理解

java中package(包)的使用理解

2017年02月05日 02:30:08 FengGLA 閱讀數:17755 標籤: java 更多

個人分類: java學習筆記

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/FengGLA/article/details/54869858

最近在學習java,在學習到物件和類這一部分時,接觸了java中很重要的一個概念:package,也就是包。一開始對於package的使用我產生了許多疑惑,不僅是理論上的,在實際寫程式碼的嘗試中也出現了許多意想不到的錯誤。之後自己查閱了許多部落格以及stackoverflow上的一些講解,再結合編寫程式碼試驗,總算是稍微弄清楚了關於package的使用,在此為自己的理解做一個筆記。

package的簡單定義如下:package是一個為了方便管理組織java檔案的目錄結構,並防止不同java檔案之間發生命名衝突而存在的一個java特性。不同package中的類的名字可以相同,只是在使用時要帶上package的名稱加以區分。

在使用package的時候,如果java檔案中使用了package,那麼該java檔案必須放在命名與package名稱相同的目錄下,比如:

 
  1. package test;

  2.  
  3. public class Test {}

該檔案的目錄結構則為:...test/Test.java

 

又如:

 
  1. package com.micheal.test

  2.  
  3. public class Test {}

java直譯器會將package中的.解釋為目錄分隔符/,也就是說該檔案的目錄結構為:...com/micheal/test/Test.java

 

那麼package中的類的訪問許可權是怎麼樣的呢?在同一package中的類是可以互相訪問的,比如:

 
  1. //Test1.java

  2.  
  3. package test;

  4.  
  5. class Test1 {}

  6.  
  7. //Test2.java

  8.  
  9. package test;

  10.  
  11. public class Test2 {

  12. public static void main(String[] args) {

  13. Test1 t;

  14. }

  15. }

由於Test2與Test1在同一個package——test中,所以Test2能夠直接呼叫Test1生成Test1的引用變數t;在命令列進行編譯時,直接編譯Test2.java即可:javac Test2.java(若沒有進入Test1和Test2的目錄,需在Test2前加上絕對路徑)

 

若類在不同的package中,那麼在一個類中要呼叫另一個package中的類(必須是public類,非public類不支援不同包間訪問),需要在類名前明確加上package名稱;不過,java中存在一個讓java程式設計師偷懶的特性,叫做import關鍵字。使用import就可以在一個package中匯入另一個package中的類,不過import和C語言和C++中的#include是不同的,import並不會在當前java檔案中嵌入另一個package中的類的程式碼,只是告訴java檔案,不屬於該包的類能夠到哪裡去尋找而已:

 
  1. package p1;

  2.  
  3. //import p2.Test2

  4.  
  5. public class Test1 {

  6. public static void main(String[] args) {

  7. p2.Test2 t;//Test2 t if we import p2.Test2 before;

  8. }

  9. }

那麼問題來了,java檔案在編譯時如何知道p2這個package在哪?這裡要提到一個重要的變數:classpath。classpath是java在編譯程式時查詢類檔案的路徑,java編譯器會在classpath中包含有的路徑中查詢java的類檔案。

舉個例子,比如說classpath的值(Windows下)是.(當前目錄);C:/,那麼編譯器在查詢類的時候,就只會在當前目錄和C:/中查詢。所以如果p2這個目錄與p1在同一目錄層次下,那麼p2就能直接被查詢到了,查詢也就結束了;如果不在的話,比如說p1的目錄結構是C:/document/java/project/p1,p2的目錄結構是C:/document/java/test/p2,那麼如果C:/document/java/test不在classpath中,java直譯器是找不到p2這個package的位置的,那麼就會提示錯誤,因此需要將C:/document/java/test加入到classpath中。