1.1 Java 是什么:一次编写,到处运行
先搞清 JVM 这件事,后面所有"为什么"都跟它有关。
Java 程序不直接跑在操作系统上,而是跑在 JVM(Java 虚拟机)上。
源代码先编译成字节码(.class 文件),再由 JVM 解释/编译执行。
同一份字节码,Windows、Linux、macOS 上只要有对应的 JVM 就能跑——这就是"一次编写,到处运行"。
源文件 Hello.java ──javac 编译──▶ 字节码 Hello.class ──java 运行──▶ JVM 执行
↑
不同系统装各自的 JVM,同一份 .class 都能跑
对比 C++:C++ 编译生成的是「具体平台的机器码」,Windows 编出来的 exe 在 Linux 上跑不了。
三个容易混的名词
| 名词 | 全称 | 是什么 | 你要不要装 |
|---|---|---|---|
| JVM | Java Virtual Machine | 执行字节码的虚拟机("跑步的场地") | 不单独装,随 JDK/JRE 附带 |
| JRE | Java Runtime Environment | JVM + 运行所需类库("能跑 Java 程序") | 只想运行别人写的程序时装它 |
| JDK | Java Development Kit | JRE + 编译器 javac + 调试等工具("能开发") | 写代码必须装 JDK |
易错
- 只装了 JRE 就敲
javac会报"不是内部或外部命令"——编译需要 JDK。 - 装完 JDK 还要配环境变量(
JAVA_HOME指向 JDK 目录,Path里加%JAVA_HOME%\bin),否则命令行找不到 javac。
1.2 第一个 Java 程序:逐行看懂
别急着抄,每一行都有讲究。
// 文件名必须叫 Hello.java(与 public 类名一致)
public class Hello { // ① 类声明:public class 类名
public static void main(String[] args) { // ② main 方法:程序的入口
System.out.println("Hello, Java!"); // ③ 输出语句,末尾要有分号
}
}
| 行 | 含义 | 规矩 |
|---|---|---|
① public class Hello | 定义一个公开的类 | 文件名必须和 public 类名完全一样(含大小写) |
② main 方法 | JVM 从这里开始执行 | 写法固定:public static void main(String[] args) |
③ println | 打印并换行(print 不换行) | 每条语句以 ; 结尾 |
编译与运行(命令行)
# 在 Hello.java 所在目录执行 javac Hello.java # 编译 → 生成 Hello.class(不报错就成功) java Hello # 运行 → 输出 Hello, Java! # 注意:运行时写「类名」,不要加 .class 后缀
新手三大报错
- 类名与文件名不一致 →
类 Hello 是公共的,应在名为 Hello.java 的文件中声明。 - 运行时加了后缀 →
java Hello.class会报"找不到或无法加载主类"。 - 中文乱码 → 源文件编码与 javac 默认编码不一致,用
javac -encoding UTF-8 Hello.java。
不想装环境也能练:本站有 Java 在线运行环境,代码粘进去直接编译运行。
课堂练习(3 题)
- JVM、JRE、JDK 三者是什么关系? 答:JDK ⊃ JRE ⊃ JVM。JDK 用于开发(含编译器 javac),JRE 用于运行,JVM 是执行字节码的虚拟机。
- 文件名为
Demo.java,里面的类应该怎么写? 答:public class Demo { ... }(public 类名必须与文件名一致)。 - 写出打印一行 "你好" 到控制台的完整语句。
答:
System.out.println("你好");
1.3 Java 与 C++ 的第一眼区别(C++ 转 Java 必看)
你有 C++ 基础,这张表能帮你少踩一半坑。
| 方面 | C++ | Java |
|---|---|---|
| 编译产物 | 平台相关的机器码(exe) | 字节码(.class),跨平台 |
| 内存管理 | 手动 new/delete | 垃圾回收 GC,不用手动释放 |
| 指针 | 有指针、可直接操作地址 | 没有指针,只有引用 |
| 多继承 | 类可以多继承 | 类只能单继承,但可实现多个接口 |
| 头文件 | #include | 无头文件,用 import 导入包 |
| 入口函数 | int main(),可返回值 | public static void main(String[] args),必须写在类里 |
| 字符串比较 | == 比较内容 | == 比地址,equals 比内容(第 5 章详讲) |
一句话记忆
- C++ 让你管机器,Java 让你管逻辑——少了指针和手动内存,代价是少了底层控制权、多了 JVM 一层开销。
课堂练习(2 题)
- Java 里为什么没有
delete? 答:对象不再被引用时由垃圾回收器(GC)自动回收内存,不需要也不能手动释放。 - Java 类能不能同时继承两个类? 答:不能,类只支持单继承;需要多重能力时用"实现多个接口"。
1.4 注释、包与编码规范
写给人看的部分,同样算分(考试和工作都看这个)。
// 单行注释
/*
多行注释
*/
/**
* 文档注释:可用 javadoc 生成 API 文档
* @param args 命令行参数
*/
package com.example.demo; // 声明包(必须在文件首行,分号结尾)
import java.util.Scanner; // 导入别人写好的类
public class Main { ... }
- 包名一般全小写、用域名倒写(
com.example.demo),对应磁盘上的目录结构。 - 类名:大驼峰
StudentInfo;方法/变量名:小驼峰getScore;常量:全大写MAX_SIZE。 import只是"省略写全名"的糖,不会把代码复制进来;java.lang包(String、System、Math 等)自动导入,不用写 import。
课堂练习(2 题)
- 下面哪个是合法的 Java 标识符:
2name、_age、class、my-name? 答:只有_age。2name数字开头不行,class是关键字,my-name含减号(会被当减号运算符)。 - 单行注释和多行注释的写法分别是什么?
答:单行
// ...;多行/* ... */。文档注释为/** ... */。