Java 包
最后修改于 2024 年 1 月 27 日
在本文中,我们将讨论 Java 包。
包是相关类型的分组,提供访问保护和命名空间管理。Java 中的包类似于 C# 中的命名空间的概念。
在 Java 中创建包
使用 package 关键字声明包。此语句必须放在每个源文件的顶部。每个源文件中只能有一个这样的语句。Java 源文件必须放置在与包名称匹配的目录中。
package com.zetcode;
使用上述包在文件中定义的所有类型都是 com.zetcode 包的一部分。类 Being 的完全限定名称为 com.zetcode.Being。
全球有数百万 Java 程序员。为了避免潜在的名称冲突,Java 中存在命名约定。包名称使用反向的 Internet 域名。字母以小写形式书写。只能有一个 zetcode.com 域名,因此对包使用反向名称 com.zetcode 将使它们独一无二。带有 com.zetcode 包的 Java 源文件必须位于 com/zetcode 子目录中。包名称以全部小写字母书写,以避免与类或接口的名称冲突。
import 关键字用于源文件的开头,用于指定类型(类、接口、枚举或注解)或整个 Java 包,以便以后引用它们时无需在引用中包含它们的包名称。Import 语句可以导入类的静态成员(方法和变量)。
import java.awt.*;
使用 * 通配符,我们可以一次导入整个包。导入后,我们可以引用 java.awt 包的所有类型,而无需它们的完全限定名称。
import java.awt.event.*;
java.awt.event 子包不会随 java.awt.* 导入一起导入。子包必须单独导入。
import java.util.Random;
在这种情况下,仅导入 Random 类。现在可以使用其简单的类名称引用 Random 类。
Java 中的核心包
以下是 Java 中核心包的部分列表
- java.lang — 基本语言功能和基本类型
- java.util — 集合数据结构类
- java.io — 用于文件操作的 Java API
- java.math — 多精度算术
- java.nio — Java 的非阻塞 I/O 框架
- java.net — 网络操作、套接字、DNS 查找,...
- java.security — 密钥生成、加密和解密
- java.sql — 用于访问数据库的 Java 数据库连接 (JDBC)
- java.awt — 用于本机 GUI 组件的基本包层次结构
- javax.swing — 用于平台无关的富 GUI 组件的包层次结构
- java.beans — 包含与开发基于 JavaBean 架构的 bean -- 组件相关的类。
- java.text — 提供用于以独立于自然语言的方式处理文本、日期、数字和消息的类和接口。
- java.rmi — 用于远程方法调用的 Java API。
- java.time — 用于日期、时间、时刻和持续时间的主要 API。
java.lang 包无需使用 import 语句即可使用。
实际示例
以下示例演示如何创建包和导入类型。
package com.zetcode;
import java.util.Random;
public class Packages {
public static void main(String[] args) {
var r = new Random();
int x = r.nextInt();
System.out.println(x);
java.time.LocalDateTime dt = java.time.LocalDateTime.now();
System.out.println(dt);
}
}
该示例使用两种类型:Random 类和 LocalDateTime 类。第一个类是导入的,第二个类是通过其完全限定名称引用的。
package com.zetcode;
我们使用 package 关键字声明一个包。Packages.java 文件必须位于 com/zetcode 子目录中。
import java.util.Random;
此代码行使我们能够使用 Random 类,而无需包名称。
var r = new Random();
在这里,我们使用 Random,而无需使用其全名。
java.time.LocalDateTime dt = java.time.LocalDateTime.now();
如果我们没有在类型上使用 import 关键字,我们只能通过其全名引用它 - 在我们的例子中是 java.time.LocalDateTime。import 关键字可以节省大量输入。
$ ls com/zetcode/ Packages.java
Packages.java 源文件放置在 com/zetcode 子目录中。包名称必须反映目录结构。
$ javac com/zetcode/Packages.java
我们使用 javac 工具编译源文件。该工具是从 com/zetcode 目录的父目录调用的。
$ java com.zetcode.Packages 897739291 2022-09-26T12:25:06.699181327
Java 包私有可见性
如果我们不指定任何访问修饰符(例如 private、protected 或 public),我们将具有包私有可见性。在这种情况下,变量和方法可以在同一个包中访问。其他包中的类无法访问使用包私有访问声明的类和成员。
Java 默认包
如果未声明任何包,则在该文件中定义的所有类型都是默认的未命名包的一部分。建议始终将类型放置在包中。即使是对于小型程序也是如此。
public class DefaultPackage {
public static void main(String[] args) {
System.out.println("A class in a default package");
}
}
DefaultPackage 类是默认包的一部分。
$ ls DefaultPackage.java
如果我们不指定包,则不会将源文件放置在特定的子目录中。
$ javac DefaultPackage.java $ java DefaultPackage A class in a default package
我们编译代码并运行应用程序。源文件和字节码位于当前工作目录中。
Java 自动导入
Java 编译器会自动导入两个包:java.lang 和当前包。
package com.zetcode;
public class Constants {
public static final String version = "1.0";
}
Constants 类与引用其 version 成员的 AutomaticImports 位于同一包中。
package com.zetcode;
public class AutomaticImports {
public static void main(String[] args) {
String os = System.getProperty("os.name");
System.out.println(os);
System.out.println(Constants.version);
}
}
在此示例中,我们引用 Java 编译器自动导入的一些类。
String os = System.getProperty("os.name");
String 和 System 类是 java.lang 包的一部分。
System.out.println(Constants.version);
Constants 类与 AutomaticImports 类位于同一包中。 因此,我们无需使用完全限定名称或利用 import 关键字即可访问该类及其成员。
$ ls com/zetcode/ AutomaticImports.java Constants.java
AutomaticImports.java 和 Constants.java 文件都位于同一子目录中。
$ javac com/zetcode/AutomaticImports.java com/zetcode/Constants.java
两个文件都已编译。
$ java com.zetcode.AutomaticImports Linux 1.0
这是 com.zetcode.AutomaticImports 程序的示例输出。
Java 静态导入
如果我们经常使用某些静态成员,我们可以使用 import static 语句来引用它们,而无需完整的类名。应谨慎使用静态导入。
package com.zetcode;
import static java.lang.Math.E;
import static java.lang.Math.PI;
import static java.lang.Math.abs;
public class StaticImport {
public static void main(String[] args) {
System.out.println(E);
System.out.println(PI);
System.out.println(abs(-5));
}
}
在此示例中,我们引用两个常量和一个静态方法。
import static java.lang.Math.E; import static java.lang.Math.PI; import static java.lang.Math.abs;
我们使用 import static 语句来允许在不使用其全名的情况下引用它们。
System.out.println(E); System.out.println(PI); System.out.println(abs(-5));
我们引用这三个成员,而无需它们的类名。
$ java com.zetcode.StaticImport 2.718281828459045 3.141592653589793 5
来源
在本文中,我们介绍了 Java 中的包。我们展示了如何在包中组织代码。
作者
列出所有Java教程。