java包机制通过全限定名实现类的逻辑隔离,核心是包名与目录结构严格对应、禁用默认包、import仅简化书写、同名类靠全限定名消歧。

包名必须与目录结构严格一致
包声明不是可选注释,而是强制性约定:
– 每个 Java 文件顶部的 package 语句必须是第一条非注释语句;
– 包名全部小写,推荐用反向域名 + 业务分层,例如 com.example.order.service;
– 源码路径必须逐级对应:类 com.example.order.service.OrderService 必须存放在 com/example/order/service/OrderService.java 路径下。
默认包必须禁用
不写 package 的类属于“默认包”,它无法被其他包 import,也不能参与访问控制(如 protected、包级可见),在任何正式项目中都不应出现:
– 默认包中的类不能被其他包引用;
– 多个默认包类之间看似能互相访问,但实际破坏模块边界,极易引发命名冲突和构建失败;
– IDE 和构建工具(如 Maven)通常会警告或拒绝编译含默认包的代码。
import 是简化书写,不是建立依赖关系
import 只影响源码编写阶段的类名解析,不影响字节码或类加载行为:
– 导入后可用简单名(如 ArrayList),否则需写全限定名(java.util.ArrayList);
– 同名类共存时(如自定义 JsonUtil 和 com.fasterxml.jackson.databind.JsonUtil),仅靠 import 无法消歧,必须显式使用全限定名;
– 避免通配符导入(import java.util.*;)与自定义同名类并存,否则可能触发 “cannot resolve method” 编译错误。
通过包层级实现天然命名空间隔离
Java 不提供“命名空间”关键字,但包天然承担该职责:
– 全限定名(包名 + 类名)是类的唯一标识,不同包下的同名类互不干扰;
– 同一包内类默认可相互访问(包级可见),跨包则受访问修饰符限制;
– 构建工具(如 Maven)可通过插件禁止跨包直连(如 maven-enforcer-plugin),强制模块间通过接口通信,强化边界。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











