Java 菜鳥教程

Java 流程控制

Java 數(shù)組

Java 面向?qū)ο?I)

Java 面向?qū)ο?II)

Java 面向?qū)ο?III)

Java 異常處理

Java 列表(List)

Java Queue(隊(duì)列)

Java Map集合

Java Set集合

Java 輸入輸出(I/O)

Java Reader/Writer

Java 其他主題

Java 包(package)

為了更好地組織類,Java 提供了包機(jī)制,用于區(qū)別類名的命名空間。

包的作用

  • 1、把功能相似或相關(guān)的類或接口組織在同一個(gè)包中,方便類的查找和使用。

  • 2、如同文件夾一樣,包也采用了樹形目錄的存儲(chǔ)方式。同一個(gè)包中的類名字是不同的,不同的包中的類的名字是可以相同的,當(dāng)同時(shí)調(diào)用兩個(gè)不同包中相同類名的類時(shí),應(yīng)該加上包名加以區(qū)別。因此,包可以避免名字沖突。

  • 3、包也限定了訪問權(quán)限,擁有包訪問權(quán)限的類才能訪問某個(gè)包中的類。

Java 使用包(package)這種機(jī)制是為了防止命名沖突,訪問控制,提供搜索和定位類(class)、接口、枚舉(enumerations)和注釋(annotation)等。

包語句的語法格式為:

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

例如,一個(gè)Something.java 文件它的內(nèi)容

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

那么它的路徑應(yīng)該是 net/java/util/Something.java 這樣保存的。 package(包) 的作用是把不同的 java 程序分類保存,更方便的被其他 java 程序調(diào)用。

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

以下是一些 Java 中的包:

  • java.lang-打包基礎(chǔ)的類

  • java.io-包含輸入輸出功能的函數(shù)

開發(fā)者可以自己把一組類和接口等打包,并定義自己的包。而且在實(shí)際開發(fā)中這樣做是值得提倡的,當(dāng)你自己完成類的實(shí)現(xiàn)之后,將相關(guān)的類分組,可以讓其他的編程者更容易地確定哪些類、接口、枚舉和注釋等是相關(guān)的。

由于包創(chuàng)建了新的命名空間(namespace),所以不會(huì)跟其他包中的任何名字產(chǎn)生命名沖突。使用包這種機(jī)制,更容易實(shí)現(xiàn)訪問控制,并且讓定位相關(guān)類更加簡(jiǎn)單。

創(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)中。

實(shí)例

讓我們來看一個(gè)實(shí)例,這個(gè)實(shí)例創(chuàng)建了一個(gè)叫做animals的包。通常使用小寫的字母來命名避免與類、接口名字的沖突。

在 animals 包中加入一個(gè)接口(interface):

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

接下來,在同一個(gè)包中加入該接口的實(shí)現(xiàn):

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的子目錄中。 用下面的命令來運(yùn)行:

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

import 關(guān)鍵字

為了能夠使用某一個(gè)包的成員,我們需要在 Java 程序中明確導(dǎo)入該包。使用 "import" 語句可完成此功能。

在 java 源文件中 import 語句應(yīng)位于 package 語句之后,所有類的定義之前,可以沒有,也可以有多條,其語法格式為:

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

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

實(shí)例

下面的 payroll 包已經(jīng)包含了 Employee 類,接下來向 payroll 包中添加一個(gè) Boss 類。Boss 類引用 Employee 類的時(shí)候可以不用使用 payroll 前綴,Boss 類的示例如下。

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 聲明。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)域名是 (cainiaoplus.com),所有的包名都以 com.nhooo 開頭。包名中的每一個(gè)部分對(duì)應(yīng)一個(gè)子目錄。

例如:有一個(gè) com.nhooo.test 的包,這個(gè)包包含一個(gè)叫做 Nhooo.java 的源文件,那么相應(yīng)的,應(yīng)該有如下面的一連串子目錄:

....\com\nhooo\test\Nhooo.java

編譯的時(shí)候,編譯器為包中定義的每個(gè)類、接口等類型各創(chuàng)建一個(gè)不同的輸出文件,輸出文件的名字就是這個(gè)類型的名字,并加上 .class 作為擴(kuò)展后綴。 例如:

// 文件名: Nhooo.java
 
package com.nhooo.test;
public class Nhooo {
      
}
class Google {
      
}

現(xiàn)在,我們用-d選項(xiàng)來編譯這個(gè)文件,如下:

$javac -d . Nhooo.java

這樣會(huì)像下面這樣放置編譯了的文件:

.\com\nhooo\test\Nhooo.class
.\com\nhooo\test\Google.class

你可以像下面這樣來導(dǎo)入所有 \com\nhooo\test\ 中定義的類、接口等:

import com.nhooo.test.*;

編譯之后的 .class 文件應(yīng)該和 .java 源文件一樣,它們放置的目錄應(yīng)該跟包的名字對(duì)應(yīng)起來。但是,并不要求 .class 文件的路徑跟相應(yīng)的 .java 的路徑一樣。你可以分開來安排源碼和類的目錄。

<path-one>\sources\com\nhooo\test\Nhooo.java
<path-two>\classes\com\nhooo\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 名字是 com.nhooo.test,而編譯器和 JVM 會(huì)在  <path-two>\classes\com\nhooo\test 中找 .class 文件。

一個(gè) class path 可能會(huì)包含好幾個(gè)路徑,多路徑應(yīng)該用分隔符分開。默認(rèn)情況下,編譯器和 JVM 查找當(dāng)前目錄。JAR 文件按包含 Java 平臺(tái)相關(guān)的類,所以他們的目錄默認(rèn)放在了 class path 中。

設(shè)置 CLASSPATH 系統(tǒng)變量

用下面的命令顯示當(dāng)前的CLASSPATH變量:

  • Windows 平臺(tái)(DOS 命令行下):C:\> set CLASSPATH

  • UNIX 平臺(tái)(Bourne shell 下):# echo $CLASSPATH

刪除當(dāng)前CLASSPATH變量?jī)?nèi)容:

  • Windows 平臺(tái)(DOS 命令行下):C:\> set CLASSPATH=

  • UNIX 平臺(tái)(Bourne shell 下):# unset CLASSPATH; export CLASSPATH

設(shè)置CLASSPATH變量:

  • Windows 平臺(tái)(DOS 命令行下): C:\> set CLASSPATH=C:\users\jack\java\classes

  • UNIX 平臺(tái)(Bourne shell 下):# CLASSPATH=/home/jack/java/classes; export CLASSPATH

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清