java包机制通过命名空间、物理路径和访问控制协同管理类:包名即命名空间解决类名冲突;强制对应目录结构;默认访问修饰符以包为作用域;import仅简化类名解析而非加载类。

Java 中 package 包机制不是简单地给文件夹起个名字,而是从命名空间、物理路径、访问控制三方面协同管理类。
包名即命名空间,解决类名冲突
不同包下允许存在完全同名的类,JVM 通过全限定名(如 java.util.Date 和 java.sql.Date)区分它们。这避免了大型项目中因类名重复导致的编译或运行时错误。
- 包名采用小写字母+点分隔,推荐用反向域名(如 com.example.service)
- 包之间没有父子关系:com.example.user 和 com.example.user.auth 是两个独立包
- 不写 package 的类属于默认包,无法被其他包 import,也不支持 public 类跨包使用
包名强制对应目录结构
package 声明不是可选注释,它直接决定源文件存放位置和编译后 class 文件的生成路径。
- 声明 package com.example.dao; → 源文件必须放在 src/com/example/dao/ 目录下
- 编译命令需配合 -d .(如 javac -d . UserDao.java),让 javac 自动创建对应目录并输出 class
- 运行时必须用全限定类名:java com.example.dao.UserDao
- 大小写和下划线敏感:com.Example.Dao 或 com.example.my_tool 都会导致类加载失败
包是访问控制的基础单位
Java 的四种访问修饰符中,“默认”(不加任何修饰符)这一档,其作用范围就是整个包——这是封装最常用也最自然的一层边界。
- 同包内类可直接访问彼此的默认成员(字段、方法),无需 public 或 import
- 即使你 import 了一个类,也无法访问它的默认成员——可见性由修饰符决定,与 import 无关
- 建议将协作紧密的类(如 Service + DTO + Exception)放在同一包内,对外只暴露 public 接口类
- 内部工具类、辅助枚举等设为默认访问,天然隔离外部调用
import 是引用简化器,不是类加载器
import 不把类“复制进来”,只是告诉编译器:“后面出现这个类名时,请按我写的全限定名去解析”。
- 同包类无需 import,直接用类名即可
- import java.util.*; 只导入实际用到的类,不影响运行性能
- 遇到同名类(如 Date),只能 import 其中一个,另一个必须写全限定名调用
- java.lang 下的类(String、System 等)自动导入,不用显式写 import
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











