Java 包

在 Java 中用于防止命名冲突、控制访问、进行搜索/定位和使用类、接口、枚举和注释等的组合变得更容易。

Java 包可以定义为一组相关类型(类、接口、枚举和注释)提供访问保护和命名空间管理。

Java 包的类型

Java 包有两种类型:

  • 内置 Java 包
  • 用户定义的 Java 包

Java 中现有的一些包是 

  • java.lang - 捆绑基本类

  • java.io − 输入、输出函数的类捆绑在此包中

用户定义的Java包

您可以定义自己的包来捆绑组类/接口等。将您实现的相关类分组是一个很好的做法,以便程序员可以轻松确定类、接口、枚举和注释是相关的。

由于包创建了一个新的命名空间不会与其他包中的名称发生任何名称冲突。使用包,可以更容易地提供访问控制,也更容易找到相关的类。

创建 Java 包

创建包时,您应该选择一个名称包,并在包含要包含在包中的类、接口、枚举和注释类型的每个源文件的顶部包含 package 语句以及该名称。

package 语句应该是源文件中的第一行。每个源文件中只能有一个package语句,并且它适用于文件中的所有类型。

如果不使用package语句,则将放置类、接口、枚举和注释类型

使用Java Package编译

要使用package语句编译Java程序,必须使用-d选项,如下所示。

javac -d Destination_folder file_name.java 

然后在指定的目的地创建一个具有给定包名称的文件夹,编译后的类文件将放置在该文件夹中。

Java 包示例

让我们看一下创建名为 animals 的包的示例。最好使用小写字母的包名称,以避免与类和接口名称发生冲突。

以下包示例包含名为 animals 的接口 -

/* 文件名 : Animal.java */
package animals;

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

现在,让我们在同一个包中实现上述接口 animals -

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();
   }
} 

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

输出

现在编译 java 文件,如图所示下面 -

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

现在,将在当前目录中创建一个名为 animals 的包/文件夹,这些类文件将放置在其中,如下所示。

Java 包

可以执行包内的类文件,得到如下结果。

Mammal eats
Mammal travels 

导入中Java包

如果一个类想要使用同一个包中的另一个类,则不需要使用包名。同一包中的类无需任何特殊语法即可相互查找。

示例

这里,名为 Boss 的类被添加到已包含 Employee 的工资包中。然后,Boss 可以在不使用 payroll 前缀的情况下引用 Employee 类,如以下 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 语句必须出现在 package 语句之后、类声明之前。

Java 包的目录结构

将类放入包中时会出现两个主要结果 -

  • 包的名称成为类名称的一部分,正如我们在上一节中讨论的那样。

  • 包的名称必须与相应字节码所在的目录结构相匹配。

这是在 Java 中管理文件的简单方法 -

将类、接口、枚举或注释类型的源代码放在一个文本文件中,该文件的名称是该类型的简单名称,扩展名为 .java

例如 -

// 文件名 : Car.java
package vehicle;

public class Car {
   // 类实现。
} 

现在,将源文件放在一个目录中,该目录的名称反映了类所属包的名称 -

....\vehicle\Car.java 

现在,限定类名路径名如下 -

  • 类名→vehicle.Car
  • 路径名→vehicle\Car.java(在windows中)

一般来说,公司使用其反向互联网域名作为其软件包名称。

示例 - 公司的互联网域名是 apple.com,那么它的所有包名称都将以 com.apple 开头。包名称的每个组成部分都对应一个子目录。

示例 - 该公司有一个 com.apple.computers 包,其中包含 Dell.java 源文件,它将包含在在一系列像这样的子目录中 -

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

在编译时,编译器为其中定义的每个类、接口和枚举创建不同的输出文件。输出文件的基本名称是类型的名称,其扩展名为 .class

例如 -

// 文件名: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) 可以找到您的程序使用的所有类型。

classes 目录的完整路径 <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;导出类路径