一、包(Package)的概念
作用:
避免命名冲突:不同包中可存在同名类组织管理类:将功能相关的类组织在一起(如java.util集合类)访问控制:配合访问修饰符实现封装模块化开发:便于团队协作与代码复用
命名规范:
全小写字母(如com.example.utils)域名倒序(如com.google.common)不能使用Java关键字(如int、class)
二、包的定义与使用
定义包(必须在文件首行):
// 文件路径:src/com/example/utils/StringUtil.java
package com.example.utils; // 包声明
public class StringUtil {
public static String reverse(String str) {
return new StringBuilder(str).reverse().toString();
}
}
目录结构:
src
└── com
└── example
└── utils
├── StringUtil.java
└── MathUtil.java
三、导包(import)的三种方式
导入单个类(推荐)
import com.example.utils.StringUtil;
public class Main {
public static void main(String[] args) {
System.out.println(StringUtil.reverse("Hello"));
}
}
导入整个包(谨慎使用)
import com.example.utils.*; // 导入utils包所有类
public class Main {
public static void main(String[] args) {
System.out.println(StringUtil.reverse("ABC"));
System.out.println(MathUtil.add(1, 2));
}
}
完全限定名(无需import)
public class Main {
public static void main(String[] args) {
// 直接使用包名+类名
System.out.println(com.example.utils.StringUtil.reverse("Java"));
}
}
四、特殊导包场景
静态导入(导入类的静态成员)
import static java.lang.Math.PI; // 导入常量
import static java.lang.Math.pow; // 导入静态方法
public class Circle {
double area(double radius) {
return PI * pow(radius, 2); // 直接使用
}
}
静态导入是 Java 5 引入的特性,主要作用是省略类名前缀直接访问静态成员,通过 import static 语法实现。它在特定场景下能显著提升代码的简洁性和可读性。
核心作用:
简化静态成员调用
普通导入:类名.静态成员
静态导入:直接使用静态成员
提升数学/工具类代码可读性
数学公式、常量引用等场景更接近自然书写方式
避免重复书写类名
对高频使用的静态成员(如常量、工具方法)减少冗余代码
静态导入是把双刃剑,恰当使用能使代码更简洁优雅,但滥用会导致可维护性下降。建议在常量引用、数学计算和测试断言等场景有限使用,并遵循团队编码规范。
处理同名类冲突
import com.companyA.Utils;
import com.companyB.Utils; // 错误!编译器无法区分
// 解决方案:使用完全限定名
public class Demo {
void test() {
com.companyA.Utils.doSomething();
com.companyB.Utils.doSomething();
}
}
五、Java核心包概览
Java 的标准库包含丰富的核心包,为开发者提供了强大的基础功能。
包名功能描述常用类示例java.lang语言核心类(自动导入)String, System, Mathjava.util工具类/集合框架ArrayList, HashMapjava.io输入输出操作File, InputStreamjava.net网络编程Socket, URLjava.sql数据库操作Connection, ResultSet
💡 注意:java.lang包自动导入,无需手动声明
java.lang - 语言基础包
自动导入,无需显式声明核心功能:基础类、数据类型、系统操作常用类:
Object:所有类的超类String/StringBuilder/StringBuffer:字符串处理Integer/Double/Boolean:包装类System:系统操作(如System.out.println())Math:数学运算(sqrt(), random())Thread/Runnable:多线程支持Throwable/Exception/Error:异常体系
java.util - 实用工具包
最常用的工具集合核心功能:集合框架、日期时间、随机数、正则表达式常用类:集合类:
ArrayList/LinkedList:动态数组HashMap/TreeMap:键值对存储HashSet/TreeSet:不重复集合
工具类:
Arrays:数组操作(排序、搜索)Collections:集合操作工具Objects:对象操作(判空、比较)
时间处理:
LocalDate/LocalDateTime(Java 8+)Date(旧版)/ Calendar
其他:
Random:随机数生成Scanner:输入扫描Regex:正则表达式(Pattern, Matcher)
java.io - 输入输出包
核心功能:文件操作、数据流处理
常用类:
字节流:
InputStream/OutputStreamFileInputStream/FileOutputStream
字符流:
Reader/WriterFileReader/FileWriter
缓冲流:
BufferedReader/BufferedWriterBufferedInputStream/BufferedOutputStream
其他:
File:文件/目录操作Serializable:对象序列化接口
java.net - 网络编程包
核心功能:网络通信、URL处理
常用类:
URL/URI:资源定位HttpURLConnection:HTTP连接Socket/ServerSocket:TCP套接字DatagramSocket:UDP套接字InetAddress:IP地址处理
java.sql - 数据库连接包
核心功能:JDBC数据库操作
常用接口:
Connection:数据库连接Statement/PreparedStatement:SQL执行ResultSet:结果集处理DriverManager:驱动管理
java.math - 数学计算包
核心功能:高精度数值计算
常用类:
BigInteger:任意精度整数BigDecimal:任意精度浮点数(金融计算必备)MathContext:数学运算配置
六、包的依赖关系
1.依赖关系的本质
包依赖是指一个包(或类)需要调用另一个包(或类)的功能才能正常工作。在 Java 中,这种依赖通过以下方式体现:
编译依赖:类A使用类B时,编译A需要B的字节码运行时依赖:执行时需要依赖的类必须存在于classpath传递依赖:A依赖B,B依赖C → A间接依赖C
七、示例项目结构
my-project
├── src
│ ├── com
│ │ └── company
│ │ ├── model
│ │ │ └── User.java
│ │ ├── service
│ │ │ └── UserService.java
│ │ └── util
│ │ └── DateUtil.java
│ └── Main.java
└── lib
package com.company;
import com.company.model.User;
import com.company.service.UserService;
import static com.company.util.DateUtil.getCurrentDate; // 静态导入
public class Main {
public static void main(String[] args) {
User user = new User("Alice");
UserService.register(user);
System.out.println("注册时间: " + getCurrentDate());
}
}
