社交媒体

Java 是怎么跑起来的?

Java 是怎么跑起来的?

钩子

环境配好了,今天写第一个程序。但在你敲下第一行代码之前,先想一个问题:

你写的是 Hello.java,可 CPU 从头到尾没见过这个文件。

CPU 只认机器指令,而 Java 的设计者在这中间加了两道工序。搞懂这两道工序,你以后 80% 的"程序跑不起来"都能自己解决。

01 第一个程序,五行代码

新建一个文本文件,改名(注意连扩展名一起改)为 Hello.java,写入:

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

先别管每个词什么意思(第 5 篇专门拆),今天只关注它怎么跑起来。

02 两步走:先编译,再运行

打开 CMD,cd 到 Hello.java 所在目录,敲两条命令:

javac Hello.java
java Hello

第一条是编译:javac 检查你的代码有没有写错,没错就生成一个新文件 Hello.class。看一眼你的文件夹——多出来的这个文件,就是传说中的字节码。

第二条是运行:java 命令启动 JVM,把字节码翻译成当前系统的机器指令交给 CPU。屏幕上打出 Hello, Java!。

image-KzWz.png

注意一个细节:第二条命令是 java Hello,不是 java Hello.class。 带了后缀反而报错——这是新手高频坑,第 6 篇会专门盘点。

03 全链路:从你的手到 CPU

03-从源码到输出全链路图.png

串起来就是:你写源码 → javac 编译成字节码 → JVM 翻译成机器指令 → CPU 执行 → 屏幕输出。

为什么中间要隔一道字节码?还记得第 1 篇吗——同一个 Hello.class,拷到 Linux、Mac 上照样跑,因为每台机器装的 JVM 不一样,但对外接口一样。字节码是 JVM 的"普通话",JVM 负责翻译成各地方言(机器指令)。

这就是"一次编译,到处运行"的全部真相。Python 那种写完直接跑的叫解释型,Java 这种先编译再靠 JVM 跑的叫编译+解释混合——没有谁绝对更好,只是取舍不同。

04 三个高频报错,先混个脸熟

错误 1:类名和文件名不一致

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

文件存成了 hello.java 或 Test.java,只要类名是 public class Hello,文件必须叫 Hello.java——大小写也得一致。

错误 2:找不到或无法加载主类

错误: 找不到或无法加载主类 Hello

两种可能:命令带了 .class 后缀;或者当前目录不对(你人在 C 盘,文件在桌面)。

错误 3:找不到符号

错误: 找不到符号
  符号:   变量 system

system 和 System 是两个东西。Java 严格区分大小写,string 和 String 也一样。

这三个错今天混个脸熟就行,第 6 篇会把 10 个新手报错连人话翻译一起盘点。


橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。