Java 包 (Package)
随着项目规模的增长,类的数量会越来越多。为了更好地管理这些类,避免名称冲突,并控制代码的访问权限,Java 提供了包(Package) 机制。包本质上是一个命名空间,用于组织相关的类和接口。
什么是包?
您可以将包想象成计算机文件系统中的文件夹。就像您将文档、图片、视频分别存放在不同的文件夹里一样,Java 也将功能相关的类组织在同一个包中。
例如,Java 平台所有与 I/O 相关的核心类都放在 java.io 包中,所有集合类都放在 java.util 包中。
为什么使用包?
- 防止命名冲突:两个不同的开发者可能会创建同名的类,例如
Logger。如果这两个Logger类分别位于不同的包中(如com.companyA.Logger和org.companyB.Logger),它们就不会产生冲突。 - 访问控制:包提供了一种访问保护级别。如果一个类或成员没有声明为
public,protected或private,它就拥有“包私有”(default)访问权限,即只能被同一个包中的其他类访问。 - 组织和定位:将相关的类分组存放,使得代码结构更清晰,更容易被找到和使用。
包的命名约定
为了保证包名的唯一性,行业标准是使用反向的互联网域名作为包名的前缀。包名全部使用小写字母。
- 例如,如果您的公司域名是
mycompany.com,那么您的包名应该以com.mycompany开头,后面再跟上项目名和模块名,如com.mycompany.myproject.model。
创建和使用包
声明包
要将一个类放入包中,必须在该源文件的第一行使用 package 关键字声明包名。
// 文件: 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 语句之后,类定义之前。
导入单个类:这是最推荐的方式,因为它清晰地表明了您正在使用哪个类。
javaimport java.util.ArrayList; public class MyClass { ArrayList<String> list = new ArrayList<>(); }导入整个包(通配符):使用星号
*可以导入一个包中的所有public类和接口。javaimport java.util.*; public class MyClass { List<String> list = new ArrayList<>(); Map<String, Integer> map = new HashMap<>(); }使用完全限定名:如果不使用
import,您也可以直接在代码中使用类的完全限定名(包名 + 类名)。javapublic class MyClass { java.util.ArrayList<String> list = new java.util.ArrayList<>(); }
静态导入 (static import)
从 Java 5 开始,import static 允许您导入一个类的静态成员(字段或方法),从而在代码中可以直接使用这些成员,无需通过类名。
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 就可以直接使用这些类。