静态导入用于省略public static成员前的类名,正确语法为import static 包名.类名.成员或import static 包名.类名.*;适用高频无歧义的工具方法,但需避免命名冲突、通配隐藏来源及可维护性下降。

Java 中的静态导入(import static)不是给 static 关键字“加功能”,而是专门用来省掉工具类方法和常量前的类名。它让 Objects.requireNonNull(str) 变成 requireNonNull(str),让 Math.PI 变成 PI,前提是这些成员是 public static 的。
哪些工具类方法适合静态导入
高频、语义明确、无歧义的静态方法最适用:
-
标准库工具类:如
java.util.Objects的requireNonNull、equals;java.util.Collections的emptyList、singleton -
函数式工具:如
java.util.stream.Collectors的toList、toMap -
数学计算:如
java.lang.Math的sqrt、sin、PI -
测试断言:如
org.junit.jupiter.api.Assertions的assertEquals、assertTrue
怎么写才正确
语法必须完整、精准:
- ✅ 正确:
import static java.util.Objects.requireNonNull;(导入单个方法) - ✅ 正确:
import static java.lang.Math.*;(通配导入,包名+星号缺一不可) - ❌ 错误:
import static Math.*;(缺包名) - ❌ 错误:
import static java.lang.Math;(缺*或具体成员名) - ❌ 错误:
import static org.apache.commons.lang3.StringUtils.*;后仍写StringUtils.isEmpty(s)(静态导入后要去掉类名,直接写isEmpty(s))
避免常见坑
静态导入是语法糖,但用不好反而增加理解成本:
立即学习“Java免费学习笔记(深入)”;
- 多个类含同名静态方法(比如两个工具类都有
format),导入后编译失败,必须显式写类名调用 - 通配导入(
.*)容易隐藏来源,新成员读代码时难判断toList()来自Collectors还是别的类 - private 或 package-private 的静态方法无法被导入,哪怕在同一个包里也不行
- IDE 不会自动补全静态导入项,需手动添加,漏写就会报
cannot find symbol
比静态导入更稳妥的替代思路
不是所有简化都该靠 import static:
- 只用一两次的方法,保留
Objects.requireNonNull()更清晰,比单独requireNonNull()更易溯源 - 频繁使用的工具逻辑,考虑封装成实例对象(如
DateFormatter),便于 mock 和扩展 - 配置类常量可用枚举替代,增强类型安全和 IDE 提示
- 现代框架(如 Spring Boot)提供的自动装配 Bean,比静态方法更利于测试和解耦


















