国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

再議package包的問(wèn)題

2019-11-18 13:20:17
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

   通常package包會(huì)把很多人搞糊涂,于是我翻閱資料發(fā)現(xiàn)“java編程思想”中有比較詳盡
  的解釋于是與大家分享,希望能祝你一臂之力。
  
  package解析自己為機(jī)器上的一個(gè)目錄。這樣一來(lái),Java程序運(yùn)行并需要裝載.class文件的時(shí)候,它就可以找到.class文件駐留的那個(gè)目錄。
  Java解釋器的工作程序如下:首先,它找到環(huán)境變量CLASSPATH(將Java或者具有Java解釋能力的工具——如瀏覽器——安裝到機(jī)器中時(shí),通過(guò)操作系統(tǒng)進(jìn)行設(shè)定)。CLASSPATH包含了一個(gè)或多個(gè)目錄,它們作為一種非凡的“根”使用,從這里展開(kāi)對(duì).class文件的搜索。從那個(gè)根開(kāi)始,解釋器會(huì)尋找包名,并將每個(gè)點(diǎn)號(hào)(句點(diǎn))替換成一個(gè)斜杠,從而生成從CLASSPATH根開(kāi)始的一個(gè)路徑名(所以package foo.bar.baz會(huì)變成foo/bar/baz或者foo/bar/baz;具體是正斜杠還是反斜杠由操作系統(tǒng)決定)。隨后將它們連接到一起,成為CLASSPATH內(nèi)的各個(gè)條目(入口)。以后搜索.class文件時(shí),就可從這些地方開(kāi)始查找與預(yù)備創(chuàng)建的類(lèi)名對(duì)應(yīng)的名字。此外,它也會(huì)搜索一些標(biāo)準(zhǔn)目錄——這些目錄與Java解釋器駐留的地方有關(guān)。
  為進(jìn)一步理解這個(gè)問(wèn)題,下面以我自己的域名為例,它是brUCeeckel.com。將其反轉(zhuǎn)過(guò)來(lái)后,com.bruceeckel就為我的類(lèi)創(chuàng)建了獨(dú)一無(wú)二的全局名稱(chēng)(com,edu,org,net等擴(kuò)展名以前在Java包中都是大寫(xiě)的,但自Java 1.2以來(lái),這種情況已發(fā)生了變化。現(xiàn)在整個(gè)包名都是小寫(xiě)的)。由于決定創(chuàng)建一個(gè)名為util的庫(kù),我可以進(jìn)一步地分割它,所以最后得到的包名如下:
  package com.bruceeckel.util;
  現(xiàn)在,可將這個(gè)包名作為下述兩個(gè)文件的“命名空間”使用:
  
  //: Vector.java
  // Creating a package
  package com.bruceeckel.util;
  
  public class Vector {
   public Vector() {
    System.out.PRintln(
     "com.bruceeckel.util.Vector");
   }
  } ///:~
  
  創(chuàng)建自己的包時(shí),要求package語(yǔ)句必須是文件中的第一個(gè)“非注釋”代碼。第二個(gè)文件表面看起來(lái)是類(lèi)似的:
  
  //: List.java
  // Creating a package
  package com.bruceeckel.util;
  
  public class List {
   public List() {
    System.out.println(
     "com.bruceeckel.util.List");
   }
  } ///:~
  
  這兩個(gè)文件都置于我自己系統(tǒng)的一個(gè)子目錄中:
  C:/DOC/JavaT/com/bruceeckel/util
  若通過(guò)它往回走,就會(huì)發(fā)現(xiàn)包名com.bruceeckel.util,但路徑的第一部分又是什么呢?這是由CLASSPATH環(huán)境變量決定的。在我的機(jī)器上,它是:
  CLASSPATH=.;D:/JAVA/LIB;C:/DOC/JavaT
  可以看出,CLASSPATH里能包含大量備用的搜索路徑。然而,使用JAR文件時(shí)要注重一個(gè)問(wèn)題:必須將JAR文件的名字置于類(lèi)路徑里,而不僅僅是它所在的路徑。所以對(duì)一個(gè)名為grape.jar的JAR文件來(lái)說(shuō),我們的類(lèi)路徑需要包括:
  CLASSPATH=.;D:/JAVA/LIB;C:/flavors/grape.jar
  正確設(shè)置好類(lèi)路徑后,可將下面這個(gè)文件置于任何目錄里(若在執(zhí)行該程序時(shí)碰到麻煩,請(qǐng)參見(jiàn)第3章的3.1.2小節(jié)“賦值”):
  
  //: LiBTest.java
  // Uses the library
  package c05;
  import com.bruceeckel.util.*;
  
  public class LibTest {
   public static void main(String[] args) {
    Vector v = new Vector();
    List l = new List();
   }
  } ///:~
  
  編譯器碰到import語(yǔ)句后,它會(huì)搜索由CLASSPATH指定的目錄,查找子目錄com/bruceeckel/util,然后查找名稱(chēng)適當(dāng)?shù)囊丫幾g文件(對(duì)于Vector是Vector.class,對(duì)于List則是List.class)。注重Vector和List內(nèi)無(wú)論類(lèi)還是需要的方法都必須設(shè)為public。
  戀灳
  1. 自動(dòng)編譯
  為導(dǎo)入的類(lèi)首次創(chuàng)建一個(gè)對(duì)象時(shí)(或者訪問(wèn)一個(gè)類(lèi)的static成員時(shí)),編譯器會(huì)在適當(dāng)?shù)哪夸浝飳ふ彝?class文件(所以假如創(chuàng)建類(lèi)X的一個(gè)對(duì)象,就應(yīng)該是X.class)。若只發(fā)現(xiàn)X.class,它就是必須使用的那一個(gè)類(lèi)。然而,假如它在相同的目錄中還發(fā)現(xiàn)了一個(gè)X.java,編譯器就會(huì)比較兩個(gè)文件的日期標(biāo)記。假如X.java比X.class新,就會(huì)自動(dòng)編譯X.java,生成一個(gè)最新的X.class。
  對(duì)于一個(gè)特定的類(lèi),或在與它同名的.java文件中沒(méi)有找到它,就會(huì)對(duì)那個(gè)類(lèi)采取上述的處理。
  
  2. 沖突
  若通過(guò)*導(dǎo)入了兩個(gè)庫(kù),而且它們包括相同的名字,這時(shí)會(huì)出現(xiàn)什么情況呢?例如,假定一個(gè)程序使用了下述導(dǎo)入語(yǔ)句:
  import com.bruceeckel.util.*;
  import java.util.*;
  由于java.util.*也包含了一個(gè)Vector類(lèi),所以這會(huì)造成潛在的沖突。然而,只要沖突并不真的發(fā)生,那么就不會(huì)產(chǎn)生任何問(wèn)題——這當(dāng)然是最理想的情況,因?yàn)榉駝t的話,就需要進(jìn)行大量編程工作,防范那些可能可能永遠(yuǎn)也不會(huì)發(fā)生的沖突。
  如現(xiàn)在試著生成一個(gè)Vector,就肯定會(huì)發(fā)生沖突。如下所示:
  Vector v = new Vector();
  它引用的到底是哪個(gè)Vector類(lèi)呢?編譯器對(duì)這個(gè)問(wèn)題沒(méi)有答案,讀者也不可能知道。所以編譯器會(huì)報(bào)告一個(gè)錯(cuò)誤,強(qiáng)迫我們進(jìn)行明確的說(shuō)明。例如,假設(shè)我想使用標(biāo)準(zhǔn)的Java Vector,那么必須象下面這樣編程:
  java.util.Vector v = new java.util.Vector();
  由于它(與CLASSPATH一起)完整指定了那個(gè)Vector的位置,所以不再需要import java.util.*語(yǔ)句,除非還想使用來(lái)自java.util的其他東西。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 马尔康县| 都江堰市| 内丘县| 道孚县| 武山县| 永清县| 天全县| 杭锦后旗| 丰顺县| 龙江县| 英山县| 刚察县| 稷山县| 凌海市| 长子县| 静宁县| 邻水| 二连浩特市| 海南省| 遵义市| 新昌县| 健康| 慈利县| 马边| 偏关县| 泸西县| 吉木乃县| 卫辉市| 英德市| 吴旗县| 靖江市| 微山县| 涿州市| 呼伦贝尔市| 曲阜市| 慈溪市| 井研县| 德钦县| 广水市| 都昌县| 阿鲁科尔沁旗|