📜  Java-套件

📅  最后修改于: 2020-11-15 04:29:44             🧑  作者: Mango


在Java中使用包是为了防止命名冲突,控制访问,简化类的查找/定位和使用,接口,枚举和注释等。

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

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

  • java.lang-捆绑基本类

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

程序员可以定义自己的软件包以捆绑类/接口等组。将您实现的相关类分组是一种好习惯,以便程序员可以轻松地确定类,接口,枚举和注释是否相关。

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

创建一个包

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

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

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

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

javac -d Destination_folder file_name.java

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

让我们看一个示例,该示例创建了一个称为动物的包装。最好使用小写字母的软件包名称,以避免与类和接口的名称冲突。

以下软件包示例包含名为动物的接口-

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

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

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

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

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

配套

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

Mammal eats
Mammal travels

导入关键字

如果一个类想在同一包中使用另一个类,则无需使用包名。同一包中的类彼此查找而无需任何特殊语法。

在这里,名为Boss的类将添加到已经包含Employee的工资包中。然后,老板可以不使用工资单前缀来引用Employee类,如下面的老板类所示。

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语句之后和类声明之前。

软件包的目录结构

将类放入包中时会发生两个主要结果-

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

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

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

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

例如-

// File Name :  Car.java
package vehicle;

public class Car {
   // Class implementation.   
}

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

....\vehicle\Car.java

现在,合格的类名和路径名将如下所示:

  • 类别名称→车辆
  • 路径名→vehicle \ Car.java(在Windows中)

通常,公司将其反向Internet域名用作其程序包名称。

示例-公司的Internet域名是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源文件的路径相同。您可以分别安排源目录和类目录,如下所示:

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

\classes\com\apple\computers\Dell.class

通过这样做,可以在不透露您的源代码的情况下将访问class目录的权限授予其他程序员。您还需要以这种方式管理源文件和类文件,以便编译器和Java虚拟机(JVM)可以找到程序使用的所有类型。

类目录的完整路径 \ 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