Java 中,包(Package) 是一种组织类和接口的方式,它通过将类和接口按功能或者逻辑进行分类,帮助开发者管理类文件,避免类名冲突,提高代码的可维护性和可扩展性。Java 中的包是面向对象设计的重要组成部分,帮助开发者更高效地管理和维护代码,尤其在大型项目中尤为重要。本文主要介绍Java 包(package)

1、Java 包(package)

包帮助将相关的类和接口组织在一起,类似于文件夹结构,便于管理。如果两个类有相同的名字,将它们放在不同的包中可以避免命名冲突。包可以控制类、接口和成员的访问权限,提供更细粒度的安全管理。

1)内建包

Java 提供了许多内建的标准包,如 java.utiljava.iojava.lang 等。

2)自定义包

开发者可以自定义包来组织自己编写的类和接口。

2、内置包

Java API是Java开发环境中包含的,可免费使用的预编写类的库。

该库包含用于管理输入,数据库编程等的组件。完整列表可以在Oracle网站上找到:https://docs.oracle.com/javase/8/docs/api/

该库分为包和类。可以导入单个类(以及其方法和属性),也可以导入包含所有属于指定包的类的整个包。

要使用库中的类或包,需要使用import关键字导入:

语法

import package.name.Class;   // 导入单个类
import package.name.*;   // 导入整个包

3、使用import导入类

如果要导入使用的类,例如,Scanner类用于获取用户输入,导入使用以下代码:

例如:

import java.util.Scanner;

在上面的示例中,java.util是一个包,而Scannerjava.util包的类。

要使用Scanner类,需要创建该类的对象,并使用Scanner类文档中提供的任何可用方法。在我们的示例中,我们将使用nextLine()方法,该方法用于读取一行:

例如:

使用Scanner类获取用户输入:

import java.util.Scanner;

class MyClass {
  public static void main(String[] args) {
    Scanner myObj = new Scanner(System.in);
    System.out.println("输入 username");

    String userName = myObj.nextLine();
    System.out.println("Username 是: " + userName);
  }
}

4、使用import导入包

有很多软件包可供选择。在前面的示例中,我们使用了java.util包中的Scanner类。该软件包还包含日期和时间工具,随机数生成器和其他实用程序类。

要导入整个包,需要使用星号(*)。 以下示例将导入java.util包中的所有类:

例如:

import java.util.*;

5、用户自定义包

要创建自己的包,需要了解Java使用文件系统目录来存储它们。就像计算机上的文件夹一样:

例如:

    
└── root
  └── mypack
    └── MyPackageClass.java

要创建包,请使用package关键字:

MyPackageClass.java

package mypack;
class MyPackageClass {
  public static void main(String[] args) {
    System.out.println("This is my package!");
  }
}

将文件另存为MyPackageClass.java,并进行编译:

C:\Users\cjavapy> javac MyPackageClass.java

然后编译该包:

C:\Users\cjavapy> javac -d . MyPackageClass.java

这将强制编译器创建“mypack”包。-d关键字指定保存类文件的位置。可以使用任何目录名称,例如,c:/user(windows),或者,如果要将软件包保留在同一目录中,则可以使用点号.注意:软件包名称应使用小写字母,以避免与类名称冲突。

当我们在上面的示例中编译软件包时,创建了一个新文件夹,称为“mypack”。

要运行MyPackageClass.java文件,请编写以下内容:

C:\Users\cjavapy> java mypack.MyPackageClass

输出将是:

This is my package!

6、Java 包的访问控制

Java 中,访问控制 是指对类、方法、变量以及构造函数的可见性和访问权限的管理。通过不同的访问控制修饰符(如 publicprotectedprivate 和默认访问修饰符),Java 提供了灵活的机制来控制类和类成员的访问权限。访问控制不仅适用于类内部成员,也适用于类与类之间的交互。

1)public

任何地方都可以访问。无论是同一个包还是不同包中的类都可以访问 public 修饰的成员。当希望一个类或成员对外部完全开放时,可以使用 public

2)protected

只有同一个包中的类或者不同包中的子类可以访问 protected 修饰的成员。当希望类的成员在继承关系中可访问,但又不希望公开给所有类时,可以使用 protected

3)默认(包级访问,package-private)

如果没有指定访问修饰符,则默认为包级私有,只有同一个包中的类可以访问。当希望类的成员仅在同一个包内访问时,可以使用默认的访问控制(不写修饰符)。

4)private

仅能在同一个类中访问,外部类无法访问 private 成员。当希望类的成员完全私有,仅供当前类内部使用时,使用 private

7、包的命名规则

Java 包(Package)用于组织和管理类、接口等,包的命名遵循一定的规则和惯例,这有助于提高代码的可维护性、可读性以及避免命名冲突。

1)小写字母

包名一般使用小写字母,以避免与类名等其他命名产生冲突。如果包名由多个单词组成,建议使用 .(点号)分隔不同的单词,如 com.exampleorg.apache

2)避免使用Java的保留字

包名不能是 Java 的保留字。例如,不能使用 intclasssuper 等作为包名。

3)避免和其他包冲突

为了避免命名冲突,Java 建议使用公司或组织的域名反向作为包名。例如,com.exampleorg.apache。如果是个人项目,可以使用自己名字的反向域名,或根据项目命名。