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 引他人、全限定名兜底,再配上域名反写的命名规范,团队再大代码也不会乱。

笔记加载中…