这是 Java 入门系列的第一天。这一篇解决三个问题:计算机软硬件的基本常识、Java 凭什么”一次编写,到处运行”,以及如何亲手把第一个 Hello World 从源代码变成屏幕上的一行输出。

本篇目标

  • 了解计算机硬件的五大部件与软件分类,建立”程序跑在哪里”的直觉
  • 讲透 JDK、JRE、JVM 三者的关系与跨平台原理
  • 理解 Path、JAVA_HOME 环境变量背后的原理,而不是照抄配置步骤
  • 完整走通”编写 → 编译 → 运行”Hello World 的全流程,并能排查常见错误

先懂一点计算机常识

计算机由硬件和软件组成,没装任何软件的机器称为”裸机”。硬件按冯·诺依曼体系结构分为五大部件:

  • 运算器 + 控制器:合称 CPU,是计算机的核心。运算器做算术与逻辑运算,控制器负责取指令、译码并发出控制命令,CPU 内部还有高速寄存器暂存数据。
  • 存储器:分内存与外存。内存(RAM)速度快、容量小、断电即失,用于存放正在执行的程序和数据;外存(硬盘、SSD)相反,用于长期保存。程序必须先装入内存才能被 CPU 执行——这解释了为什么”内存大小”直接影响电脑的流畅度。
  • 输入设备 / 输出设备:键盘、鼠标、显示器等,统称 I/O 设备。

软件分两类:系统软件(Windows、Linux、macOS、Android)负责管理硬件资源;应用软件(QQ、浏览器)面向具体需求。所谓软件开发,就是借助计算机语言,把人的意图翻译成机器能执行的指令序列。

从机器语言到 Java

计算机语言经历了三个阶段:

  1. 机器语言:直接用 0 和 1 组成的指令,CPU 能执行,人几乎无法读写。
  2. 汇编语言:用助记符(如 ADD、MOV)代替二进制串,需要汇编器翻译成机器码,仍然贴近硬件。
  3. 高级语言:用接近英语的语法写源代码,由编译器或解释器翻译成机器指令。C、C++、Java、Python 都在此列。

Java 由 Sun 公司的 James Gosling 团队在 1995 年正式推出(前身是 1990 年”绿色计划”中的 Oak 语言),2009 年 Sun 被 Oracle 收购后由 Oracle 继续维护。它的设计目标就是简单、面向对象、跨平台。

跨平台的秘密:JVM

“Write once, run anywhere” 是 Java 最著名的口号。它的原理是:Java 源码不直接编译成某个平台的机器码,而是编译成一种中间格式——字节码(.class 文件),再由各平台上的 Java 虚拟机(JVM)把字节码翻译成本机指令执行。

换句话说,跨平台的不是 Java 程序本身,而是 JVM:Windows、Linux、macOS 各自安装自己的 JVM,字节码不变,运行效果一致。JVM 充当了程序与操作系统之间的”翻译官”,把平台差异全部屏蔽掉了。

JDK、JRE、JVM 的关系

三者是层层包含的关系:

  • JVM:运行字节码的虚拟机,跨平台的核心。
  • JRE = JVM + 核心类库。只想运行别人开发好的 Java 程序,装 JRE 就够。
  • JDK = JRE + 开发工具。开发工具包括编译器 javac、打包工具 jar、文档工具 javadoc 等。

为什么 JDK 里要自带一个 JRE?因为开发者写完程序总要运行验证。所以安装了 JDK 就不必单独安装 JRE。顺带一提:从 JDK 9 引入模块化之后,JDK 安装目录里不再有独立的 jre 子目录,运行时被整合进模块系统;需要精简运行镜像时可以用 jlink 自行裁剪。

下载、安装与验证

学习阶段建议安装长期支持版(LTS),如 JDK 17 或 JDK 21,可从 Oracle 官网或 Adoptium 等开源发行版下载。安装时有两条老规矩依然有效:路径不要包含中文和空格;所有开发软件放在统一目录下,便于管理。

装完后打开命令行验证:

java -version
javac -version

两条命令都能输出版本号,说明安装与配置成功。

环境变量为什么这样配

很多教程只告诉你”点哪里”,这里讲清楚为什么。

Path 的原理:在命令行输入一个命令(如 javac)时,操作系统先在当前目录查找,找不到就按 Path 里配置的目录列表依次搜索。把 JDK 的 bin 目录加进 Path,本质是把 javac、java 等工具的位置告诉系统,这样在任何目录下都能使用它们——也就不用把源代码文件混进 JDK 的安装目录,避免误删工具或污染 JDK。

JAVA_HOME 的约定:单独建一个 JAVA_HOME 指向 JDK 根目录,再在 Path 里写 %JAVA_HOME%\bin(macOS/Linux 写 $JAVA_HOME/bin)。好处有二:一是 JDK 升级时只需改 JAVA_HOME 一处;二是 Maven、Tomcat 等大量第三方工具默认读取 JAVA_HOME 来定位 JDK。注意 Path 中的条目有先后顺序,系统取第一个匹配项,机器上装了多个 JDK 时,要把想用的版本排在前面。

classpath 不需要配:早期教程常让配置 classpath 指定 .class 文件的搜索路径,从 JDK 5 起类加载器默认就会搜索当前目录,乱配 classpath 反而是新手”找不到或无法加载主类”报错的常见根源。

Hello World 全流程

新建文件 HelloWorld.java。注意文件名必须与 public 类名完全一致;Windows 默认隐藏扩展名,要防止存成 HelloWorld.java.txt:

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

在命令行进入文件所在目录,执行两步:

javac HelloWorld.java   # 编译:生成 HelloWorld.class 字节码文件
java HelloWorld # 运行:启动 JVM,加载 HelloWorld 类,执行 main 方法

逐行拆解这段代码:

  • public class HelloWorld:定义一个公开类,类是 Java 程序的基本组织单位。
  • public static void main(String[] args):程序入口。public 保证 JVM 能访问,static 让 JVM 不用创建对象就能调用,void 表示没有返回值,String[] args 接收命令行参数。这一行是 JVM 与程序员之间的固定契约,一个单词都不能错。
  • System.out.println(...):调用标准输出,打印一行文本并换行。

新手常见错误几乎集中在几处:把 class、String、System、main 写错大小写(Java 严格区分大小写);中英文标点混用(分号、引号必须是英文符号);大括号不配对;运行时多写了后缀(java HelloWorld.class 是错的)。

注释、关键字与标识符

注释是写给人看的,编译器直接忽略,用来解释代码、辅助调试:

// 单行注释

/*
* 多行注释
*/

/**
* 文档注释,可被 javadoc 提取生成 API 文档
*/
public class CommentDemo {
}

关键字是被 Java 赋予特定含义的单词(如 class、public、static),全部小写,不能用作名字;goto 和 const 是保留字,目前未启用。标识符是给类、方法、变量起名的字符序列,规则是:由字母、数字、$、_ 组成,不能以数字开头,不能使用关键字。

约定俗成的命名规范(语法不强制,但必须遵守,否则别人读不懂你的代码):

  • 包名:全部小写,常用域名倒写,如 com.example.demo
  • 类名:大驼峰,如 HelloWorld、StudentService
  • 方法与变量:小驼峰,如 getName、studentAge
  • 常量:全大写加下划线,如 MAX_VALUE

关于开发工具

第一天先用记事本加命令行是有意义的:亲手敲 javac 和 java,才能理解编译与运行是两个独立阶段,出了问题知道去哪一层排查。但日常开发请直接使用 IDE——目前业界主流是 IntelliJ IDEA(社区版免费),它在代码提示、重构、调试上的体验远超当年的 Eclipse。等命令行流程跑通之后,就果断切换到 IDEA。

小结

  • 计算机 = 硬件(五大部件)+ 软件;程序必须装入内存才能运行。
  • Java 跨平台靠 JVM:源码编译为字节码,各平台的 JVM 负责翻译执行。
  • JDK = JRE + 开发工具,JRE = JVM + 核心类库,装 JDK 即可覆盖一切。
  • Path 让系统在任何目录找到 javac/java;JAVA_HOME 便于升级和第三方工具引用;classpath 不需要配置。
  • Hello World 三步走:写 .java → javac 编译出 .class → java 启动 JVM 执行 main。
  • 命名遵守驼峰规范,注释写给人看;入门用命令行,之后切换到 IntelliJ IDEA。