Java 包

Java 包

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

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

Java中存在一些现有的包,其中包括:

  • java.lang - 包含基本类

  • java.io - 包含输入输出函数的类

程序员可以定义自己的包来组织类、接口等。将你实现的相关类组织在一起是一个好习惯,这样程序员可以很容易地确定这些类、接口、枚举和注解之间的关系。

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

创建一个包

在创建包时,你应该选择一个包名,并在包含了想要放入该包中的类、接口、枚举和注解类型的每个源文件的顶部包含一个包语句。

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

如果不使用包语句,那么类、接口、枚举和注解类型将会放在当前默认包中。

要使用包语句编译Java程序,你需要使用以下-d选项。

javac -d Destination_folder file_name.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();
   }
}

现在按照下面的示例编译java文件 –

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

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

Java 包

您可以执行该包内的类文件,并获取如下所示的结果。

Mammal eats
Mammal travels

导入关键字

如果一个类想要在同一个包中使用另一个类,就不需要使用包名。同一个包中的类可以直接找到彼此,不需要任何特殊的语法。

示例

在这个示例中,一个名为Boss的类被添加到已经包含Employee的payroll包中。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;

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

包的目录结构

当一个类放置在一个包中时,会有两个主要的结果:

  • 包的名称成为类名的一部分,就像我们在前一节讨论的一样。

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

以下是在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

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

classes目录的完整路径,即<path-two>\classes,被称为类路径(class path),并通过设置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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程