熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

再議package包的問題

2013-11-15 11:47:17  來源: JSP教程 

   通常package包會把很多人搞糊塗於是我翻閱資料發現java編程思想中有比較詳盡
  的解釋於是與大家分享希望能祝你一臂之力
  
  package解析自己為機器上的一個目錄這樣一來Java程序運行並需要裝載class文件的時候它就可以找到class文件駐留的那個目錄
  Java解釋器的工作程序如下首先它找到環境變量CLASSPATH(將Java或者具有Java解釋能力的工具——如浏覽器——安裝到機器中時通過操作系統進行設定)CLASSPATH包含了一個或多個目錄它們作為一種特殊的使用從這裡展開對class文件的搜索從那個根開始解釋器會尋找包名並將每個點號(句點)替換成一個斜槓從而生成從CLASSPATH根開始的一個路徑名(所以package foobarbaz會變成foo\bar\baz或者foo/bar/baz具體是正斜槓還是反斜槓由操作系統決定)隨後將它們連接到一起成為CLASSPATH內的各個條目(入口)以後搜索class文件時就可從這些地方開始查找與准備創建的類名對應的名字此外它也會搜索一些標准目錄——這些目錄與Java解釋器駐留的地方有關
  為進一步理解這個問題下面以我自己的域名為例它是將其反轉過來後combruceeckel就為我的類創建了獨一無二的全局名稱(comeduorgnet等擴展名以前在Java包中都是大寫的但自Java 以來這種情況已發生了變化現在整個包名都是小寫的)由於決定創建一個名為util的庫我可以進一步地分割它所以最後得到的包名如下
  package combruceeckelutil;
  現在可將這個包名作為下述兩個文件的命名空間使用
  
  //: Vectorjava
  // Creating a package
  package combruceeckelutil;
  
  public class Vector {
   public Vector() {
    Systemoutprintln(
     combruceeckelutilVector);
   }
  } ///:~
  
  創建自己的包時要求package語句必須是文件中的第一個非注釋代碼第二個文件表面看起來是類似的
  
  //: Listjava
  // Creating a package
  package combruceeckelutil;
  
  public class List {
   public List() {
    Systemoutprintln(
     combruceeckelutilList);
   }
  } ///:~
  
  這兩個文件都置於我自己系統的一個子目錄中
  C:\DOC\JavaT\com\bruceeckel\util
  若通過它往回走就會發現包名combruceeckelutil但路徑的第一部分又是什麼呢?這是由CLASSPATH環境變量決定的在我的機器上它是
  CLASSPATH=;D:\JAVA\LIB;C:\DOC\JavaT
  可以看出CLASSPATH裡能包含大量備用的搜索路徑然而使用JAR文件時要注意一個問題必須將JAR文件的名字置於類路徑裡而不僅僅是它所在的路徑所以對一個名為grapejar的JAR文件來說我們的類路徑需要包括
  CLASSPATH=;D:\JAVA\LIB;C:\flavors\grapejar
  正確設置好類路徑後可將下面這個文件置於任何目錄裡(若在執行該程序時遇到麻煩請參見第章的小節賦值
  
  //: LibTestjava
  // Uses the library
  package c;
  import combruceeckelutil*;
  
  public class LibTest {
   public static void main(String[] args) {
    Vector v = new Vector();
    List l = new List();
   }
  } ///:~
  
  編譯器遇到import語句後它會搜索由CLASSPATH指定的目錄查找子目錄com\bruceeckel\util然後查找名稱適當的已編譯文件(對於Vector是Vectorclass對於List則是Listclass)注意Vector和List內無論類還是需要的方法都必須設為public
  戀灳
   自動編譯
  為導入的類首次創建一個對象時(或者訪問一個類的static成員時)編譯器會在適當的目錄裡尋找同名的class文件(所以如果創建類X的一個對象就應該是Xclass)若只發現Xclass它就是必須使用的那一個類然而如果它在相同的目錄中還發現了一個Xjava編譯器就會比較兩個文件的日期標記如果Xjava比Xclass新就會自動編譯Xjava生成一個最新的Xclass
  對於一個特定的類或在與它同名的java文件中沒有找到它就會對那個類采取上述的處理
  
   沖突
  若通過*導入了兩個庫而且它們包括相同的名字這時會出現什麼情況呢?例如假定一個程序使用了下述導入語句
  import combruceeckelutil*;
  import javautil*;
  由於javautil*也包含了一個Vector類所以這會造成潛在的沖突然而只要沖突並不真的發生那麼就不會產生任何問題——這當然是最理想的情況因為否則的話就需要進行大量編程工作防范那些可能可能永遠也不會發生的沖突
  如現在試著生成一個Vector就肯定會發生沖突如下所示
  Vector v = new Vector();
  它引用的到底是哪個Vector類呢?編譯器對這個問題沒有答案讀者也不可能知道所以編譯器會報告一個錯誤強迫我們進行明確的說明例如假設我想使用標准的Java Vector那麼必須象下面這樣編程
  javautilVector v = new javautilVector();
  由於它(與CLASSPATH一起)完整指定了那個Vector的位置所以不再需要import javautil*語句除非還想使用來自javautil的其他東西
  
  

From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19626.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.