ZetCode

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 包无需使用 import 语句即可使用。

实际示例

以下示例演示如何创建包和导入类型。

com/zetcode/Packages.java
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.LocalDateTimeimport 关键字可以节省大量输入。

$ 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 包私有可见性

如果我们不指定任何访问修饰符(例如 privateprotectedpublic),我们将具有包私有可见性。在这种情况下,变量和方法可以在同一个包中访问。其他包中的类无法访问使用包私有访问声明的类和成员。

Java 默认包

如果未声明任何包,则在该文件中定义的所有类型都是默认的未命名包的一部分。建议始终将类型放置在包中。即使是对于小型程序也是如此。

DefaultPackage.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 和当前包。

com/zetcode/Constants.java
package com.zetcode;

public class Constants {

    public static final String version = "1.0";
}

Constants 类与引用其 version 成员的 AutomaticImports 位于同一包中。

com/zetcode/AutomaticImports.java
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");

StringSystem 类是 java.lang 包的一部分。

System.out.println(Constants.version);

Constants 类与 AutomaticImports 类位于同一包中。 因此,我们无需使用完全限定名称或利用 import 关键字即可访问该类及其成员。

$ ls com/zetcode/
AutomaticImports.java  Constants.java

AutomaticImports.javaConstants.java 文件都位于同一子目录中。

$ javac com/zetcode/AutomaticImports.java com/zetcode/Constants.java

两个文件都已编译。

$ java com.zetcode.AutomaticImports
Linux
1.0

这是 com.zetcode.AutomaticImports 程序的示例输出。

Java 静态导入

如果我们经常使用某些静态成员,我们可以使用 import static 语句来引用它们,而无需完整的类名。应谨慎使用静态导入。

com/zetcode/StaticImport.java
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 中的包。我们展示了如何在包中组织代码。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程