Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 其他

Java APIs 和框架

Java 類引用

Java 有用資源

Java - 包



Java 包

用於在 Java 中防止命名衝突,控制訪問,使查詢/定位和使用類、介面、列舉和註釋更容易等。

Java 包可以定義為相關型別(介面列舉和註解)的組合,提供訪問保護和名稱空間管理。

Java 包的型別

Java 包分為兩種型別

  • 內建 Java 包
  • 使用者定義的 Java 包

Java 中的一些現有包包括:

  • java.lang - 包含基本類

  • java.io - 此包包含輸入、輸出函式的類

使用者定義的 Java 包

您可以定義自己的包來捆綁類/介面組等。一個好的實踐是將您實現的相關類分組,以便程式設計師可以輕鬆確定這些類、介面、列舉和註釋是相關的。

由於包建立了一個新的名稱空間,因此不會與其他包中的名稱發生任何名稱衝突。使用包,更容易提供訪問控制,也更容易找到相關的類。

建立 Java 包

建立包時,應為包選擇一個名稱,並在包含要包含在包中的類、介面、列舉和註釋型別的每個原始檔的頂部包含一個帶有該名稱的package語句。

package 語句應為原始檔中的第一行。每個原始檔只能有一個 package 語句,它適用於檔案中的所有型別。

如果不使用 package 語句,則類、介面、列舉和註釋型別將放在當前預設包中。

使用 Java 包進行編譯

要編譯帶有 package 語句的 Java 程式,您必須使用 -d 選項,如下所示。

javac -d Destination_folder file_name.java

然後在指定的目的地建立一個具有給定包名稱的資料夾,並將編譯後的類檔案放入該資料夾中。

Java 包示例

讓我們來看一個建立名為animals包的示例。最好使用小寫字母的包名,以避免與類和介面的名稱發生任何衝突。

以下包示例包含名為animals的介面:

/* File name : Animal.java */
package animals;

interface Animal {
   public void eat();
   public void travel();
}

現在,讓我們在同一個包animals中實現上述介面:

package animals;
/* File name : 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();
   }
} 

interface Animal {
   public void eat();
   public void travel();
}

輸出

現在,按如下所示編譯 java 檔案:

$ javac -d . Animal.java 
$ javac -d . MammalInt.java

現在,當前目錄中將建立一個名為animals的包/資料夾,並將這些類檔案放入其中,如下所示。

Packages

您可以執行包中的類檔案並獲得如下所示的結果。

Mammal eats
Mammal travels

匯入 Java 包

如果一個類想要使用同一個包中的另一個類,則不需要使用包名。同一個包中的類無需任何特殊語法就能找到彼此。

示例

這裡,名為 Boss 的類被新增到 payroll 包中,該包已包含 Employee。然後,Boss 可以引用 Employee 類而無需使用 payroll 字首,如下面的 Boss 類所示。

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

如果 Employee 類不在 payroll 包中會發生什麼?然後,Boss 類必須使用以下技術之一來引用不同包中的類。

  • 可以使用類的完全限定名。例如:
payroll.Employee
  • 可以使用 import 關鍵字和萬用字元 (*) 匯入包。例如:

import payroll.*;
  • 可以使用 import 關鍵字匯入類本身。例如:
import payroll.Employee;

示例

package payroll;

public class Employee {
   public void mailCheck() {
      System.out.println("Pay received.");    
   }
}

示例

package payroll;

import payroll.Employee;

public class Boss {
   public void payEmployee(Employee e) {
      e.mailCheck();
   }
   
   public static void main(String[] args) {
      Boss boss = new Boss();
	   Employee e = new Employee();
      boss.payEmployee(e);
   }
}

輸出

Pay received.

注意 - 類檔案可以包含任意數量的 import 語句。import 語句必須出現在 package 語句之後以及類宣告之前。

Java 包的目錄結構

將類放入包中時,會產生兩個主要結果:

  • 正如上一節所討論的,包名成為類名的一部分。

  • 包名必須與相應的位元組碼所在的目錄結構匹配。

以下是在Java中管理檔案的簡單方法:

將類、介面、列舉或註解型別的原始碼放在一個文字檔案中,其檔名是型別的簡單名稱,副檔名為.java

例如:

// File Name :  Car.java
package vehicle;

public class Car {
   // Class implementation.   
}

現在,將原始檔放在一個目錄中,該目錄的名稱反映了類所屬的包的名稱:

....\vehicle\Car.java

現在,限定類名和路徑名如下:

  • 類名 → vehicle.Car
  • 路徑名 → vehicle\Car.java (Windows系統)

通常,公司使用其反轉的網際網路域名作為其包名。

示例:如果一個公司的網際網路域名是 apple.com,那麼它的所有包名都將以 com.apple 開頭。包名的每個元件對應一個子目錄。

示例:如果該公司有一個 com.apple.computers 包,其中包含一個 Dell.java 原始檔,它將包含在一系列這樣的子目錄中:

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

在編譯時,編譯器為其中定義的每個類、介面和列舉建立一個不同的輸出檔案。輸出檔案的基本名稱是型別的名稱,其副檔名為.class

例如:

// File Name: Dell.java
package 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.*;

與 .java 原始檔一樣,編譯後的 .class 檔案也應該位於反映包名的一系列目錄中。但是,.class 檔案的路徑不必與 .java 原始檔的路徑相同。您可以分別安排源目錄和類目錄,如下所示:

<path-one>\sources\com\apple\computers\Dell.java

<path-two>\classes\com\apple\computers\Dell.class

透過這樣做,可以向其他程式設計師提供對類目錄的訪問許可權,而無需公開您的原始碼。您還需要以這種方式管理原始檔和類檔案,以便編譯器和 Java 虛擬機器 (JVM) 可以找到程式使用的所有型別。

類目錄的完整路徑,<path-two>\classes,稱為類路徑,並使用 CLASSPATH 系統變數設定。編譯器和 JVM 都透過將包名新增到類路徑來構造 .class 檔案的路徑。

假設 <path-two>\classes 是類路徑,包名是 com.apple.computers,則編譯器和 JVM 將在 <path-two>\classes\com\apple\computers 中查詢 .class 檔案。

類路徑可以包含多個路徑。多個路徑應以分號 (Windows) 或冒號 (Unix) 分隔。預設情況下,編譯器和 JVM 搜尋當前目錄和包含 Java 平臺類的 JAR 檔案,以便這些目錄自動位於類路徑中。

設定 CLASSPATH 系統變數

要顯示當前的 CLASSPATH 變數,請在 Windows 和 UNIX (Bourne shell) 中使用以下命令:

  • 在 Windows 中 → C:\> set CLASSPATH
  • 在 UNIX 中 → % echo $CLASSPATH

要刪除 CLASSPATH 變數的當前內容,請使用:

  • 在 Windows 中 → C:\> set CLASSPATH =
  • 在 UNIX 中 → % unset CLASSPATH; export CLASSPATH

要設定 CLASSPATH 變數:

  • 在 Windows 中 → set CLASSPATH = C:\users\jack\java\classes
  • 在 UNIX 中 → % CLASSPATH = /home/jack/java/classes; export CLASSPATH
廣告