import语句仅在编译期起作用,用于简化类名书写,不参与类型检查、不影响运行时行为、不触发类加载;其有效性依赖classpath配置,与模块系统要求相关。

import 语句不参与编译期类型检查,也不影响运行时行为,它只是告诉编译器:“当我在代码里写一个没带包名的类名时,请按这个路径去查”。
import 解决的是“怎么写类名更省事”
Java 编译器默认只认识 java.lang 下的类(比如 String、System),其他所有类都必须显式声明来源。否则写 ArrayList 会被当成自定义类或报错。
- 不 import:
java.util.ArrayList list = new java.util.ArrayList();—— 全限定名,永远可用,但啰嗦 - 用 import:
import java.util.ArrayList;后,就能直接写ArrayList list = new ArrayList(); - 静态 import(如
import static java.lang.Math.PI;)允许直接写PI,但容易降低可读性,慎用
重复 import 或未使用的 import 不报错,但会影响可维护性
编译器会自动忽略重复 import(比如两次 import java.util.List;),也不会因为某个 import 没被实际用到而拒绝编译。但这会让 IDE 提示警告,也增加代码理解成本。
- IDE(如 IntelliJ)默认高亮未使用 import,可一键清理(
Optimize Imports) - 构建工具(如 Maven + Checkstyle)可配置规则强制检查,避免团队中堆积无用 import
- 注意通配符 import(
import java.util.*;):它不会提升性能,也不会导致类加载,但会掩盖命名冲突(比如同时有java.util.Date和java.sql.Date时,必须显式写全名)
import 不等于类加载,和 classpath 是两回事
import 只在编译阶段起作用;真正决定类能否被找到、是否能实例化的,是 classpath(或模块路径)。哪怕 import 写对了,如果对应 JAR 没加进 classpath,编译就直接失败。
立即学习“Java免费学习笔记(深入)”;
-
编译错误
package java.util does not exist:不是 import 写错了,而是 JDK 路径异常或模块配置问题 - 运行时
NoClassDefFoundError:说明 classpath 缺少依赖,跟 import 是否存在无关 - 模块系统(Java 9+)下,即使 import 正确,若模块未声明
requires java.base或未导出包,也会编译失败
import java.util.ArrayList;
import java.util.List;
public class Example {
public static void main(String[] args) {
List list = new ArrayList<>(); // import 让这行能写得简洁
list.add("hello");
System.out.println(list);
}
}
最常被忽略的一点:import 的解析发生在编译期,且仅基于源码中的文本匹配。它不触发任何类加载,也不执行任何逻辑。写错 import(比如拼错包名)会导致编译失败,但修复后无需重启 JVM —— 因为它根本没动运行时环境。










