Java 入门笔记:Hello World、跨平台原理与 JDK

刚开始学习 Java,先从第一个 HelloWorld 程序入手,再了解 Java SE、Java ME、Java EE,以及 JVM、JRE、JDK 这些常见概念。把代码怎样编译、怎样运行弄明白,后面学习 Java 语法会更有头绪。

第一个 Hello World 程序

首先安装 JDK,这里使用 JDK 21。在一个空白目录下创建 HelloWorld.java 文件,输入以下代码:

java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("HelloWorld");
    }
}

Java 区分大小写。这里的类名是 HelloWorld,文件名也必须是 HelloWorld.java;括号、分号等符号则要使用英文字符。

在文件所在目录打开终端,先编译,再运行:

Shell
# 编译源代码
PS D:\Code\Java> javac HelloWorld.java
# 运行编译后的 HelloWorld 类,不需要写 .class 后缀
PS D:\Code\Java> java HelloWorld
HelloWorld

javac HelloWorld.java 会将源代码编译为 Java 字节码。编译成功时,终端通常没有输出,但目录里会多出一个 HelloWorld.class 文件。

接着执行 java HelloWorld,Java 就会加载并运行这个类,在控制台输出 HelloWorld。注意两条命令的区别:编译时写源文件名 HelloWorld.java,运行时写类名 HelloWorld,不需要加 .class 后缀。

代码中的 main 是程序的入口方法,System.out.println() 用来向控制台输出内容并换行。至于 public、static、void 等关键字,后面学习 Java 基础语法时再逐步理解。

Java 平台的不同版本

学习 Java 时,经常会遇到 Java SE、Java ME、Java EE 这三个名称。它们主要面向不同的应用场景。

名称全称主要用途
Java SEJava Platform, Standard EditionJava 语言和标准类库的基础平台
Java MEJava Platform, Micro Edition资源受限设备、早期移动设备及部分嵌入式场景
Java EEJava Platform, Enterprise Edition企业级应用和 Web 服务相关的技术规范,后来发展为 Jakarta EE

Java SE 是我们目前学习的重点,包含 Java 语言、集合、I/O、网络等基础知识。无论以后开发桌面程序还是后端服务,这些都是常用的基础能力。

Java ME 主要面向资源比较有限的设备,早期的功能手机是它比较典型的应用场景。

Java EE 主要涉及企业级 Java 应用,包括 Web 开发、服务端组件等。后来相关规范移交给 Eclipse 基金会,继续以 Jakarta EE 的名称发展。学习 Java 后端时还会经常接触 Spring、Spring Boot 等框架,这些是 Java 生态中的另一类常用技术。

现阶段先把 Java SE 学好,再根据后续方向接触相应的框架和技术即可。

Java 的主要特性

Java 的常见特点包括面向对象、跨平台、多线程支持、丰富的标准类库以及自动垃圾回收。它还有以 OpenJDK 为代表的开源实现和比较成熟的开发生态。

其中,跨平台是 Java 很有代表性的特点,也与后面要介绍的 JVM 密切相关。

Java 为什么能够跨平台?

C/C++:编译为目标平台的机器码

C、C++ 通常会提前编译成目标平台可以执行的机器码,再由 CPU 执行。

例如,同一份 C/C++ 源代码要运行在 x86 和 ARM 两种处理器架构上,一般需要分别编译成适合对应架构的程序。不同操作系统也可能有不同的可执行文件格式和系统接口要求。

C/C++ 源代码
x86 目标编译
x86 机器码
x86 平台运行
ARM 目标编译
ARM 机器码
ARM 平台运行

Python:通过解释器运行

Python 常被称为解释型语言。以常见的 CPython 实现为例,源代码会先编译成 Python 字节码,再由 Python 虚拟机执行。

Python 源代码.py
CPython编译
Python 字节码
Python 虚拟机执行

Java:先编译字节码,再交给 JVM

Java 的运行过程也有编译阶段,不过 javac 生成的 .class 文件包含的是 Java 字节码,不是直接交给特定 CPU 执行的机器码。

运行程序时,JVM(Java 虚拟机)负责加载和执行字节码。Windows、Linux、macOS 都有各自对应的 JVM 实现,因此同一份 Java 字节码可以在不同平台上运行。

Java 源代码.java
javac编译
Java 字节码.class
Windows JVM
Windows 运行
Linux JVM
Linux 运行
macOS JVM
macOS 运行

JVM 也不只是逐条解释字节码。以常见的 HotSpot JVM 为例,它既可以解释执行,也可以通过 JIT(Just-In-Time,即时编译) 将频繁运行的代码编译为本地机器码,以提高执行效率。

所以,Java 的执行过程同时涉及编译和解释。我们常说的 “一次编译,到处运行”,靠的就是平台无关的字节码,以及不同平台上兼容的 JVM。程序如果使用了特定操作系统的功能或本地库,仍然需要考虑实际的运行环境。

JDK、JRE 和 JVM

运行第一个 HelloWorld 程序时,我们使用了 javac 和 java 两条命令。它们都由 JDK 提供。JDK、JRE 和 JVM 可以这样理解:

名称全称作用
JDKJava Development Kit开发工具包,包含编译、调试工具和运行 Java 所需的组件
JREJava Runtime Environment运行环境,包含 JVM、标准类库及其他运行组件
JVMJava Virtual MachineJava 虚拟机,负责加载和执行字节码

JDK:Java 开发工具包

JDK 是编写、编译和运行 Java 程序时使用的工具包。常见工具有:

  • javac:把 Java 源代码编译成字节码。
  • java:启动 Java 程序。
  • jar:创建和管理 JAR 文件。
  • jdb:调试 Java 程序。
  • jcmd:查看或诊断正在运行的 Java 进程。

除了工具,JDK 也提供 Java 标准类库。比如前面写过的 System.out.println():System 是标准类库中的类,out 是标准输出流,println() 则是输出内容的方法。

JRE:Java 运行环境

JRE 提供运行 Java 程序所需的环境,包括 JVM、标准类库和其他运行组件。运行一个已经编译好的 Java 程序,需要这些运行能力,不一定需要完整的开发工具。

JVM:Java 虚拟机

JVM 负责加载并执行 Java 字节码。它也是 Java 跨平台运行的重要一环:不同平台使用对应的 JVM,Java 程序则主要面向统一的字节码规范。

这三者的功能关系可以画成下面这样:

JDK开发工具包
开发工具javac · jar · jdb · jcmd
JRE运行环境
JVM执行字节码
标准类库集合、I/O、网络等
其他运行组件支持程序运行

如果安装过 JDK 8,可能见过其中的 jre 子目录。到了 JDK 21,JDK 采用模块化的运行时布局,通常已经没有独立的 jre 文件夹了,但运行 Java 程序需要的组件仍然包含在 JDK 中。

简单记住各自的分工就好:JDK 用于开发,JRE 表示运行环境,JVM 负责执行字节码。

谢谢你读到这里。 ✧

聊两句

评论审核后显示

有疑问、补充,或者想交流一下,都可以写在这里。

评论区将在滚动到这里时加载。