Java 包 ( package )
Java 使用包 ( package ) 這種機(jī)制是為了防止命名沖突,訪問控制梁呈,提供搜索和定位類 ( class)详瑞、接口宪祥、枚舉 ( enumerations ) 和注釋 ( annotation ) 等
語(yǔ)法
Java 中使用 package 關(guān)鍵字定義一個(gè)包
package pkg1[.pkg2[.pkg3…]];
例如,一個(gè) Something.java 文件它的內(nèi)容
package net.java.util
public class Something{
//...
}
那么它的路徑應(yīng)該是 net/java/util/Something.java 這樣保存的
包的作用
- 把功能相似或相關(guān)的類或接口組織在同一個(gè)包中,方便類的查找和使用
- 如同文件夾一樣瞭亮,包也采用了樹形目錄的存儲(chǔ)方式方仿。同一個(gè)包中的類名字是不同的,不同的包中的類的名字是可以相同的统翩,當(dāng)同時(shí)調(diào)用兩個(gè)不同包中相同類名的類時(shí)仙蚜,應(yīng)該加上包名加以區(qū)別。因此厂汗,包可以避免名字沖突
- 包也限定了訪問權(quán)限鳍征,擁有包訪問權(quán)限的類才能訪問某個(gè)包中的類
一個(gè)包 ( package ) 可以定義為一組相互聯(lián)系的類型(類、接口面徽、枚舉和注釋)艳丛,為這些類型提供訪問保護(hù)和命名空間管理的功能。
以下是一些 Java 中的包
- java.lang - 打包基礎(chǔ)的類
- java.io - 包含輸入輸出功能的函數(shù)
創(chuàng)建包
創(chuàng)建包的時(shí)候趟紊,你需要為這個(gè)包取一個(gè)合適的名字氮双。之后,如果其他的一個(gè)源文件包含了這個(gè)包提供的類霎匈、接口戴差、枚舉或者注釋類型的時(shí)候,都必須將這個(gè)包的聲明放在這個(gè)源文件的開頭
包聲明應(yīng)該在源文件的第一行铛嘱,每個(gè)源文件只能有一個(gè)包聲明暖释,這個(gè)文件中的每個(gè)類型都應(yīng)用于它
如果一個(gè)源文件中沒有使用包聲明,那么其中的類墨吓,函數(shù)球匕,枚舉,注釋等將被放在一個(gè)無名的包 ( unnamed package ) 中
范例
下面的代碼創(chuàng)建了一個(gè)包 animals帖烘。通常使用小寫的字母來命名避免與類亮曹、接口名字的沖突。
然后在 animals 包中加入一個(gè)接口 ( interface )
Animal.java
package animals;
interface Animal {
public void eat();
public void travel();
}
然后可以在同一個(gè)包中加入該接口的實(shí)現(xiàn)
MammalInt.java
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();
}
}
最后秘症,編譯這兩個(gè)文件照卦,并把他們放在一個(gè)叫做 animals 的子目錄中
Mammal eats
Mammal travel
import 關(guān)鍵字
為了能夠使用某一個(gè)包的成員,我們需要在 Java 程序中明確導(dǎo)入該包
使用 "import" 語(yǔ)句可完成此功能
在 java 源文件中 import 語(yǔ)句應(yīng)位于 package 語(yǔ)句之后乡摹,所有類的定義之前役耕,可以沒有,也可以有多條
語(yǔ)法
import 關(guān)鍵字的使用方法如下
import package1[.package2…].(classname|*);
如果在一個(gè)包中聪廉,一個(gè)類想要使用本包中的另一個(gè)類瞬痘,那么該包名可以省略
下面的范例中的 payroll 包已經(jīng)包含了 Employee 類氏义,接下來向 payroll 包中添加一個(gè) Boss 類
Boss 類引用 Employee 類的時(shí)候可以不用使用 payroll 前綴
Boss.java
package payroll;
public class Boss
{
public void payEmployee(Employee e)
{
e.mailCheck();
}
}
如果 Boss 類不在 payroll 包中又會(huì)怎樣?
Boss 類必須使用下面幾種方法之一來引用其它包中的類
- 使用類全名描述
payroll.Employee
- 用 import 關(guān)鍵字引入图云,使用通配符 "*"
import payroll.*;
- 使用 import 關(guān)鍵字引入 Employee 類
import payroll.Employee;
類文件中可以包含任意數(shù)量的 import 聲明
package 的目錄結(jié)構(gòu)
類放在包中會(huì)有兩種主要的結(jié)果
- 包名成為類名的一部分惯悠,正如我們前面討論的一樣
- 包名必須與相應(yīng)的字節(jié)碼所在的目錄結(jié)構(gòu)相吻合
有一種管理 java 中文件的簡(jiǎn)單方式
將類、接口等類型的源碼放在一個(gè)文本中竣况,這個(gè)文件的名字就是這個(gè)類型的名字克婶,并以 .java 作為擴(kuò)展名
Car.java
package vehicle;
public class Car {
// 類實(shí)現(xiàn)
}
然后把源文件放在一個(gè)目錄中,這個(gè)目錄要對(duì)應(yīng)類所在包的名字
....\vehicle\Car.java
現(xiàn)在丹泉,正確的類名和路徑將會(huì)是如下樣子
- 類名 -> vehicle.Car
- 路徑名 -> vehicle\Car.java (在 windows 系統(tǒng)中)
通常情萤,一個(gè)公司使用它互聯(lián)網(wǎng)域名的顛倒形式來作為它的包名
例如:互聯(lián)網(wǎng)域名是 twle.cn,所有的包名都以 cn.twle 開頭
包名中的每一個(gè)部分對(duì)應(yīng)一個(gè)子目錄
例如:有一個(gè) cn.twle.test 的包摹恨,這個(gè)包包含一個(gè)叫做 Twle.java 的源文件筋岛,那么相應(yīng)的,應(yīng)該有如下面的一連串子目錄
....\cn\twle\test\Twle.java
編譯的時(shí)候晒哄,編譯器為包中定義的每個(gè)類睁宰、接口等類型各創(chuàng)建一個(gè)不同的輸出文件,輸出文件的名字就是這個(gè)類型的名字寝凌,并加上 .class 作為擴(kuò)展后綴
Twle.java
package cn.twle.test;
public class Twle {
}
class Google {
}
現(xiàn)在柒傻,我們用 -d 選項(xiàng)來編譯這個(gè)文件
$javac -d . Twle.java
這樣會(huì)像下面這樣放置編譯了的文件
.\cn\twle\test\Twle.class
.\cn\twle\test\Google.class
然后就可以像下面這樣來導(dǎo)入所有 \cn\twle\test 中定義的類、接口等
import cn.twle.test.*;
編譯之后的 .class 文件應(yīng)該和 .java 源文件一樣较木,它們放置的目錄應(yīng)該跟包的名字對(duì)應(yīng)起來
但是红符,并不要求 .class 文件的路徑跟相應(yīng)的 .java 的路徑一樣》フ可以分開來安排源碼和類的目錄
<path-one>\sources\com\twle\test\Twle.java
<path-two>\classes\com\twle\test\Google.class
用這種方法管理源碼和類文件可以讓編譯器和 java 虛擬機(jī) ( JVM ) 可以找到你程序中使用的所有類型
類目錄的絕對(duì)路徑叫做 class path预侯,設(shè)置在系統(tǒng)變量 CLASSPATH 中
編譯器和 java 虛擬機(jī)通過將 package 名字加到 class path 后來構(gòu)造 .class 文件的路徑
<path-two>\classes
是 class path,package 名字是 cn.twle.test,而編譯器和 JVM 會(huì)在 <path-two>\classes\com\twle\test
中找 .class 文件
一個(gè) class path 可能會(huì)包含好幾個(gè)路徑峰锁,多路徑應(yīng)該用分隔符分開
默認(rèn)情況下萎馅,編譯器和 JVM 查找當(dāng)前目錄
JAR 文件按包含 Java 平臺(tái)相關(guān)的類,所以他們的目錄默認(rèn)放在了 class path 中