Skip to content

Java 包 (Package)

随着项目规模的增长,类的数量会越来越多。为了更好地管理这些类,避免名称冲突,并控制代码的访问权限,Java 提供了包(Package) 机制。包本质上是一个命名空间,用于组织相关的类和接口。

什么是包?

您可以将包想象成计算机文件系统中的文件夹。就像您将文档、图片、视频分别存放在不同的文件夹里一样,Java 也将功能相关的类组织在同一个包中。

例如,Java 平台所有与 I/O 相关的核心类都放在 java.io 包中,所有集合类都放在 java.util 包中。

为什么使用包?

  1. 防止命名冲突:两个不同的开发者可能会创建同名的类,例如 Logger。如果这两个 Logger 类分别位于不同的包中(如 com.companyA.Loggerorg.companyB.Logger),它们就不会产生冲突。
  2. 访问控制:包提供了一种访问保护级别。如果一个类或成员没有声明为 public, protectedprivate,它就拥有“包私有”(default)访问权限,即只能被同一个包中的其他类访问。
  3. 组织和定位:将相关的类分组存放,使得代码结构更清晰,更容易被找到和使用。

包的命名约定

为了保证包名的唯一性,行业标准是使用反向的互联网域名作为包名的前缀。包名全部使用小写字母。

  • 例如,如果您的公司域名是 mycompany.com,那么您的包名应该以 com.mycompany 开头,后面再跟上项目名和模块名,如 com.mycompany.myproject.model

创建和使用包

声明包

要将一个类放入包中,必须在该源文件的第一行使用 package 关键字声明包名。

java
// 文件: com/mycompany/utils/StringUtils.java
package com.mycompany.utils;

public class StringUtils {
    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }
}

重要: 源文件的目录结构必须与包名完全匹配。上述 StringUtils.java 文件必须存放在 .../com/mycompany/utils/ 目录下。

import 关键字

要使用另一个包中的类,您需要使用 import 关键字将其导入到当前文件中。import 语句位于 package 语句之后,类定义之前。

  1. 导入单个类:这是最推荐的方式,因为它清晰地表明了您正在使用哪个类。

    java
    import java.util.ArrayList;
    
    public class MyClass {
        ArrayList<String> list = new ArrayList<>();
    }
  2. 导入整个包(通配符):使用星号 * 可以导入一个包中的所有 public 类和接口。

    java
    import java.util.*;
    
    public class MyClass {
        List<String> list = new ArrayList<>();
        Map<String, Integer> map = new HashMap<>();
    }
  3. 使用完全限定名:如果不使用 import,您也可以直接在代码中使用类的完全限定名(包名 + 类名)。

    java
    public class MyClass {
        java.util.ArrayList<String> list = new java.util.ArrayList<>();
    }

静态导入 (static import)

从 Java 5 开始,import static 允许您导入一个类的静态成员(字段或方法),从而在代码中可以直接使用这些成员,无需通过类名。

java
import static java.lang.Math.PI;
import static java.lang.Math.sqrt;

public class Circle {
    double radius;

    public double getArea() {
        // 无需写 Math.PI
        return PI * radius * radius;
    }

    public double getHypotenuse(double a, double b) {
        // 无需写 Math.sqrt
        return sqrt(a*a + b*b);
    }
}

注意: 过度使用静态导入会降低代码的可读性,因为它模糊了静态成员的来源。建议只在频繁使用某个类的少量静态成员时使用。

java.lang

java.lang 是一个特殊的包,它包含了 Java 语言的核心类,如 Object, String, System, Integer, Math 等。这个包被自动导入到每一个 Java 源文件中,因此您无需手动 import 就可以直接使用这些类。

本站内容仅供学习和研究使用。