Java 包机制:命名空间管理、访问控制与模块化组织
包是 Java 组织类的核心机制,解决命名冲突、访问控制、代码定位三大问题。包对应文件系统目录结构,形成逻辑与物理统一的层次命名空间。
包声明与命名规范
- 源文件首行:
package com.company.project.module; - 命名:全小写,反向域名前缀(
com.example) - 每文件仅一条 package 语句,应用于文件所有类型
编译与目录结构
# 源码结构
src/com/example/model/User.java
# 内容
package com.example.model;
public class User {}
// 编译到目标目录
javac -d bin src/com/example/model/User.java
# 生成
bin/com/example/model/User.class
-d 指定输出根目录,编译器自动创建包对应子目录。
import 机制
| 方式 | 语法 | 适用场景 |
|---|---|---|
| 全限定名 | com.example.User u = new com.example.User(); | 同名类冲突、极少用 |
| 单类导入 | import com.example.User; | 推荐,明确依赖 |
| 通配符导入 | import com.example.*; | 同包多类、原型开发 |
| 静态导入 | import static java.lang.Math.PI; | 常量/静态方法 |
同包类无需导入直接访问。java.lang 包自动隐式导入。
访问控制与包可见性
| 修饰符 | 同类 | 同包 | 子类(异包) | 其他 |
|---|---|---|---|---|
| private | ✅ | ❌ | ❌ | ❌ |
| 默认 | ✅ | ✅ | ❌ | ❌ |
| protected | ✅ | ✅ | ✅ | ❌ |
| public | ✅ | ✅ | ✅ | ✅ |
包私有 是默认级别,利于模块内协作、模块间隔离。
CLASSPATH 与类加载
类路径告诉 JVM 去哪找 .class 文件。根路径 + 包名 = 完整类路径。
# 设置 CLASSPATH
# Windows
set CLASSPATH=.;C:\libs\mylib.jar;D:\classes
# Linux/Mac
export CLASSPATH=.:/home/user/libs/mylib.jar:/opt/classes
.代表当前目录- 多路径用分隔符分开(Win ; / Unix :)
- JAR 内部目录结构同包结构
模块化最佳实践
- 按功能/领域分包:
com.example.order、com.example.payment - 分层架构包结构:
com.example.app ├── controller // Web 层 ├── service // 业务逻辑 ├── repository // 数据访问 ├── domain // 实体/值对象 ├── dto // 传输对象 └── config // 配置类
- 避免循环依赖:包之间不应形成环
- 模块化(Java 9+):
module-info.java显式导出包、声明依赖module com.example.app { exports com.example.app.api; requires com.example.lib; }
常见问题
- 包名与类名冲突:
java.util.Datevsjava.sql.Date→ 用全限定名 - 默认包:无 package 声明的类,禁止在生产代码使用(无法导入、类加载问题)
- 目录大小写:Linux 区分大小写,包名全小写避坑
java
- Python 包:结构、导入与最佳实践
- 深入理解 Java final 关键字:变量、方法与类的不可变性
- Java instanceof 运算符完全指南:用法、继承与接口检查
- 精通 Java 继承:核心概念、类型与实战示例
- 深入理解 Java 静态嵌套类:用法、差异与实战示例
- 精通 Java 匿名内部类:定义、语法与实战示例
- Java 单例模式详解:安全实现与使用指南
- 精通 Java 反射:运行时检查类、方法与字段
- 精通 Java ArrayList:操作、方法与最佳实践
- 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
- 掌握 Java 泛型:构建可复用、类型安全的代码
- 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除