java中package定义类的命名空间和目录结构,import简化外部类引用;package声明须为首行非注释语句,决定磁盘路径;import不导入类而仅简化使用,静态导入支持常量与方法;包级私有成员不可通过import访问,封装依赖访问修饰符协同实现。

Java 中用 package 组织类的物理结构,用 import 引入外部类,两者配合实现清晰的封装和模块化管理。
package 声明:定义类的命名空间和目录结构
每个 Java 源文件顶部最多一个 package 语句,必须是文件第一行非注释代码。它声明该类所属的包名,同时决定了类在磁盘上的存放路径。
- 包名通常采用小写字母的域名倒写形式,如
com.example.utils - 源文件必须存放在与包名匹配的嵌套目录中:包
com.example.utils→ 目录com/example/utils/ - 同一包内的类默认可互相访问
package-private(即不加访问修饰符)成员 - 避免使用
java.*或javax.*开头的自定义包名,防止冲突
import 语句:按需引入其他包中的类
import 写在 package 之后、类定义之前,用于简化类名使用,不导入类本身——编译器只在需要时加载对应字节码。
OpenJDK 24 Windows x64 官方参考实现(24+36),适合 Windows 环境进行 Java 开发、编译、运行和版本兼容性验证。
- 导入单个类:
import java.util.ArrayList;→ 后续可用ArrayList直接调用 - 导入整个包(通配):
import java.util.*;→ 可用ArrayList、HashMap等,但不导入子包(如java.util.concurrent) - 静态导入(用于常量或工具方法):
import static java.lang.Math.PI;→ 可直接写PI;import static java.util.Collections.sort;→ 可直接调用sort(list) - 当两个导入类名冲突(如
java.util.Date和java.sql.Date),必须用全限定名其中一个:java.sql.Date sqlDate = new java.sql.Date(...);
访问控制与封装的实际体现
package 和 import 本身不控制访问权限,但它们与访问修饰符共同支撑封装机制:
-
public类可在任意包中被 import 并使用(前提是类文件可达) -
protected成员对同包子类和不同包子类可见,import 不影响其可见性逻辑 - 默认(包级私有)成员仅对同 package 类可见——即使你 import 了那个类,也无法访问其默认成员
- 建议将紧密协作的类放在同一包内,对外只暴露
publicAPI 类,内部工具类设为默认访问级别
常见误区与实践建议
初学者容易忽略 package 和 import 的约束关系,导致编译失败或设计混乱:
- 没有
package声明的类属于“默认包”,无法被其他包中的类 import(JDK 14+ 甚至禁止 import 默认包类) - IDE 自动生成的 import 可能包含未使用的类,建议开启自动优化(如 IntelliJ 的 “Optimize Imports”)
- 避免滥用
import *,尤其在大型项目中,它会降低可读性并可能引发命名冲突 - 模块化项目(Java 9+)中,
module-info.java还需显式声明requires和exports,此时 import 仍有效,但跨模块访问受模块系统限制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










