JavaSE入門學習17:Java物件導向之package(包)

來源:互聯網
上載者:User

JavaSE入門學習17:Java物件導向之package(包)
一Java包(package)

為了更好地組織類,Java提供了包機制,用於區別類名的命名空間。

包的作用:

A把功能相似或相關的類或介面組織在同一個包中,方便類的尋找和使用。

B如同檔案夾一樣,包也採用了樹形目錄的儲存方式。同一個包中的類名字是不同的,不同的包中的類的名字是

可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以區別。因此,包可以避免名字衝突。

C包也限定了存取權限,擁有包存取權限的類才能訪問某個包中的類。

Java使用包(package)這種機制是為了防止命名衝突,存取控制,提供搜尋和定位類(class)、介面、枚舉

(enumerations)和注釋(annotation)等。

包語句的文法格式為:

package pkg1[.pkg2[.pkg3…]];

例如,一個Something.java 檔案它的內容:

 

package net.java.util;public class Something{     //...}

 

那麼它的路徑應該是 net/java/util/Something.java 這樣儲存的。 package(包)的作用是把不同的java程式分類保

存,更方便的被其他java程式調用。

一個包(package)可以定義為一組相互聯絡的類型(類、介面、枚舉和注釋),為這些類型提供訪問保護和命名空間

管理的功能。

以下是一些Java中的包:

1)java.lang包:java的核心類庫,包含了運行java程式必不可少的系統類別,如基礎資料型別 (Elementary Data Type)、基本數學函數、字串處理、線程、異常處理類等,系統預設載入這個包。2)java.io包:java語言的標準輸入/輸出類庫,如基本輸入/輸出流、檔案輸入/輸出、過濾輸入/輸出流等等。3)java.util包:包含如處理時間的date類,處理變成數組的Vector類,以及stack和HashTable類。4)java.awt包:構建圖形化使用者介面(GUI)的類庫,低級繪圖操作Graphics類,圖形介面組件和布局管理如Checkbox類、Container類、LayoutManger介面等,以及介面使用者互動控制和事件響應,如Event類。5)java.awt.image包:處理和操縱來自於網上的圖片的java工具類庫。6)java.wat.peer包:很少在程式中直接用到,使得同一個java程式在不同的軟硬體平台上運行。7)java.applet包。8)java.net包:實現網路功能的類庫有Socket類、ServerSocket類。9)java.corba包和java.corba.orb包。10)java.lang.reflect包:提供用於反射對象的工具。11)java.util.zip包:實現檔案壓縮功能。12)java.awt.datatransfer包:處理資料轉送的工具類,包括剪貼簿,字串發送器等。13)java.awt.event包。14)java.sql包:實現JDBC的類庫。15)java.rmi 提供遠端連線與載入的支援。16)java.security 提供安全性方面的有關支援。

開發人員可以自己把一組類和介面等打包,並定義自己的package。而且在實際開發中這樣做是值得提倡的,當你

自己完成類的實現之後,將相關的類分組,可以讓其他的編程者更容易地確定哪些類、介面、枚舉和注釋等是相關

的。

由於package建立了新的命名空間(namespace),所以不會跟其他package中的任何名字產生命名衝突。使用包這

種機制,更容易實現存取控制,並且讓定位相關類更加簡單。

二建立包

建立package的時候,你需要為這個package取一個合適的名字。之後,如果其他的一個源檔案包含了這個包提

供的類、介面、枚舉或者注釋類型的時候,都必須將這個package的聲明放在這個源檔案的開頭。

包聲明應該在源檔案的第一行,每個源檔案只能有一個包聲明,這個檔案中的每個類型都應用於它。如果一個源

檔案中沒有使用包聲明,那麼其中的類,函數,枚舉,注釋等將被放在一個無名的包(unnamed package)中。

執行個體:

讓我們來看一個例子,這個例子建立了一個叫做animals的包。通常使用小寫字母來命名避免與類、介面名字的

衝突。

在animals包中加入一個介面(interface):
/* 檔案名稱: Animal.java */package animals;interface Animal {   public void eat();   public void travel();}
接下來,在同一個包中加入該介面的實現:
/* 檔案名稱 : Mammal.java */package animals;public class Mammal implements Animal{   public void eat(){      System.out.println("Mammal eats");   }   public void travel(){      System.out.println("Mammal travels");   }    public int noOfLegs(){      return 0;   }}

然後,編譯這兩個檔案:

編譯後的目錄:

animals包中的位元組碼檔案(class檔案):

三import關鍵字

為了能夠使用某一個包的成員,我們需要在Java程式中明確匯入該包。使用"import"語句可完成此功能。

在java源檔案中import語句應位於package語句之後,所有類的定義之前,可以沒有,也可以有多條,其文法格式

為:import package1[.package2…].(classname|*);

如果在一個包中,一個類想要使用本包中的另一個類,那麼該包名可以省略。

執行個體:

下面的payroll包已經包含了Employee類,接下來向payroll包中添加一個Boss類。Boss類引用Employee類的時候

可以不用使用payroll首碼,Boss類的執行個體如下:

package payroll;public class Boss{   public void payEmployee(Employee e){      e.mailCheck();   }}

如果Boss類不在payroll包中又會怎樣?Boss類必須使用下面幾種方法之一來引用其他包中的類:

1)使用類全名描述,例如:

payroll.Employee

2)使用用import關鍵字引入,使用萬用字元(*)

import payroll.*;

3)使用import關鍵字引入Employee類

import payroll.Employee;

注意:

類檔案中可以包含任意數量的import聲明。import聲明必須在包聲明之後,類聲明之前。

我們繼續接著來看建立包過程中的那個執行個體:

我們再在源檔案的目錄下建立一個Test.java源檔案:

import animals.*;public class Test{   public static void main(String[] args){      Mammal m=new Mammal();      m.eat();      m.travel();   }}
編譯這個類出現如下問題:

這就需要我們把建立animals包的兩個源檔案刪除或者重新移到別的檔案夾下,我把它放在了source檔案夾下:

再次編譯Test.java源檔案和運行位元組碼檔案:

四package的目錄結構

類放在包中會有兩種主要的結果:

A包名成為類名的一部分,正如我們前面討論的一樣。

B包名必須與相應的位元組碼所在的目錄結構相吻合。

下面是管理你自己java中檔案的一種簡單方式:

將類、介面等類型的源碼放在一個文本中,這個檔案的名字就是這個類型的名字,並以.java作為副檔名。例如:

//檔案名稱 :  Car.javapackage vehicle;public class Car {   //類實現  }

接下來,把源檔案放在一個目錄中,這個目錄要對應類所在包的名字:....\vehicle\Car.java

現在,正確的類名和路徑將會是如下樣子:

類名 -> vehicle.Car

路徑名 -> vehicle\Car.java (in windows)

通常,一個公司使用它互連網網域名稱的顛倒形式來作為它的包名.例如:互連網網域名稱是apple.com,所有的包名都以

com.apple開頭。包名中的每一個部分對應一個子目錄。

例如:這個公司有一個com.apple.computers的包,這個包包含一個叫做Dell.java的源檔案,那麼相應的,應該有

如下面的一連串子目錄:....\com\apple\computers\Dell.java

編譯的時候,編譯器為包中定義的每個類、介面等類型各建立一個不同的輸出檔案,輸出檔案的名字就是這個類

型的名字,並加上.class作為擴充尾碼。 例如:

// 檔案名稱: Dell.javapackage com.apple.computers;public class Dell{      //}class Ups{      //}

現在,我們用-d選項來編譯這個檔案,如下:

javac -d . Dell.java

這樣會像下面這樣放置編譯了的檔案:

.\com\apple\computers\Dell.class

.\com\apple\computers\Ups.class

你可以像下面這樣來匯入所有 \com\apple\computers\中定義的類、介面等:

import com.apple.computers.*;

編譯之後的.class檔案應該和.java源檔案一樣,它們放置的目錄應該跟包的名字對應起來。但是,並不要求.class

檔案的路徑跟相應的.java的路徑一樣。你可以分開來安排源碼和類的目錄。

\sources\com\apple\computers\Dell.java

\classes\com\apple\computers\Dell.class

這樣,你可以將你的類目錄分享給其他的編程人員,而不用透露自己的源碼。用這種方法管理源碼和類檔案可以

讓編譯器和java虛擬機器(JVM)可以找到你程式中使用的所有類型。

類目錄的絕對路徑叫做class path。設定在系統變數CLASSPATH中。編譯器和java虛擬機器通過將package名字加

到class path後來構造.class檔案的路徑。

\classes是class path,package名字是com.apple.computers,而編譯器和JVM會在

two>\classes\com\apple\compters中找.class檔案。

一個class path可能會包含好幾個路徑。多重路徑應該用分隔字元分開。預設情況下,編譯器和JVM尋找目前的目錄。

JAR檔案按包含Java平台相關的類,所以他們的目錄預設放在了class path中。

五設定CLASSPATH系統變數

1)用下面的命令顯示當前的CLASSPATH變數:

Windows平台(DOS 命令列下)-> C:\> set CLASSPATH

UNIX平台(Bourne shell下)-> % echo $CLASSPATH

2)刪除當前CLASSPATH變數內容:

Windows平台(DOS 命令列下)-> C:\> set CLASSPATH=

UNIX平台(Bourne shell下)-> % unset CLASSPATH; export CLASSPATH

3)設定CLASSPATH變數:

Windows平台(DOS 命令列下)-> set CLASSPATH=C:\users\jack\java\classes

UNIX平台(Bourne shell下)-> % CLASSPATH=/home/jack/java/classes; exportCLASSPATH

關於包的理解目前就這些了,有些地方還是不太理解,需要在以後的實踐中逐步加深對Java包的理解。錯誤的地

方請指出。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.