Java 包 ( package )

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 這樣保存的

包的作用

  1. 把功能相似或相關(guān)的類或接口組織在同一個(gè)包中,方便類的查找和使用
  2. 如同文件夾一樣瞭亮,包也采用了樹形目錄的存儲(chǔ)方式方仿。同一個(gè)包中的類名字是不同的,不同的包中的類的名字是可以相同的统翩,當(dāng)同時(shí)調(diào)用兩個(gè)不同包中相同類名的類時(shí)仙蚜,應(yīng)該加上包名加以區(qū)別。因此厂汗,包可以避免名字沖突
  3. 包也限定了訪問權(quán)限鳍征,擁有包訪問權(quán)限的類才能訪問某個(gè)包中的類

一個(gè)包 ( package ) 可以定義為一組相互聯(lián)系的類型(類、接口面徽、枚舉和注釋)艳丛,為這些類型提供訪問保護(hù)和命名空間管理的功能。

以下是一些 Java 中的包

  1. java.lang - 打包基礎(chǔ)的類
  2. 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 類必須使用下面幾種方法之一來引用其它包中的類

  1. 使用類全名描述

payroll.Employee

  1. import 關(guān)鍵字引入图云,使用通配符 "*"

import payroll.*;

  1. 使用 import 關(guān)鍵字引入 Employee 類

import payroll.Employee;

類文件中可以包含任意數(shù)量的 import 聲明

package 的目錄結(jié)構(gòu)

類放在包中會(huì)有兩種主要的結(jié)果

  1. 包名成為類名的一部分惯悠,正如我們前面討論的一樣
  2. 包名必須與相應(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 中

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末祖今,一起剝皮案震驚了整個(gè)濱河市校坑,隨后出現(xiàn)的幾起案子拣技,更是在濱河造成了極大的恐慌千诬,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膏斤,死亡現(xiàn)場(chǎng)離奇詭異徐绑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)莫辨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門傲茄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毅访,“玉大人,你說我怎么就攤上這事盘榨∮鞔猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵草巡,是天一觀的道長(zhǎng)守呜。 經(jīng)常有香客問我,道長(zhǎng)山憨,這世上最難降的妖魔是什么查乒? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮郁竟,結(jié)果婚禮上玛迄,老公的妹妹穿的比我還像新娘。我一直安慰自己棚亩,他們只是感情好蓖议,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讥蟆,像睡著了一般拒担。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攻询,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天从撼,我揣著相機(jī)與錄音,去河邊找鬼钧栖。 笑死低零,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拯杠。 我是一名探鬼主播掏婶,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼潭陪!你這毒婦竟也來了雄妥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤依溯,失蹤者是張志新(化名)和其女友劉穎老厌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黎炉,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枝秤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慷嗜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淀弹。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丹壕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薇溃,到底是詐尸還是另有隱情菌赖,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布沐序,位于F島的核電站盏袄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏薄啥。R本人自食惡果不足惜辕羽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垄惧。 院中可真熱鬧刁愿,春花似錦、人聲如沸到逊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)觉壶。三九已至脑题,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铜靶,已是汗流浹背叔遂。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留争剿,地道東北人已艰。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蚕苇,于是被迫代替她去往敵國(guó)和親哩掺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 為了更好地組織類涩笤,Java 提供了包機(jī)制嚼吞,用于區(qū)別類名的命名空間。 包的作用 把功能相似或相關(guān)的類或接口組織在同一...
    南風(fēng)_001閱讀 226評(píng)論 0 0
  • Java包(package) 為了更好地組織類蹬碧,Java提供了包機(jī)制舱禽,用于區(qū)別類名的命名空間。 包的作用 把功能相...
    狐仙大人_閱讀 564評(píng)論 0 1
  • 包聲明應(yīng)該在源文件的第一行锰茉,每個(gè)源文件只能有一個(gè)包聲明 package net.java.util;public ...
    啊玄吶閱讀 169評(píng)論 0 0
  • 在編寫 Java 程序時(shí)呢蔫,隨著程序架構(gòu)越來越大,類的個(gè)數(shù)也越來越多飒筑,這時(shí)就會(huì)發(fā)現(xiàn)管理程序中維護(hù)類名稱也是一件很麻煩...
    Zz魚丸閱讀 362評(píng)論 0 0
  • 什么是nginx 1.安裝nginx 通過以上方式安裝nginx片吊,我的nginx路徑在/usr/local/etc...
    TensorFlow開發(fā)者閱讀 3,422評(píng)論 0 3