天天看點

Java入門 - 面向對象 - 07.包(package)包(package)

原文位址: http://www.work100.net/training/java-package.html 更多教程: 光束雲 - 免費課程

包(package)

請參照如上

章節導航

進行閱讀

1.概述

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

2.包的作用

  • 把功能相似或相關的類或接口組織在同一個包中,友善類的查找和使用。
  • 如同檔案夾一樣,包也采用了樹形目錄的存儲方式。同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以差別。是以,包可以避免名字沖突。
  • 包也限定了通路權限,擁有包通路權限的類才能通路某個包中的類。

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 中的包:

  • java.lang

    :打包基礎的類
  • java.io

    :包含輸入輸出功能的函數

開發者可以自己把一組類和接口等打包,并定義自己的包。而且在實際開發中這樣做是值得提倡的,當你自己完成類的實作之後,将相關的類分組,可以讓其他的程式設計者更容易地确定哪些類、接口、枚舉和注釋等是相關的。

由于包建立了新的命名空間(

namespace

),是以不會跟其他包中的任何名字産生命名沖突。使用包這種機制,更容易實作通路控制,并且讓定位相關類更加簡單。

3.建立包

建立包的時候,你需要為這個包取一個合适的名字。之後,如果其他的一個源檔案包含了這個包提供的類、接口、枚舉或者注釋類型的時候,都必須将這個包的聲明放在這個源檔案的開頭。

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

如果一個源檔案中沒有使用包聲明,那麼其中的類,函數,枚舉,注釋等将被放在一個無名的包(

unnamed package

)中。

例子

讓我們來看一個例子,這個例子建立了一個叫做

animals

的包。通常使用小寫的字母來命名避免與類、接口名字的沖突。

animals

包中加入一個接口(

interface

):

/* 檔案名: Animal.java */
package animals;
 
interface Animal {
   public void eat();
   public void travel();
}           

接下來,在同一個包中加入該接口的實作:

package animals;
 
/* 檔案名 : MammalInt.java */
public class MammalInt implements Animal{
 
   public void eat(){
      System.out.println("Mammal eats");
   }
 
   public void travel(){
      System.out.println("Mammal travels");
   } 
 
   public int noOfLegs(){
      return 0;
   }
 
   public static void main(String[] args){
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}           

然後,編譯這兩個檔案,并把他們放在一個叫做

animals

的子目錄中。 用下面的指令來運作:

$ mkdir animals
$ cp Animal.class  MammalInt.class animals
$ java animals/MammalInt
Mammal eats
Mammal travel           

4.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

類必須使用下面幾種方法之一來引用其他包中的類。

使用類全名描述,例如:

payroll.Employee           

import

關鍵字引入,使用通配符 "

*

"

import payroll.*;           

使用

import

關鍵字引入

Employee

類:

import payroll.Employee;           
注意:

類檔案中可以包含任意數量的

import

聲明。

import

聲明必須在包聲明之後,類聲明之前。

5.package的目錄結構

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

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

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

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

将類、接口等類型的源碼放在一個文本中,這個檔案的名字就是這個類型的名字,并以

.java

作為擴充名。例如:

// 檔案名 :  Car.java
package vehicle;
 
public class Car {
   // 類實作  
}           

接下來,把源檔案放在一個目錄中,這個目錄要對應類所在包的名字。

....\vehicle\Car.java           

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

  • 類名 ->

    vehicle.Car

  • 路徑名 ->

    vehicle\Car.java

    (在

    windows

    系統中)

通常,一個公司使用它網際網路域名的颠倒形式來作為它的包名.例如:網際網路域名是

work100.net

,所有的包名都以

net.work100

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

例如:有一個

net.work100.test

的包,這個包包含一個叫做

Work100.java

的源檔案,那麼相應的,應該有如下面的一連串子目錄:

....\net.work100\test\Work100.java           

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

.class

作為擴充字尾。 例如:

// 檔案名: Work100.java
package net.work100.test;
public class Work100 {
      
}
class Google {
      
}           

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

$javac -d . Work100.java           

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

.\net\work100\test\Work100.class
.\net\work100\test\Google.class           

你可以像下面這樣來導入所有

\net\work100\test\

中定義的類、接口等:

import net.work100.test.*;           

編譯之後的

.class

檔案應該和

.java

源檔案一樣,它們放置的目錄應該跟包的名字對應起來。但是,并不要求

.class

檔案的路徑跟相應的

.java

的路徑一樣。你可以分開來安排源碼和類的目錄。

<path-one>\sources\net\work100\test\Work100.java
<path-two>\classes\net\work100\test\Google.class           

這樣,你可以将你的類目錄分享給其他的程式設計人員,而不用透露自己的源碼。用這種方法管理源碼和類檔案可以讓編譯器和java 虛拟機(JVM)可以找到你程式中使用的所有類型。

類目錄的絕對路徑叫做

class path

。設定在系統變量

CLASSPATH

中。編譯器和 Java 虛拟機通過将

package

名字加到

class path

後來構造

.class

檔案的路徑。

<path-two>\classes

class path

package

名字是

net.work100.test

,而編譯器和 JVM 會在

<path-two>\classes\net\work100\test

中找 .class 檔案。

一個

class path

可能會包含好幾個路徑,多路徑應該用分隔符分開。預設情況下,編譯器和 JVM 查找目前目錄。JAR 檔案按包含 Java 平台相關的類,是以他們的目錄預設放在了

class path

中。

6.設定CLASSPATH系統變量

用下面的指令顯示目前的CLASSPATH變量:

  • Windows 平台(DOS 指令行下):

    C:\> set CLASSPATH

  • UNIX 平台(Bourne shell 下):

    # echo $CLASSPATH

删除目前CLASSPATH變量内容:

  • C:\> set CLASSPATH=

  • # unset CLASSPATH; export CLASSPATH

設定CLASSPATH變量:

  • C:\> set CLASSPATH=C:\users\jack\java\classes

  • # CLASSPATH=/home/jack/java/classes; export CLASSPATH

上一篇:

接口
如果對課程内容感興趣,可以掃碼關注我們的

公衆号

QQ群

,及時關注我們的課程更新
Java入門 - 面向對象 - 07.包(package)包(package)
Java入門 - 面向對象 - 07.包(package)包(package)