目录

Java - 包(Packages)

在Java中使用包以防止命名冲突,控制访问,使类,接口,枚举和注释的搜索/定位和使用更容易等。

可以将Package定义为提供访问保护和命名空间管理的相关类型(类,接口,枚举和注释)的分组。

Java中的一些现有软件包是 -

  • java.lang - 捆绑基础类

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

程序员可以定义自己的包来捆绑类/接口组等。最好对您实现的相关类进行分组,以便程序员可以轻松确定类,接口,枚举和注释是否相关。

由于包创建了一个新的命名空间,因此与其他包中的名称不会有任何名称冲突。 使用包,提供访问控制更容易,并且更容易找到相关的类。

创建包

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

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

如果未使用package语句,则类,接口,枚举和注释类型将放在当前的默认包中。

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

javac -d Destination_folder file_name.java

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

例子 (Example)

让我们看一个创建一个名为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();
   }
} 

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

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

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

包

您可以在包中执行类文件,并获得如下所示的结果。

Mammal eats
Mammal travels

导入关键字

如果某个类想要在同一个包中使用另一个类,则不需要使用包名。 同一个包中的类找不到任何特殊语法。

例子 (Example)

这里,名为Boss的类被添加到已包含Employee的工资包中。 然后,Boss可以在不使用payroll前缀的情况下引用Employee类,如下面的Boss类所示。

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

如果Employee类不在工资包中,会发生什么? 然后,Boss类必须使用以下技术之一来引用不同包中的类。

  • 可以使用该类的完全限定名称。 例如 -
payroll.Employee
  • 可以使用import关键字和通配符(*)导入包。 例如 -

import payroll.*;
  • 可以使用import关键字导入类本身。 例如 -
import payroll.Employee;

Note - 类文件可以包含任意数量的import语句。 import语句必须出现在package语句之后和类声明之前。

包的目录结构

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

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

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

以下是使用Java管理文件的简单方法 -

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

例如 -

// File Name :  Car.java
package vehicle;
public class Car {
   // Class implementation.   
}

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

....\vehicle\Car.java

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

  • Class name → vehicle.Car
  • 路径名称→vehicle\Car.java(在windows中)

通常,公司使用其反向的Internet域名作为其包名。

Example - 公司的Internet域名是apple.com,然后其所有包名都将以com.apple开头。 包名称的每个组件对应一个子目录。

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

....\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

通过这样做,可以在不泄露源的情况下向其他程序员提供对classes目录的访问。 您还需要以这种方式管理源文件和类文件,以便编译器和Java虚拟机(JVM)可以找到程序使用的所有类型。

classes目录的完整路径\classes,称为类路径,并使用CLASSPATH系统变量进行设置。 编译器和JVM都通过将包名称添加到类路径来构造.class文件的路径。

假设\classes是类路径,包名是com.apple.computers,然后编译器和JVM将在\classes\com\apple\computers中查找.class文件。

类路径可以包括多个路径。 应使用分号(Windows)或冒号(Unix)分隔多个路径。 默认情况下,编译器和JVM搜索当前目录和包含Java平台类的JAR文件,以便这些目录自动位于类路径中。

设置CLASSPATH系统变量

要显示当前的CLASSPATH变量,请在Windows和UNIX(Bourne shell)中使用以下命令 -

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

要删除CLASSPATH变量的当前内容,请使用 -

  • 在Windows→C:\>中设置CLASSPATH =
  • 在UNIX→%unset CLASSPATH; 导出CLASSPATH

设置CLASSPATH变量 -

  • 在Windows中→设置CLASSPATH = C:\users\jack\java\classes
  • 在UNIX→%CLASSPATH =/home/jack/java/classes; 导出CLASSPATH
↑回到顶部↑
WIKI教程 @2018