01_包的定义与导入
一、包的基本概念
包(Package)是 Java 中用于组织类和接口的命名空间,本质上是目录结构,用于解决类名冲突、管理类文件和划分代码模块。
核心作用:
- 避免类名重复(不同包中可存在同名类)
- 将相关类和接口归类,便于管理和维护
- 控制类的访问范围(配合访问修饰符)
![在这里插入图片描述]()
二、包的定义
2.1 定义语法
在 Java 源文件的第一行(注释除外)使用package语句定义包,语法:
package 包名;
- 包名通常由小写字母组成,多个层级用.分隔(对应目录的层级结构)
- 定义包后,类的完整名称为 “包名。类名”(称为全限定名)
2.2 示例
// 定义包:com.example.utils(对应目录结构:com/example/utils)
package com.example.utils;
public class MathTool {
// 类内容
}
上述代码中:
- 包名为com.example.utils
- 类的全限定名为com.example.utils.MathTool
- 编译后,.class文件会被存储在com/example/utils目录下
2.3 注意事项
- 位置要求:package语句必须是源文件的第一行有效代码(不能在其前面编写类定义或其他语句,注释除外)。
// 错误示例:package语句不在第一行
public class Test {}
package com.example; // 编译错误:package语句必须在最前面
- 唯一性:同一包中不能有同名类,但不同包中可以有同名类。例如:
- com.example.User和com.test.User是两个不同的类,不会冲突。
- 与目录结构一致:包名的层级需与实际存储的目录结构一致,否则编译或运行时会找不到类。
- 包com.example对应目录com/example
- 若类定义在com.example包中,但.class文件存储在com/test目录下,会导致ClassNotFoundException
三、包的导入
当需要使用其他包中的类时,需通过import语句导入,避免每次使用都写全限定名,简化代码。
3.1 导入语法
3.1.1 导入单个类
import 包名.类名;
示例
// 导入java.util包下的ArrayList类
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>(); // 可直接使用类名
}
}
3.1.2 导入整个包中的所有类(通配符*)
import 包名.*;
示例
// 导入java.util包下的所有类
import java.util.*;
public class Demo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>(); // 可用
HashMap<String, Integer> map = new HashMap<>(); // 可用
}
}
3.1.3 导入静态成员(静态方法或静态变量)
import static 包名.类名.静态成员名; // 导入单个静态成员
import static 包名.类名.*; // 导入所有静态成员
示例
// 导入java.lang.Math类的所有静态成员
import static java.lang.Math.*;
public class Demo {
public static void main(String[] args) {
double pi = PI; // 直接使用静态变量PI(无需Math.PI)
double sqrt = sqrt(25); // 直接使用静态方法sqrt()(无需Math.sqrt())
}
}
3.2 无需导入的类
以下情况使用类时无需导入:
- 同一包中的类:同一包下的类可直接相互访问,无需导入。
// 包:com.example
package com.example;
public class A {}
// 同一包下的类B,可直接使用A
package com.example;
public class B {
A a = new A(); // 无需导入
}
- java.lang 包中的类:Java 默认导入java.lang包(如String、System、Math等),可直接使用。
// 无需导入java.lang.String,默认已导入
String str = "hello";
// 无需导入java.lang.System
System.out.println(str);
3.3 类名冲突与解决
当导入的多个包中存在同名类时,会导致类名冲突,需通过全限定名区分。
示例:
// 导入两个包,均包含Date类
import java.util.Date;
import java.sql.Date; // 与java.util.Date冲突
public class Demo {
public static void main(String[] args) {
// Date date = new Date(); // 编译错误:无法确定是哪个Date
// 解决:使用全限定名
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
}
}
3.4 注意事项
- 位置要求:import语句需放在package语句之后、类定义之前。
package com.example;
import java.util.ArrayList; // 正确位置
public class Demo {}
- 通配符*的范围:import com.example.*仅导入com.example包下的直接类,不会导入其子包中的类。例如:
- import com.example.*可导入com.example.User
- 但不能导入com.example.service.UserService(需显式导入com.example.service.*或com.example.service.UserService)
- 冗余导入:未使用的import语句不会影响程序运行,但建议删除,保持代码整洁(IDE 通常有自动优化功能)。
四、总结
| 操作 | 语法 | 作用 | 注意事项 |
|---|---|---|---|
| 定义包 | package 包名; | 声明类所属的命名空间 | 必须是源文件第一行有效代码 |
| 导入类 | import 包名.类名; 或 import 包名.*; | 简化其他包中类的使用 | 需放在package之后、类定义之前 |
| 导入静态成员 | import static 包名.类名.成员名; | 简化静态方法 / 变量的使用 | 可直接使用成员名,无需类名 |
包的核心价值在于组织代码和避免类名冲突,合理的包定义和导入能使项目结构清晰,提高代码的可维护性。实际开发中,需注意包名与目录结构一致,以及类名冲突的处理。


浙公网安备 33010602011771号