麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

再議package包的問題

2019-11-18 13:20:17
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 一级一级一级毛片 | 高清一区二区在线观看 | 欧美一极视频 | 羞羞视频一区 | 国产亚洲精品综合一区 | 91精品国产福利尤物免费 | 久久亚洲精品国产一区 | 亚洲午夜精品视频 | 久久久久久三区 | 亚洲成人福利电影 | 欧美一区二区网站 | 国产一级一国产一级毛片 | 蜜桃视频在线免费播放 | 午夜视频在线观看免费视频 | 爱操成人网 | 最新中文字幕第一页视频 | 久久精品.com | xxxxxx性 | 国产免费人做人爱午夜视频 | 免费a级毛片永久免费 | 国产一区二区二 | 国产亚洲高清视频 | 日韩av在线播放一区 | 婷婷中文字幕一区二区三区 | 亚洲影视中文字幕 | 欧美精品在线视频观看 | 成年免费观看视频 | 国产一级性生活视频 | 精品99在线视频 | 一区二区三区日韩精品 | 精品一区二区在线视频 | 亚洲视频成人 | 久久av一区二区 | 久草在线综合网 | 久久久鲁 | 欧美性受xxxxxx黑人xyx性爽 | www视频免费在线观看 | 97中文 | 成人午夜视频免费在线观看 | 久久另类视频 | 国产69精品久久久久孕妇黑 |