Java 入门(00):环境搭建、语法基础与第一个程序
更新时间:2026-08-31。本文是
languages/java/beginner/入门层第 0 篇。零基础也能跟着做,目标是跑通第一个 Java 程序,并理解 Java "一次编写、到处运行" 的背后机制。后续衔接 Java 并发编程与 JUC 与 JVM 内存模型。
一、先搞清楚:Java 是什么、为什么本站讲它
Java 是 Sun 公司 1995 年发布的静态类型、面向对象语言,主打"跨平台 + 自动内存管理(GC)+ 庞大的企业生态"。本站主线是 Linux 性能剖析与底层原理,Java 是其中一条重要的应用侧主线——它的并发工具、JVM 内存模型、GC 调优,正好能把 L4 内存序 和 crash 排查线 里的概念搬到"企业后端每天要面对的规模"里验证。
读这篇之前,如果你已经看过本站 C 语言入门,会感觉 Java 很"安全"——没有指针、数组自动越界检查、内存由 GC 管。这种差异正是 Java 的设计取舍,后面会反复提到。
二、安装 JDK 并验证
JDK(Java Development Kit,Java 开发工具包) 包含编译器 javac、运行时 java 和一整套类库,是写 Java 的必需品。安装方式:
# Debian/Ubuntu
sudo apt install openjdk-17-jdk
# 验证
java -version
javac -version装好后通常要把 JAVA_HOME 配进环境变量(IDE 和构建工具都靠它找 JDK):
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH验证输出示例
$ java -version
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.8+7-Ubuntu, mixed mode, sharing)看到版本信息就说明环境 OK。为什么需要 JDK 而不是只装运行时:只有 java(JRE 运行时)没法编译,javac 才是编译器。后面要学的构建工具 Maven/Gradle 也都基于 JDK。
三、第一个程序:编译 → 运行
写一个经典 Hello World,文件必须叫 HelloWorld.java(类名与文件名一致是 Java 的硬规则):
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}编译运行:
javac HelloWorld.java # 产出 HelloWorld.class 字节码
java HelloWorld # 运行,输出 Hello, Java!输出说明
$ java HelloWorld
Hello, Java!注意 java HelloWorld 后面不带 .class 后缀,也不带 .java——这是新手最常见的坑。javac 会生成 HelloWorld.class,里面是字节码(bytecode),不是机器码。
四、理解 Java 的核心机制:编译一次、到处运行
上面两步拆开做是有原因的,看这张图:
字节码是 Java 的中间表示——既不是人能读的源码,也不是机器能直接执行的机器码,而是给 JVM(Java Virtual Machine,Java 虚拟机)看的"虚拟机指令"。JVM 在各平台上都有对应实现,所以同一份 .class 文件能换平台直接跑,这就是"一次编写、到处运行"的真相。
java HelloWorld 启动 JVM 后,JVM 逐条解释字节码,热点代码还会被 JIT(Just-In-Time,即时编译) 编译成机器码加速——这个"解释执行 + 热点编译"的混合模式,是 JVM 性能的关键,也是 JVM 内存模型 里反复出现的背景。
对比本站 C 语言:C 的
gcc hello.c -o hello直接产出当前平台的机器码,换个 CPU/系统就得重新编译;Java 多了一道字节码抽象层,换来跨平台,代价是运行时要靠 JVM 解释/JIT,启动和预热需要时间。两种取舍没有优劣,看场景选。
五、Java 基础语法:类、方法、变量
Java 是"一切皆对象"的强类型语言,最小的可运行单位就是类。四个最基础的概念先立住:
| 概念 | 作用 | 示例 |
|---|---|---|
| 类(class) | 代码的基本组织单元,一个文件通常一个类 | public class HelloWorld |
| main 方法 | 程序入口,JVM 从这里开始执行 | public static void main(String[] args) |
| 变量 | 存数据的容器,有类型约束 | int count = 42; |
| 方法 | 类的行为,函数在 Java 里的叫法 | static int add(int a, int b) { return a + b; } |
一个包含变量的例子:
public class Demo {
public static void main(String[] args) {
int count = 42; // 基本类型:int
double price = 19.99; // 基本类型:double
String name = "codebuddy"; // 引用类型:String
System.out.println(name + ": " + count);
System.out.println("价格 " + price);
}
}运行输出
$ java Demo
codebuddy: 42
价格 19.99Java 的类型分两大类:基本类型(int/double/boolean 等,存值,栈上)和引用类型(String/数组/自定义类,存地址,堆上)。这个"值 vs 引用"的区分,是理解 JVM 内存模型 的第一块砖。
六、面向对象最小模型:类与对象
Java 的面向对象比 C++ 更"纯粹"——没有全局函数,一切函数都属于类。最小模型三步:
// 1. 定义类:属性 + 方法
class Counter {
private int value = 0; // 私有属性:外部不能直接改
public void increment() { // 公开方法:提供受控修改入口
value++;
}
public int getValue() { // 读值也要走方法(封装)
return value;
}
}
public class OopDemo {
public static void main(String[] args) {
Counter c = new Counter(); // 2. new 出对象(分配在堆上)
c.increment();
c.increment();
System.out.println(c.getValue()); // 3. 通过方法操作对象
}
}运行输出
$ java OopDemo
2这里已经出现了面向对象的三大特征之一——封装(private 属性 + 公开方法,外部只能通过方法访问)。另外两大特征(继承、多态)在 Java 并发编程 之前其实不用急着背,先把"类-对象-方法"跑顺,后面的并发、Stream、GC 全是在这个地基上盖楼。
七、常见坑与排查
| 报错/现象 | 原因 | 解法 |
|---|---|---|
错误: 找不到或无法加载主类 | java 后面多写了 .class | 去掉后缀:java HelloWorld |
类 HelloWorld 是公共的,应在名为 HelloWorld.java 的文件中声明 | 类名与文件名不一致 | 类名与文件名必须完全一致 |
javac: 找不到文件 | 当前目录不对 | ls 确认 .java 文件存在 |
| 中文输出乱码 | 文件编码不是 UTF-8 | 保存为 UTF-8,javac -encoding UTF-8 |
一句话:Java 先用 JDK 装好工具链,javac 把源码编译成平台无关的字节码、JVM 跨平台执行(热点靠 JIT 加速),类/方法/变量的基础语法和"封装优先"的面向对象最小模型,就是后续并发与 JVM 深挖的地基。