package 和 import 是 Java 组织与复用代码的基础机制:package 定义类的命名空间和归属路径,必须首行声明并对应目录结构,用于避免冲突、逻辑分组和包级访问控制;import 简化跨包类引用,支持单类、包通配导入或全限定名使用,但不导入子包,且 java.lang 类自动可见。

package 和 import 是 Java 组织和复用代码的两个基础机制:package 用来划分命名空间、管理类归属,import 用来简化跨包类的使用。
package:定义类的“家庭住址”
每个 Java 类都属于某个包,就像文件存放在特定文件夹里。package 声明必须写在源文件第一行,格式为 package com.example.utils;,它直接对应磁盘上的目录结构(如 src/com/example/utils/)。作用包括:
- 避免类名冲突:不同包下可存在同名类,比如 java.util.Date 和 java.sql.Date 互不干扰
- 组织代码逻辑:把功能相关的类归到同一包,如 java.util 放集合工具,java.io 放输入输出类
- 配合访问控制:default(包级)修饰符只允许同包内访问,这是封装的重要一环
- 没有 package 声明的类属于默认包(default package),不推荐在项目中使用,因为无法被其他包 import
import:省去反复写全限定名
当一个类要用到其他包里的类时,可以用 import 把目标类“请进来”,之后就能直接用简单类名。import 必须写在 package 之后、class 之前。常见用法有三种:
- 导入单个类:import java.util.ArrayList; —— 最清晰、最安全,明确知道用了哪个类
- 导入整个包:import java.util.*; —— 方便但不推荐滥用,可能引入冗余类或引发命名歧义
- 不 import,直接用全限定名:new java.util.HashMap(); —— 适合仅用一次、或存在同名类冲突时(如同时用 Date 和 sql.Date)
注意:java.lang 包下的类(如 String、System、Math)无需 import,编译器自动识别;本包内的类也无需 import。
立即学习“Java免费学习笔记(深入)”;
常见误区与注意事项
实际开发中容易忽略几个关键细节:
- 一个文件只能有一个 package 声明,且必须是首行;不能重复或拆开写
- import 不能 导入子包,import java.util.*; 不包含 java.util.concurrent 下的类
- 如果两个 import 的类同名(如 util.Date 和 sql.Date),编译器会报错,此时至少一个必须用全限定名
- IDE(如 IntelliJ)通常自动补全 package 和 import,但理解其原理才能读懂错误提示、排查编译问题
小结:它们共同构成 Java 的模块化基础
package 是静态归属,决定类“住哪”;import 是动态引用,决定类“怎么叫”。二者配合,让成百上千个类能在不重名、不混乱的前提下协同工作。项目越大,这套机制越不可替代——它不只是语法,更是 Java 工程化的起点。










