Java基礎07 包

來源:互聯網
上載者:User

標籤:

我們已經寫了一些Java程式。之前的每個Java程式都被儲存為一個檔案,比如Test.java。隨後,該程式被編譯為Test.class。我們最終使用$java Test來運行程式。

然而,在一個正常的Java項目中,我們往往需要編寫不止一個.java程式,最終的Java產品包括了所有的Java程式。因此,Java需要解決組織Java程式的問題。包(package)的目的就是為了更好的組織Java程式。

 

 

包的建立

包的建立非常簡單。我們只用在Java程式的開始加入package就可以了。我們以Human類為例,將它放入包中:

 
package com.vamei.society;public class Human{    /**     * constructor     */    public Human(int h)    {        this.height = h;        System.out.println("I‘m born");    }    /**     * accessor     */    public int getHeight()    {        return this.height;    }    /**     * mutator     */    public void growHeight(int h)    {        this.height = this.height + h;    }    private int height;}
 

 

上面的第一行語句

package com.vamei.society;

表示該程式在com.vamei.society包中。com.vamei(vamei.com的反寫)表示包作者的網域名稱 (很可惜,這個網域名稱已經被別人註冊了,所以只起示範作用)。Java要求包要有網域名稱首碼,以便區分不同作者。society為進一步的本地路徑名。com.vamei.society共同構成了包的名字。

包為Java程式提供了一個命名空間(name space)。 一個Java類的完整路徑由它的包和類名共同構成,比如com.vamei.society.Human。相應的Human.java程式要放在 com/vamei/society/下。類是由完整的路徑識別的,所以不同的包中可以有同名的類,Java不會混淆。比如 com.vamei.society.Human和com.vamei.creature.Human是兩個不同的類。

 

再看一個細節。Human類是public 的,其構造方法也是public的,所以任意其他對象都可以調用該類。我們之前說過,一個Java檔案中只能有一個public的類,該類要與.java 檔案同名。一個類可以沒有public關鍵字,它實際上也表示一種許可權: 該類在它所在的包中可見。也就是說,包中的其他Java程式可以訪問該類。這是Java中的預設存取權限。

同樣,對象的成員也可以是預設許可權(包中可見)。比如我們去掉getHeight()方法前面的public關鍵字。

 

包的調用

我們只需要將Human.java編譯的Human.class放入相應的檔案夾就可以了。比如,我將Human.class放入com/vamei/society/中。實際上,你也可以把.java檔案放入相應路徑,Java會在使用時自動編譯。

如果整個包(也就是com檔案夾)位於當前的工作路徑中,那麼不需要特別的設定,就可以使用包了,比如下面的TestAgain.java:

 
import com.vamei.society.*;public class TestAgain{    public static void main(String[] args)    {        Human aPerson = new Human(180);        System.out.println(aPerson.getHeight());    }}
 

import用於識別路徑。利用import語句,我們可以引入相應路徑下的類。*表示引入society檔案夾下的所有類。在TestAgain中,我們直接使用了Human類。

 

 

我們也可以提供類的完整的路徑。這可以區分同名但不同路徑的類,比如:

 
public class TestAgain{    public static void main(String[] args)    {        com.vamei.society.Human aPerson =                   new com.vamei.society.Human(180);        System.out.println(aPerson.getHeight());    }}
 

由於我們提供了完整的類路徑,所以不需要使用import語句。

 

如果包沒有放在當前工作路徑下, 我們在使用包時,需要通知Java。比如,我們將包放在/home/vamei/javapackage中,這樣Human.class位於/home /vamei/javapackage/com/vamei/society/Human.class,而我們的工作路徑為/home/vamei。這 樣,包就無法被找到。一個方法是在使用javac和java時,用-classpath說明包所在的檔案夾路徑,比如:

$javac -classpath /home/vamei/javapackage:. TestAgain.java

$java -classpath /home/vamei/javapackage:. TestAgain

就是從/home/vamei/javapackage和工作路徑(.)中尋找包。Java可以從/home/vamei/javapackage中可以找到Human類,從.中可以找到TestAgain類。

另外也可以設定系統的CLASSPATH環境變數,將上述路徑加入到該變數中,而不用每次都鍵入-classpath選項。

 

類似於包的機制在其他語言中也很常見,比如Python中的import機制。它們都是為了更好的組織和使用已有的程式。利用包,我們可以比較容易的拓展Java程式,使用已有的Java程式庫。注意到,包管理的是.class檔案。Java號稱"一次編譯,處處運行" (Compile Once, run anywhere)。.class檔案可以在任意裝有Java虛擬機器(JVM, Java Virtual Machine)的平台上運行,這協助我們克服了系統差異造成的程式移植困難。

系 統之間的差異可以非常大。如果我們用C語言編寫程式,需要將來源程式在各個平台上重新編譯,以適應不同的硬體條件。 Java虛擬機器銜接了平台和Java宇宙,它構成了硬體和編程邏輯的中介層。JVM隱藏了硬體差異,提供給程式員一個“標準”的Java宇宙。 而.class檔案可以看做這個 Java宇宙中流通的通貨。在JVM的基礎設施下,加上包的管理輔助,Java程式實現了良好的可移植性 (portability)。

 

總結

package, import

預設許可權: 包中可見

-classpath, CLASSPATH

Java基礎07 包

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.