Java中包用于组织类、避免命名冲突和控制访问权限;声明用package语句(必须位于非注释首行,格式为package 包名;),导入用import语句(位于package后、类定义前,支持单类、包内所有类及静态导入)。

Java 中包(Package)用于组织类、避免命名冲突、控制访问权限。声明和导入是两个独立但紧密关联的操作:声明在源文件开头定义当前类属于哪个包;导入则是为方便使用其他包中的类而写的语句。
如何声明包(package 声明)
每个 Java 源文件最多只能有一个 package 声明,且必须是文件中**非注释的第一条可执行语句**。语法格式为:
package 包名;
包名通常用小写字母,按域名倒写(如 com.example.utils),多级包用点号分隔。例如:
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
package com.myapp.service;—— 表示该文件中的类属于com.myapp.service包 - 若不写 package 声明,默认属于“无名包”(default package),不推荐在项目中使用
- 包声明会影响类的编译后路径:编译器会将
.class文件生成到与包结构匹配的子目录中(如com/myapp/service/MyService.class)
如何导入其他包中的类(import 语句)
import 语句写在 package 声明之后、类定义之前,用于引入其他包中已定义的类或接口,从而在代码中直接使用简单类名(不用写全限定名)。常见形式有三种:
-
import java.util.ArrayList;—— 导入单个类 -
import java.util.*;—— 导入java.util包下所有公共类(不递归导入子包) -
import static java.lang.Math.PI;—— 静态导入(可直接用PI而非Math.PI)
注意:java.lang 包下的类(如 String、System)无需 import,编译器自动识别。
包声明与导入的顺序和位置规则
一个合法的 Java 源文件结构应严格遵循以下顺序:
- (可选)文件级注释(如 Javadoc 或普通注释)
- (必须且唯一)
package声明 - (可选,多个)
import语句(可零个或多个,顺序不限,但通常按包名字母排序) - (必须)类或接口定义(
public class Xxx等)
违反顺序(比如把 import 放在 package 前面)会导致编译错误。
常见误区与建议
- 包名不是路径:虽然目录结构需匹配包名,但
package com.example并不要求物理路径一定是/com/example——关键在于编译时的 源码根目录 和 类路径(classpath) 设置正确 - 同名类可共存:不同包下可以有同名类(如
java.util.Date和java.sql.Date),此时必须用 import 明确引入其中一个,另一个需用全限定名调用 - 避免滥用
import xxx.*:可能引发命名冲突(如同时 importjava.util.*和java.sql.*后,直接写Date会编译失败),建议优先显式导入所需类

















