☰
Java零基础完整笔记:从JDK环境配置到语法与报错排查
2026/11/2 2:50:27 网站建设 项目流程

简介:韩顺平「循序渐进学Java零基础」完整笔记面向零编程基础、准备系统入门Java的在校学生与转行自学者,解决初学阶段知识点零散、缺少体系化梳理的问题。笔记按课程三阶段展开:基础语法、数据类型与控制结构,异常处理、多线程、I/O流与集合框架,以及数据库操作、网络编程与面向对象设计原则,并延伸至Java就业方向与SSM、Android、Hadoop等典型开发场景。资源包含1个文件,为单个pdf文档,约59.36MB,排版接近教材,含章节编号与目录,便于检索与打印。内容以知识点归纳和实例说明为主,理论结合实践,适合作为视频课程的配套复习材料与面试前的要点速查。目前已有2723人学习下载。

1. 拿到这份 Java 零基础完整笔记,先弄清楚它是怎么编排的

不少人拿到一份 Java 零基础完整笔记,第一反应是从第一页开始背,背到第二章讲 JVM 就卡住了,然后怀疑自己不适合写代码。这份《循序渐进学 Java 零基础》的完整笔记并不是教材的复刻,它把课程拆成三个阶段:语法地基、进阶主题、工程落地,而且在前两章花了很大篇幅讲 JDK 安装、PATH 配置、DOS 命令这些“看着不像编程”的内容。恰恰是这些内容,决定了你后面三个月是每天顺畅敲代码,还是每天跟“找不到或无法加载主类”较劲。它适合三类人:完全没碰过编译型语言的人、自学过一轮但环境一直没搞明白的人、想把零散知识点串成可复现练习手册的人。笔记本身是文档形态,真正的价值在于它把每个知识点都配了可运行的例子和“初学易犯错误”清单,你照着敲一遍,比读三遍强。

2. 环境这条流程:JDK、JRE、JVM 的关系与 PATH 配置的两个常见问题

把笔记翻到第 2 章,你会发现作者在讲语法之前,先用了将近十页讲环境。这个安排是有道理的:Java 是编译型语言,源码到运行中间隔着一层字节码,环境没通,后面所有例子都是纸上谈兵。这一章把这条流程拆成三段,先理清名词关系,再动手配置,最后跑通第一个程序。

2.1 三个缩写并非同义词:包含关系决定你该装什么

新手最容易混淆的,是把 JDK、JRE、JVM 当成同一件事的三种叫法。笔记里用了一张包含关系图讲清楚了,我用表格重新整理一遍,方便你对照选择。

名称本质里面装了什么谁需要
JVM虚拟机字节码解释执行引擎、内存管理所有 Java 程序运行时都靠它
JRE运行环境JVM + 核心类库(rt.jar 等)只想运行别人写好的程序
JDK开发工具包JRE + javac、java、javadoc、jar 等工具要写代码、要编译的人

选型结论很清楚:你下载笔记是为了敲代码,那就直接装 JDK;装了 JDK 就不必再单独装 JRE,因为 JDK 目录下的jre子目录已经包含了运行环境。这里有个容易被忽略的细节:java这个命令本身在 JDK 和 JRE 里都有,但javac只有 JDK 才有。所以当你敲javac提示“不是内部或外部命令”时,八成不是没装 Java,而是装了个 JRE 或者 PATH 指错了目录。

关于版本,笔记成书时主流是 JDK 8,现在常见做法是 8 或 17 这两个长期支持版本二选一。我的建议是别在这上面纠结:语法阶段两个版本差异极小,真正遇到模块化、新语法特性时再换也不迟。反倒是“装了三个版本、PATH 指向最旧那个”这种操作,会在你排查问题时制造很多干扰。

2.2 PATH 配置:先设 JAVA_HOME,再把它拼进 bin

笔记里把配置环境变量单独列了一节,还专门解释了“为什么要配置 path”。这个问题的答案很朴素:你不配 PATH,系统就不知道javac这个命令对应的可执行文件在哪个目录,只能每次敲全路径。而全路径里带空格、带版本号,敲错一个字符就是一个新错误。

我一般会分两步走,先设一个JAVA_HOME变量指向 JDK 根目录,再把它拼到 PATH 前面。这样以后换 JDK 版本,只改一处就行。

:: 第一步:设置 JAVA_HOME,路径换成你自己的实际安装目录 :: 注意不要带 \bin,只到 JDK 根目录 setx JAVA_HOME "C:\Program Files\Java\jdk1.8.0_301" :: 第二步:把 bin 目录挂到 PATH 最前面 :: 保留原来的 %PATH%,否则会把系统自带命令全部弄丢 setx PATH "%JAVA_HOME%\bin;%PATH%" :: 第三步:关掉当前命令行窗口,重新开一个再验证 java -version javac -version

这段命令的逻辑是:setx写的是用户级或系统级的环境变量,写入的是“以后新开的进程”读到的值,当前已经打开的窗口不会刷新。所以很多人配完立刻在当前窗口敲javac,依然报错,然后以为配错了,反复折腾。参数上要注意两点:一是%JAVA_HOME%\bin必须在前,否则系统里若存在旧版本 Java,会优先命中旧的;二是setx对超长 PATH 有截断风险,如果你原来的 PATH 已经很长,建议直接用图形界面编辑,别用命令行拼接。

还有一个隐蔽的坑:setx写入的是用户变量时,如果你用管理员权限打开的窗口去验证,读到的可能是另一套系统变量,结果两边不一致。血泪经验是配完之后一定用普通窗口敲echo %PATH%,肉眼确认bin路径真的在里面,而不是只看java -version有没有输出。

2.3 从 javac 到 java:第一个能跑通的完整流程

环境配好,笔记里紧接着就是“Java 快速入门”那一节。很多教程在这里直接甩一段 Hello World 就过去了,这份笔记好在它把“开发步骤”和“运行原理示意图”分开讲了。我把它压成两个动作:写源码、编译运行。

// 文件名必须是 Hello.java,且和 public 类名完全一致,大小写敏感 public class Hello { // 入口方法签名固定,String[] args 用来接收命令行参数 public static void main(String[] args) { System.out.println("Hello, Java"); } }
# 编译:把 .java 源码翻译成 .class 字节码 javac Hello.java # 运行:交给 JVM 执行,注意这里不带 .class 后缀 java Hello

代码之后的逻辑值得说清楚,因为它解释了后面一大半报错。javac做的是编译期检查:语法对不对、类型匹配不匹配、类名和文件名是否一致,这些问题在这一步就会暴露。java做的是启动 JVM、加载类、找到main方法、开始执行。两个命令的作用对象不同,所以报错信息也完全不同:javac报的是“错误: 需要‘;’”“类 Hello 是公共的,应在名为 Hello.java 的文件中声明”,java报的是“找不到或无法加载主类”。看到哪一类报错,就知道问题出在编译期还是运行期,这个判断能省掉大量瞎猜。

参数上,javac有两个最常用:-encoding UTF-8指定源文件编码,避免中文注释导致的“编码 GBK 的不可映射字符”;-d out指定字节码输出目录,避免.class文件和.java混在一起。java这边最常用的是-cp,也就是 classpath,告诉 JVM 去哪里找类。初学阶段先记住这三个,足够撑到集合框架那一章。

3. 语法基础怎么搭建:变量、数据类型与转义字符的笔记用法

第 3 章开始进入真正的语法。笔记的写法是先讲“为什么需要变量”,再讲“变量使用的基本步骤”,最后才是数据类型分类。这个顺序对新手的友好之处在于,它不要求你先记住八种基本类型,而是先让你理解“程序需要一个地方存变化的值”。这一章我挑了三个最容易“看懂了但写不对”的点展开。

3.1 变量三要素与加号的两类作用

变量的三要素是类型、名称、值,笔记里用“一个程序就是一个世界”来类比,听着有点绕,落到代码上就是:先声明类型,再起名字,最后赋值。真正让新手栽跟头的不是声明本身,而是+这个符号。它在 Java 里有两种完全不同的行为,取决于两边操作数的类型。

public class VarDemo { public static void main(String[] args) { int a = 10; int b = 3; // 两边都是数值,做算术加法 System.out.println(a + b); // 输出 13 // 从左到右结合:先算 a + b 得 13,再和字符串拼接 System.out.println(a + b + "x"); // 输出 13x // 左边先碰到字符串,后面全部变成拼接 System.out.println("x" + a + b); // 输出 x103 // char 参与算术运算会提升为 int,输出的是编码值 System.out.println('a' + 1); // 输出 98 // 想要字符结果,必须手动强转回来 System.out.println((char) ('a' + 1)); // 输出 b } }

这段代码的关键在“从左到右结合”这六个字。a + b + "x"和"x" + a + b长得像,结果完全不同,前者是 13x,后者是 x103。原因在于+遇到字符串就切换成拼接模式,而切换的时机由求值顺序决定。参数上没什么可调的,这是语言规则,只能记住。我见过有人在日志拼接里写"总计:" + a + b,本以为输出 13,结果输出 103,排查半小时才发现是拼接顺序问题。

另一个值得在笔记上做标记的点是char的算术提升。'a' + 1得到的是 98 而不是b,因为char是 16 位无符号整数,参与算术运算时会先提升为int。这不是怪癖,是类型提升规则的一部分,和后面讲的自动类型转换是同一套逻辑。

3.2 八种基本数据类型与取值范围

笔记的第 3 章后半段把整数类型单独拉了一节,还配了案例演示。八种基本类型如果只背名字,两天就忘;如果记住字节数和范围,遇到溢出问题能立刻反应过来。

类型字节取值范围默认值典型误用
byte1-128 ~ 1270当计数器用,加到 128 直接变负数
short2-32768 ~ 327670几乎不用,除非对接特定协议
int4约 ±21 亿0存毫秒时间戳,2038 年后不够用
long8约 ±9.2×10^180L字面量忘加 L,被当 int 处理
float4约 ±3.4×10^380.0f字面量忘加 f,编译报错
double8约 ±1.8×10^3080.0d用来算钱,精度丢失
char20 ~ 65535'\u0000'和字符串混用,'a'写成"a"
boolean1(逻辑上)true / falsefalse用 0/1 代替,Java 不允许

这张表里最需要划线的是两条:整数类型的字面量默认是int,小数类型的字面量默认是double。所以写long big = 10000000000;会编译失败,因为右边那个数已经超出 int 范围了,必须写成10000000000L。同理float f = 3.14;也不行,3.14默认是 double,赋给 float 属于精度损失,必须写3.14f。

关于double算钱这件事,笔记在数据类型那一节没有展开,但这是后面必然要补的知识点。常见做法是用BigDecimal或者以“分”为单位用long存。你现在不用深究,只要在笔记边上写一句“浮点数不精确,别拿来算金额”,等学到常用类那一章再回来补,印象会深得多。

3.3 类型转换:自动、强制与溢出的现场

笔记在整数类型之后讲了转换,这部分内容在排版上不显眼,实际上是新手第一个“代码能编译但结果不对”的来源。自动转换是范围小的往范围大的转,编译器自动完成;强制转换是反过来,你要显式写括号,并且承担后果。

public class CastDemo { public static void main(String[] args) { byte b = 127; // 下面这行编译不过:b + 1 会先提升为 int,int 不能直接赋给 byte // b = b + 1; // 强制截断:127 + 1 = 128,超出 byte 范围,回绕成 -128 b = (byte) (b + 1); System.out.println(b); // 输出 -128 // long 字面量必须带 L,否则右边先按 int 解析 long big = 10000000000L; int cut = (int) big; // 只保留低 32 位,高位直接丢弃 System.out.println(cut); // 输出 1410065408 // 浮点转整型是截断,不四舍五入 double d = 3.99; int i = (int) d; System.out.println(i); // 输出 3 } }

这段的重点不是让你记住 -128 和 1410065408 这两个数,而是让你建立“强转等于主动承担截断风险”的意识。(byte)(b + 1)这种写法在实际项目里几乎不会出现,但它背后的溢出逻辑会以别的形式出现:比如两个 int 相乘结果超出范围、比如把毫秒时间戳塞进 int。排查这类问题的唯一办法是在关键计算处先转成 long 再算。

参数上要留意的是转换的优先级。b + 1里的1是 int 字面量,所以整个表达式提升为 int,这是 Java 的二元数值提升规则。你写b++却不会报错,是因为自增运算符内部做了隐式转换,这是语言层面的特殊处理,别拿它当通例。

3.4 转义字符与三种注释

转义字符在笔记里占了不小篇幅,还配了课堂练习。原因是控制台输出是对齐的,不对齐就看不出结构,而新手往往把\t和空格混着用,结果输出永远对不齐。

public class EscapeDemo { public static void main(String[] args) { // \t 是制表位,不是固定数量的空格,能保证列对齐 System.out.println("书名\t作者\t价格"); System.out.println("Java\t某作者\t99"); // \n 换行,\r 回车(回到行首),Windows 记事本里换行是 \r\n System.out.println("第一行\n第二行"); // 输出一个反斜杠要写两个,路径里尤其常见 System.out.println("路径:C:\\java\\bin"); // 输出双引号要转义,否则字符串提前结束 System.out.println("他说:\"先编译再运行\""); } }

注释那部分,笔记把单行、多行、文档注释分开讲了,还专门提了“使用细节”。最值得记的一条是多行注释不能嵌套:/* 外面 /* 里面 */ 外面 */会在第一个*/处提前结束,后面的内容变成语法错误。这个坑在注释掉一大段带注释的代码时特别容易踩,解决方式是用单行注释逐行注掉,或者用 IDE 的快捷键。

文档注释/** */是另一回事,它不是给人随便看的,是能被javadoc工具提取成 HTML 文档的结构化注释。笔记在注释那一节给了代码演示,我建议你从现在开始就养成给公共方法写文档注释的习惯,成本很低,收益在几个月后回过头看自己的代码时体现得特别明显。

4. 把笔记变成练习:DOS 命令、路径与代码规范的执行清单

笔记第 2 章末尾有一节“DOS 命令(了解)”,很多人直接跳过,觉得图形界面能做的事没必要敲命令。但 Java 的编译运行全程在命令行里,你对路径的理解程度直接决定编译报错的排查速度。这一章把这部分内容整理成可以照着敲的清单。

4.1 相对路径与绝对路径:编译报错的高频源头

先明确一个概念:命令行里的“当前目录”决定了相对路径的起点。你在D:\code下敲javac Hello.java,编译器就去D:\code找这个文件;文件在D:\code\java-basic下,那就找不到。

:: cd 切换目录,/d 参数用于跨盘符切换,这是最常被漏掉的参数 cd /d D:\code\java-basic :: dir 列出当前目录内容,编译前先确认源文件真的在这 dir :: 相对路径编译,.class 默认生成在源文件同目录 javac Hello.java :: 绝对路径编译,适合文件不在当前目录的情况 javac D:\code\java-basic\Hello.java

cd不带/d时,只能在同一盘符内切换,从 C 盘跳到 D 盘会毫无反应也不报错,很多人以为命令失效了。这是 DOS 命令遗留的行为,记住加/d就行。另一个细节是:用绝对路径编译时,.class文件默认仍然生成在源文件所在目录,不是当前目录,这个差异在配合-d参数时会变得很重要。

4.2 javac 与 java 的常用参数

笔记在快速入门那一节只给了最基础的编译运行,实际练习中你会需要更多控制。下面这几个参数覆盖了初学阶段九成场景。

命令参数作用什么时候用
javac-encoding UTF-8指定源文件编码源码含中文,编译报不可映射字符
javac-d out指定字节码输出目录不想让 .class 和 .java 混在一起
javac-classpath lib指定依赖类路径引用第三方 jar 时
java-cp out指定运行时类路径字节码不在当前目录时
java-version查看运行时版本排查版本不一致
# 编译:指定编码和输出目录,源文件在 src 下 javac -encoding UTF-8 -d out src/Hello.java # 运行:告诉 JVM 去 out 目录找类,类名不带路径不带后缀 java -cp out Hello # 传参:命令行参数会进 main 方法的 String[] args java -cp out Hello first second

参数说明里最容易搞混的是 classpath。编译期的-classpath和运行期的-cp是两套东西,前者找的是编译时依赖的类,后者找的是运行时加载的类。初学阶段你写的都是单文件程序,用不上;一旦开始拆包、引 jar,这两个参数配错就是“编译通过但运行报 NoClassDefFoundError”。

4.3 用 javadoc 把文档注释变成可查的文档

笔记在注释那一节给了文档注释的写法,但没有把工具链走完。补上这一步,你就能体会结构化注释的价值。

/** * 金额计算工具,演示文档注释的标准写法 * @author 某开发者 * @version 1.0 */ public class PriceUtil { /** * 按折扣率计算应付金额 * @param amount 原始金额,单位元,必须大于 0 * @param rate 折扣率,取值 0 到 1,1 表示不打折 * @return 折后金额,保留两位小数由调用方处理 */ public static double pay(double amount, double rate) { return amount * rate; } }
# -d 指定文档输出目录,-encoding 和 -charset 都要给,否则中文乱码 javadoc -encoding UTF-8 -charset UTF-8 -d doc PriceUtil.java

生成之后打开doc/index.html,你会看到方法签名、参数说明、返回值说明被排成标准格式。参数上-encoding管的是读取源文件的编码,-charset管的是生成 HTML 的字符集,两个都要设成 UTF-8,只设一个中文照样乱码。这个组合我踩过不止一次,后来干脆做成一个批处理脚本,每次生成文档直接跑。

5. 排查清单:新手在环境和语法上出问题的五个典型场景

这一章的五条,每一条都来自真实的排查过程,按“现象 → 原因 → 解决”写。你可以把它当成笔记的附录,卡住的时候直接翻。

5.1 环境与路径类问题

第一条:javac不是内部或外部命令。

现象是java -version能正常输出版本,但javac -version报命令不存在。原因通常有两种:装的是 JRE 而不是 JDK,或者 PATH 里只加了jre\bin没加 JDK 的bin。解决方式是先进JAVA_HOME指向的目录看一眼有没有javac.exe,没有就是装错了包;有的话就检查 PATH 里那一条路径是否精确到bin,以及是否排在旧版本前面。

第二条:java Hello报“找不到或无法加载主类”。

现象是编译明明成功了,.class文件也生成了,运行就报这个。原因有三类:一是敲成了java Hello.class,Java 命令要的是类名不是文件名;二是 classpath 没指对,字节码在out目录但你在项目根目录运行;三是源码里写了package,运行时必须带完整包名。对应解法分别是去掉后缀、加-cp out、用java com.demo.Hello这种全限定名。

第三条:编译报“编码 GBK 的不可映射字符”。

现象是源码里写了中文注释或者中文字符串,javac直接报错并指出行号。原因是源文件存的是 UTF-8,而javac在某些系统上默认按平台编码(GBK)读取。解决办法是编译时显式加-encoding UTF-8。

# 一条命令同时解决编码和输出目录两个问题 javac -encoding UTF-8 -d out src/Hello.java

这条属于典型的“不改代码改参数”,记住参数比记住报错信息更有用。

5.2 语法与运行类问题

第四条:类 Hello 是公共的,应在名为 Hello.java 的文件中声明。

现象是文件叫hello.java或者Test.java,里面写的却是public class Hello。原因是 Java 要求 public 类的类名必须和文件名完全一致,包括大小写。解决方式很简单,改文件名或者改类名,二选一。这里要提醒的是 Windows 默认不显示文件扩展名,你可能改了名字但实际叫Hello.java.txt,看着像.java其实不是,打开“显示已知文件扩展名”再确认一遍。

第五条:可能尚未初始化变量或不兼容的类型: 从 double 转换到 int 可能会有损失。

前者的现象是声明了局部变量但没赋值就使用,原因是局部变量没有默认值,这一点和成员变量不同。后者是把 double 直接赋给 int,编译器拦住了精度损失。解决方式分别是在使用前赋值、加显式强转(int)并确认你接受截断。这两类报错都是编译期拦截,属于好事,真正麻烦的是运行期才暴露的类型问题。

提示:这五条覆盖不了所有情况,但能覆盖新手前两周九成的卡点。遇到新报错时,先把报错信息原样复制到搜索引擎,别只搜“Java 报错”这种没有信息量的词。

6. 进阶用法:把这份笔记变成能反复查询的个人知识库

笔记的价值不在于读一遍,而在于你能不能在三个月后回头查到一个具体细节。我自己的做法是把它拆成三层来用。

第一层是章节索引。笔记的目录层级做得很细,从“第 1 章”到“2.19.3 常用的 dos 命令”都能定位。我会在每一章开头手写三行摘要:这一章解决什么问题、最容易错的一个点、对应的练习文件名。三个月后翻到这一页,三十秒就能回忆起来,不用重读。

第二层是可回归的练习集。每学完一章,把笔记里的“课堂练习”和“本章作业”抄到一个独立目录,文件名按章节号-知识点.java命名,比如03-02-cast-overflow.java。这些文件不要删,它们是你自己的回归测试用例。哪天怀疑自己忘了某个语法,不用翻笔记,直接把这批文件重新编译一遍,报错就是提醒。

学习阶段笔记对应章节验收标准建议练习量
环境与工具第 2 章能不看教程配好 PATH 并跑通 Hello3 次重装
变量与类型第 3 章能解释'a' + 1为什么是 98每节 2 个例子
流程控制第 4 章起能写出不带 IDE 提示的循环嵌套每节 3 个例子
方法与数组后续章节能说清值传递和引用传递的区别每节 2 个例子

第三层是坑点清单。我在笔记的空白处专门留了一页叫“翻车记录”,只记三样东西:报错原文、原因一句话、解决办法一句话。上面第 5 章那五条就是从这页整理出来的。这个习惯看起来笨,但它把“我好像遇到过”变成了“我明确知道怎么解”,排查速度的差距就在这儿。

还有一个技巧值得单独说:把javac -encoding UTF-8 -d out和java -cp out这两条命令写成一个run.bat,参数留成变量,每次编译运行双击就行。这不算什么高深技巧,但它能让你把注意力从“我又忘了加什么参数”里解放出来,专注在代码本身。初学阶段最消耗人的往往不是语法难,而是这些重复的小摩擦。

最后说个我自己的教训。我刚开始学的时候嫌环境配置麻烦,直接用了一个别人打包好的绿色版,省了半小时。结果三个月后换机器,我完全不知道自己当初装的是哪个版本、PATH 怎么配的,重新踩了一遍所有坑。从那以后我每次搭新环境,都会在笔记第一页写清楚版本号、安装路径、PATH 的具体值,以及验证通过的三条命令。看起来是多此一举,但它让我在任何一台新机器上都能在十分钟内回到能写代码的状态。希望这份整理能帮到你,少走几段我走过的弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询