第一章 初识 Java
Java 程序的运行依赖于四个核心组成部分的协同工作:Java 语言规范、Java 编译器(javac)、Java 虚拟机(JVM)和 Java 类库。这四者共同构成 Java 平台的基础架构,确保程序从源代码到执行的完整生命周期得以实现。
一、Java 语言规范
Java 语言的行为由《Java Language Specification》(JLS)明确定义。该规范是 Java 语言的权威技术文档,规定了语法结构、类型系统、语义规则和语言特性的具体行为。
JLS 定义了类(class)、接口(interface)、枚举(enum)等类型声明的语法格式;规定了访问控制、继承、多态、异常处理等机制的语义;明确了 synchronized 的内存可见性规则、volatile 的有序性保证、@Override 的编译时检查条件等细节。
所有 Java 编译器必须遵循 JLS 的规定,确保不同实现对同一源代码的解析和编译结果一致。开发者编写的 .java 源文件,是该规范约束下的合法语法实例。
二、Java 编译器(javac)
javac 是 Java 的官方编译器,负责将符合 JLS 的源代码转换为 JVM 可执行的字节码。
其主要功能包括:
- 词法分析与语法分析,生成抽象语法树(AST);
- 语义分析,进行类型检查、作用域解析、重载决议等;
- 语法糖消除,将高级语言结构转换为等价的底层实现;
- 字节码生成,输出符合《Java Virtual Machine Specification》的
.class文件。
语法糖消除的典型示例:
- 泛型:在编译期进行类型擦除(Type Erasure),将
List<String>转换为原始类型List,并插入必要的类型转换指令; - Lambda 表达式:转换为
invokedynamic指令调用,结合LambdaMetafactory生成实现类; - 字符串拼接:在 JDK 8 及之前版本中,
"Hello " + name被转换为StringBuilder的append调用序列; - 自动装箱/拆箱:
Integer i = 1;被转换为Integer.valueOf(1)调用。
javac 的输出是 .class 文件,其内容为 JVM 定义的字节码指令、常量池、字段与方法元数据。该文件不包含平台相关机器码,是一种与平台无关的中间表示(IR),为跨平台执行提供基础。
三、Java 类库
Java 类库是 Java 平台提供的标准 API 集合,涵盖基本类型包装、集合框架、I/O、并发、网络等核心功能。主要包包括 java.lang、java.util、java.io、java.nio、java.util.concurrent 等。
这些类库的实现本身使用 Java 语言编写,体现了 Java 平台的“自举”(Bootstrap)特性。即 Java 运行环境的核心组件由 Java 语言自身构建,无需依赖其他编程语言。
在 JDK 8 及之前版本中,核心类库的 .class 文件打包在 rt.jar 中,由 JVM 在启动时加载。自 JDK 9 引入模块系统(JPMS)后,类库被拆分为多个模块,存储于 jmods 目录,并通过模块路径进行管理。
Java 类库通过 ClassLoader 机制加载到 JVM 中,为应用程序提供统一的、可复用的编程接口。其设计遵循面向对象原则,支持封装、继承与多态,是构建 Java 应用程序的基础组件。
四、Java 虚拟机(JVM)
JVM 是 Java 平台的运行时引擎,负责加载、验证、执行 .class 文件,并管理内存、线程与安全。
JVM 的行为由《Java Virtual Machine Specification》(JVMS)定义。该规范规定了:
.class文件的二进制格式;- 字节码指令集与操作语义;
- 运行时数据区的结构(堆、栈、方法区等);
- 类加载、链接与初始化机制;
- 垃圾回收与内存管理模型;
- 多线程与内存模型(Java Memory Model, JMM)。
JVM 实现(如 HotSpot)将字节码解释执行或通过即时编译器(JIT)转换为本地机器码,实现高性能运行。它屏蔽了底层操作系统与硬件的差异,确保 “Write Once, Run Anywhere” 的跨平台能力。