☕ 第一章 Java开发入门

1.3 第一个Java程序

📄 一句话概括

用记事本写 5 行代码 → javac 编译成字节码 → java 运行,屏幕打出 Hello World!。三步走完,你就完成了程序员界的成人礼,而且每一步都能对上前面学过的理论。

⚠️ 本节最容易死在两个"非 Java"的坑上

① Windows 默认不显示文件扩展名,保存出来的是 HelloWorld.java.txt;② 记事本的编码和 javac 默认编码不一致,中文注释导致编译报错。两个坑的解法都在正文里,先看完再动手。


1. 先看代码长什么样(解剖)

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

只有 5 行,每个部位都有讲究:

部位 作用 大白话
public class HelloWorld 类:Java 代码必须住在类这个"大房子"里 全部代码的家门口挂牌
main 方法 程序唯一入口 CPU 的书签(06 篇)从这里开始取指
System.out.println(...) 输出语句 往屏幕打印一行字,然后换行
{ } 花括号 房间的门,必须成对出现
每句话结尾的 ; 分号 一句话说完的句号,必须是英文的
❗ 现在不用背,抄就行

第 2 行 public static void main(String[] args) 这串咒语,前三章你只需要会抄、会认——它每个词的含义(public/static/void/String[])要等第三章"方法"和第五章"面向对象"才能全懂。程序员都是先抄后懂的。

📝 两个铁规则,违反必报错
  1. 文件名必须和 public 类名一模一样(含大小写):类叫 HelloWorld,文件就必须叫 HelloWorld.java
  2. Java 严格区分大小写:System 写成 system、String 写成 string,立刻报错——这不是找茬,是编译器靠大小写区分身份

2. 动手第 0 步:让 Windows 显示文件扩展名

为什么是第 0 步:不干这个,你的文件会叫 HelloWorld.java.txt,编译器一看不是 .java 直接不认,而你在文件夹里根本看不出区别(都显示成 HelloWorld.java)。

  1. 打开文件资源管理器(Win + E)
  2. 点顶部菜单「查看」→「显示」→ 勾选「文件扩展名」(Win11);Win10 是:查看 → 勾选右侧「文件扩展名」
  3. 成功标志:随便找个文件,能看到 名字.后缀 了(比如 照片.jpg 带后缀)

3. 第一步:写代码(保姆式)

  1. 打开文件资源管理器,进 I 盘,新建文件夹 JavaCode,进去再建 day01(最终路径:I:\JavaCode\day01)
  2. 在 day01 空白处右键 → 新建 → 文本文档
  3. 双击打开(默认用记事本),原样抄第 1 节那 5 行——建议手抄,别复制:空格、大小写、标点的肌肉记忆从今天开始攒
  4. 抄完点「文件 → 保存」,弹出保存对话框:
  5. 保存位置:定位到 I:\JavaCode\day01
  6. 文件名输入:"HelloWorld.java" —— 前后双引号也要输入!这是防记事本自作主张加 .txt 的老办法
  7. 保存类型:选「所有文件(.)」
  8. 编码:选「UTF-8」(Win11 记事本默认就是 UTF-8,不用动)
  9. 点保存 → 回文件夹看一眼:文件名必须是 HelloWorld.java,图标不是记事本样式(是 Java 图标或白纸)才算对

4. 第二步:编译(菜谱 → 字节码)

  1. Win + R → 输入 cmd → 回车,开黑窗口
  2. 切换到代码文件夹。输入(/d 是跨盘符必需的): cd /d I:\JavaCode\day01
  3. 编译,输入: javac HelloWorld.java
  4. 看到什么算成功:什么都不显示,光标跳到下一行——Java 编译器的哲学是"没消息就是好消息"。再输入 dir 回车,文件夹里多了一个 HelloWorld.class → 这就是 1.1 篇说的字节码,你亲手造出来的第一份。
💡 中文注释报错了?看排错区情况 B

如果你在代码里写了中文(比如注释),javac 报 编码GBK的不可映射字符——这是 Windows 版 javac 默认按 GBK 解码、而你存的是 UTF-8 导致的。解法:改用 javac -encoding UTF-8 HelloWorld.java。


5. 第三步:运行(JVM 上场)

继续在同一个黑窗口,输入:

java HelloWorld

注意:不带 .class 后缀! 你递给 JVM 的是"类名"(找哪间房子),不是文件名。JVM 找到 HelloWorld.class,现场翻译成机器码,CPU 从 main 开始执行——屏幕打出:

Hello World!
✅ 成人礼完成

这行字 = 你的代码 → javac → 字节码 → JVM → CPU → 屏幕,整条链路(1.1 + 06 + 07 篇)全被你亲手跑通了一遍。

💡 彩蛋:其实可以一步跑

JDK 11 之后支持直接 java HelloWorld.java——编译运行一口气。但前几次请老老实实分两步:看得见 .class 文件,跨平台原理才不是纸上谈兵。等 1.4 装了 IDEA,按钮一按两步自动完成。


6. 排错专区:五种最常见的死法

情况 A:错误: 类 HelloWorld 是公共的, 应在名为 HelloWorld.java 的文件中声明

类名和文件名没对上。检查文件名是不是 HelloWorld.java(大小写也要对),代码里是不是 public class HelloWorld。

情况 B:错误: 编码GBK的不可映射字符

编码不一致(见第 4 步的 tip)。以后凡编译带中文的源码,固定用 javac -encoding UTF-8 文件名。

情况 C:错误: 需要';' 或一堆红叉

九成是中文标点:分号、引号、括号必须是英文的 ; " ",中文的 ;""() 全部不认。以及大小写:System、String 首字母大写,main、println 全小写。

情况 D:错误: 找不到文件: HelloWorld.java

cmd 不在代码文件夹里。重新 cd /d I:\JavaCode\day01,或先 dir 看当前目录里有没有这个文件——八成是文件存到别处了,或后缀还是 .txt(回第 2 步检查)。

情况 E:'javac' 不是内部或外部命令

环境变量问题,回 1.2 排错专区情况 A。注意:改完环境变量必须重开 cmd。

📝 修改代码后必须重新编译

改了 .java 不重新 javac,运行的还是旧字节码——"我明明改了为什么没生效"是新手周经问题。记住:源码和字节码是两个文件,改前者要重造后者。


7. 常见误区

⚠️ 误区 1:运行时输入 java HelloWorld.class

不行。java 命令后面跟的是类名,JVM 自己会去找 HelloWorld.class 文件。带后缀反而报错。

⚠️ 误区 2:把 HelloWorld.class 发给朋友,他也得装 JDK?

他只需要装 JRE/JVM 就能运行(不需要 javac 编译器)——这就是 1.1 篇"一次编译、到处运行"的落地:你发字节码,各平台的 JVM 负责翻译。

⚠️ 误区 3:代码里空格缩进必须像我这样?

缩进(每行前面的空格)只是给人看的,编译器不在乎。但单词中间不能断开(Hello World 不能写成 HelloWorld 的两半)。按教程的缩进抄,是为了养成好看的习惯。

⚠️ 误区 4:文件名随意起?

public 类名 = 文件名,这条没有商量余地。另外行业惯例:类名用大驼峰(每个单词首字母大写,如 HelloWorld、MyFirstApp)。

⚠️ 误区 5:Hello World 打出来就算学会了?

这 5 行的意义不在"会写",在于看懂整条链路:菜谱(源码)→ 翻译(javac)→ 中间语(字节码)→ 随身翻译官(JVM)→ 执行(CPU)。自测题 Q3、Q4 考的就是这条链。


8. 本节自测

❓ Q1:`javac HelloWorld.java` 成功后,文件夹里多了什么?它是谁造的?

HelloWorld.class——字节码文件,javac 编译器造的。它不是任何系统的机器码,是给 JVM 看的"中间语"(1.1 篇)。

❓ Q2:运行时为什么要输 `java HelloWorld` 而不是 `java HelloWorld.class`?

java 命令的参数是类名,JVM 根据类名自己去定位并加载 .class 文件。带后缀它会去找一个叫"HelloWorld.class"的类,找不到,报错。

❓ Q3:CPU 从这 5 行代码的哪里开始执行?

main 方法第一句——它是程序唯一入口,对应 06 篇的机制:JVM 加载类后,把程序计数器(书签)指向 main 的第一条指令。

❓ Q4:把这行代码在 Windows 编译出的 `.class` 拷到 Mac 上能直接跑吗?

能。字节码跨平台通用,Mac 的 JVM 负责翻译成 Mac 的机器码。但 .exe(Windows 机器码)不行——这正是 Java 和 C 程序发布方式的根本区别。

❓ Q5:改了源码重新运行,输出没变,最可能的原因?

忘了重新 javac,跑的还是旧字节码。源码 → 字节码是两个独立文件,改前者必须重造后者。


9. 下一步学什么


10. 相关笔记

Java基础 #Java入门 #HelloWorld #编译运行 #第一章