第一部分:package 基础概念

包 package 是 Java 中管理类、接口、枚举的命名空间,避免命名冲突

学习目标

理解 package 的作用、命名规范、目录结构映射关系

1

为什么需要 package?

  • 防止类名冲突(如两个 Date 类)
  • 更好地组织大型项目结构
  • 提供访问控制(默认包外不可访问)
2

package 命名规范

  • 全小写字母,反转域名(如 com.company.project)
  • 不能以 java. 开头(保留给 JDK)
  • 层级清晰,语义明确
// 正确示例
package com.mashibing.project.service;

// 错误示例
package Java.util; // 不能使用 Java 开头
项目根目录
src/
com/
└── company/
└── project/
类文件
HelloService.java

第二部分:创建与使用 package

从 0 开始创建包结构,理解目录与包的一一对应关系

1

手动创建包结构

  • 在项目 src 目录下创建目录层级
  • 目录名 = 包名(com/mashibing/util)
  • Java 文件顶部声明 package
// 目录结构
src/
└── com/
└── mashibing/
└── util/
└── DateUtil.java
2

在 IDEA 中创建包

  • 右键 src → New → Package
  • 输入包名(IDEA 自动创建目录)
  • 在包内新建类
3

编写包内类

// 文件:com/mashibing/util/StringHelper.java
package com.mashibing.util;

public class StringHelper {
    public static String reverse(String input) {
        return new StringBuilder(input).reverse().toString();
    }
}
4

编译与运行

# 从项目根目录编译
javac -d out src/com/mashibing/util/StringHelper.java

# 运行
java -cp out com.mashibing.util.StringHelper

第三部分:import 使用详解

掌握 import 的三种写法、通配符规则及静态导入

学习目标

熟练使用 import 引入类、包、静态成员,理解编译器查找规则

1

单类型导入(推荐)

import java.util.ArrayList;
import java.util.List;

优点:明确、可读性好,避免命名冲突

2

按需导入(通配符)

import java.util.*;

注意:仅导入当前包下类,不会递归导入子包

3

静态导入(Java 5+)

import static java.lang.Math.PI;
import static java.lang.System.out;

out.println("PI = " + PI); // 直接使用
4

import 查找顺序

  1. 当前包中的类
  2. java.lang 包(自动导入)
  3. 单类型导入
  4. 按需导入

第四部分:常见错误与最佳实践

总结初学者最容易犯的错误及解决方案

错误1:包名与目录不匹配

// 错误:文件在 src/ 根目录,却声明 package
package com.example; // 必须放在 com/example/ 目录

解决方案:确保目录结构与包名完全一致

错误2:类名冲突

import java.sql.Date;
import java.util.Date; // 冲突!

解决方案:使用全限定名或重命名其中一个

错误3:忘记导入非 java.lang 类

List list = new ArrayList(); // 编译错误:找不到符号

解决方案:添加 import java.util.List; 和 import java.util.ArrayList;

最佳实践总结

  • 始终使用反转域名作为包前缀(com.company.project)
  • 避免使用通配符 import(*)
  • 包名全小写,类名首字母大写
  • IDE 自动导入功能(Ctrl+Alt+O 优化 import)
  • 静态导入谨慎使用,避免可读性下降

第五部分:综合实战案例

构建一个包含多个包的工具库项目

1

项目结构规划

utils-project/
├── src/
│ ├── com/
│ │ └── itheima/
│ │ ├── util/ // 工具类
│ │ │ ├── StringUtil.java
│ │ │ └── DateUtil.java
│ │ ├── model/ // 数据模型
│ │ │ └── User.java
│ │ └── Main.java // 主类
2

实现工具类

// StringUtil.java
package com.itheima.util;

public class StringUtil {
    public static boolean isEmpty(String str) {
        return str == null || str.trim().isEmpty();
    }
}
3

主类使用工具类

// Main.java
package com.itheima;

import com.itheima.util.StringUtil;
import com.itheima.model.User;

public class Main {
    public static void main(String[] args) {
        User user = new User("Alice", "");
        if (StringUtil.isEmpty(user.getEmail())) {
            System.out.println("Email is required");
        }
    }
}
4

编译与运行

# 编译所有源文件
javac -d out src/com/itheima/**/*.java

# 运行主类
java -cp out com.itheima.Main

动手练习

  1. 创建 com.yourname.math 包,实现 Calculator 类
  2. 创建 com.yourname.test 包,测试 Calculator
  3. 尝试制造一个包名与目录不匹配的错误并解决
  4. 使用静态导入简化 Math.PI 的调用

第六部分:知识总结

package 和 import 的核心要点速查表

关键概念

  • package:物理目录与命名空间的映射
  • import:编译时指令,不影响运行时
  • 默认包:未声明 package 的类属于默认包(不推荐)

IDE 快捷键

  • 自动导入:Alt+Enter(IDEA)
  • 优化 import:Ctrl+Alt+O
  • 查看类定义:Ctrl+左键

学习建议

从第一天就开始使用规范的包结构,养成良好习惯。遇到编译错误先检查包声明和 import 语句,80% 的包相关错误都源于此。