java.lang 是 Java 唯一自动导入的包,编译器隐式添加 import java.lang.*;,使 String、System、Object 等核心类无需显式导入即可使用;其他包如 java.util 必须显式导入。

因为 java.lang 是 Java 编译器唯一自动、隐式导入的包,这是语言层面的硬性规定,目的是让最基础的类开箱即用。
它是 Java 的“默认包”
Java 规范要求:每个源文件在编译时,编译器都会悄悄加上等效于 import java.lang.*; 的逻辑。你没写,但它就在那儿——就像空气一样存在。所以 String、System、Object、Math 这些类,直接用就行,不报错也不需声明。
设计初衷是简化核心开发
这些类支撑着 Java 程序运行的底层能力:
-
Object是所有类的父类 -
String处理文本,几乎每行代码都可能用到 -
System提供标准输入输出和系统属性访问 -
Integer、Boolean等包装类支持基本类型与对象转换
如果每次都要 import java.lang.String;,代码会变得冗长且毫无必要。
立即学习“Java免费学习笔记(深入)”;
其他包不享受这个待遇
除了 java.lang,所有其他包(比如 java.util、java.io、java.time)都必须显式导入,否则编译失败。即使你写了 import java.lang.*;,它也不会出错,但属于无效操作——纯属多此一举。
注意两个常见误解
• 不是所有“常用类”都免 import:比如 ArrayList(在 java.util)或 LocalDateTime(在 java.time),必须 import。
• 同包内的类也不靠 java.lang 特性:它们能直接用,是因为 Java 的包可见性规则(同一包内默认可访问),和 java.lang 的自动导入无关。



















