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
广告