Java 包 package
包(package)是 Java 组织类的"文件夹 + 命名空间":把功能相近的类放一起,用包名区分同名类,还参与访问控制。项目一大,没有包就会乱成一团、到处重名冲突,学会分包是工程化的第一步。
包的作用
- 组织代码:按功能或分层归类,如 entity、dao、service。
- 避免命名冲突:不同包可以存在同名类,用全限定名区分。
- 控制访问:默认访问权限(不写修饰符)就是"同包可见"。
- 方便分发:包结构与目录一一对应,便于打包成 jar 发布。
package 声明与目录结构
package 语句必须写在源文件第一行(注释除外),且目录要与包名逐段对应:
// 文件位置:com/example/util/StrUtil.java
package com.example.util; // 第一行声明包
public class StrUtil {
public static String trim(String s) {
return s.trim();
}
}
编译时用 -d 参数,让 javac 按包名自动生成目录:
javac -d . StrUtil.java
import 导入与全限定名
同包内的类直接用类名;跨包使用时,要么写全限定名,要么用 import 导入后写短名:
import java.util.ArrayList; // 导入单个类
import java.util.*; // 导入该包所有公开类型
public class Demo {
public static void main(String[] args) {
java.util.Date d1 = new java.util.Date(); // 全限定名:不 import 也能用
ArrayList<String> list = new ArrayList<>(); // import 后的短名
list.add("A");
System.out.println(list.size());
System.out.println(d1.getTime() > 0); // 1970 年后的毫秒数必大于 0
}
}
// 输出:1
// 输出:true
import 并不会把类复制进来,只是少打字;* 通配符也不影响运行性能,编译器按需解析。
java.lang 自动导入
java.lang 包(String、System、Math、Integer 等)由编译器自动导入,无需写 import——所以任何类里都能直接写 System.out.println。
常见 JDK 包
- java.util:集合、日期时间、随机数等工具类。
- java.io:文件与输入输出流。
- java.net:网络编程(Socket、URL)。
- java.time:JDK8 的新日期时间 API。
- java.sql:JDBC 数据库访问。
命名规范与 jar 打包
- 用域名反写做前缀防冲突:如域名 example.com 的公司,包名写 com.example.项目名.模块名。
- 包名一律小写,不用连字符;功能模块用点号分层。
- jar 打包:把编译后的 class 按包结构打成 jar(本质是 zip)文件,作为库分发给他人 import 使用,可用 jar cf 命令或 IDE 完成。
包是 Java 代码的"目录 + 命名空间":package 定归属、import 引他人、全限定名兜底,再配上域名反写的命名规范,团队再大代码也不会乱。