Java · 第 1 章

第 1 章 Java 概述与环境

JVM/JRE/JDK 三者关系;第一个 Java 程序逐行讲解;javac/java 编译运行与三大新手报错;Java 与 C++ 的关键区别对照表。

1.1 Java 是什么:一次编写,到处运行

Java 从源码到运行的流程图
图 1-1 源码 → javac 编译 → 字节码 → JVM 类加载 → 解释/JIT → 机器码

先搞清 JVM 这件事,后面所有"为什么"都跟它有关。

Java 程序不直接跑在操作系统上,而是跑在 JVM(Java 虚拟机)上。 源代码先编译成字节码(.class 文件),再由 JVM 解释/编译执行。 同一份字节码,Windows、Linux、macOS 上只要有对应的 JVM 就能跑——这就是"一次编写,到处运行"。

  源文件  Hello.java   ──javac 编译──▶  字节码  Hello.class   ──java 运行──▶  JVM 执行
                                                                      ↑
                                                        不同系统装各自的 JVM,同一份 .class 都能跑

  对比 C++:C++ 编译生成的是「具体平台的机器码」,Windows 编出来的 exe 在 Linux 上跑不了。
三个容易混的名词
名词全称是什么你要不要装
JVMJava Virtual Machine执行字节码的虚拟机("跑步的场地")不单独装,随 JDK/JRE 附带
JREJava Runtime EnvironmentJVM + 运行所需类库("能跑 Java 程序")只想运行别人写的程序时装它
JDKJava Development KitJRE + 编译器 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 题)
  1. JVM、JRE、JDK 三者是什么关系? 答:JDK ⊃ JRE ⊃ JVM。JDK 用于开发(含编译器 javac),JRE 用于运行,JVM 是执行字节码的虚拟机。
  2. 文件名为 Demo.java,里面的类应该怎么写? 答:public class Demo { ... }(public 类名必须与文件名一致)。
  3. 写出打印一行 "你好" 到控制台的完整语句。 答: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 题)
  1. Java 里为什么没有 delete? 答:对象不再被引用时由垃圾回收器(GC)自动回收内存,不需要也不能手动释放。
  2. 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 题)
  1. 下面哪个是合法的 Java 标识符:2name、_age、class、my-name? 答:只有 _age。2name 数字开头不行,class 是关键字,my-name 含减号(会被当减号运算符)。
  2. 单行注释和多行注释的写法分别是什么? 答:单行 // ...;多行 /* ... */。文档注释为 /** ... */。