简介:《韩顺平_循序渐进学Java零基础【完整笔记】1》是一份面向Java初学者的系统学习笔记,适合零基础入门或复习语法体系时对照使用,重点解决知识点分散、阶段脉络不清的问题。笔记按三阶段展开:基础知识涵盖Java语法、数据类型、控制结构与类和对象;进阶部分涉及异常处理、多线程、I/O流和集合框架;实际应用延伸至数据库操作、网络编程与面向对象设计原则,并简述Java就业方向及SSM、Android、Hadoop等开发场景。资源包共1个PDF文件,大小约59.36MB,便于离线阅读和按章节检索。目前已有2723人学习,可作为课堂之外的脉络梳理材料,帮助读者建立从语法基础到应用场景的完整认知,并借目录快速定位薄弱环节。
1. 知识地图:一份「Java 零基础」完整笔记的四层骨架
很多人翻开一份「Java 零基础完整笔记」,第一反应是从第一页顺着往下抄,抄到变量就卡住,抄到面向对象彻底放弃。真正的问题不在勤奋,而在这份笔记的骨架没有被先看清楚。它其实是四层结构:最底层是环境层,解决「程序凭什么能跑起来」,包含 JDK、JRE、JVM、PATH 这一串名词;往上是语法层,解决「代码长什么样才算合法」,包含类结构、主方法、注释、转义字符、代码规范;再往上是数据层,解决「数据怎么存、怎么算」,包含变量、八种基本数据类型、整数类型的取值范围、+号的两种含义;最上层才是应用层,也就是笔记开篇提到的三个阶段——基础语法、进阶主题(异常、多线程、I/O、集合)、实际应用(数据库、网络编程、面向对象设计原则),以及 SSM、Android、大数据这几条就业方向的落点。
先把这张图记住,再往下读每一章,你会发现自己不是在背零散知识点,而是在往四个格子里填东西。这份笔记适合两类人:完全没写过代码、需要一条明确路径的初学者,以及学过一遍但知识是散的、想重新对齐体系的人。
2. 环境与运行机制:JDK、JRE、JVM 与 PATH 的复习重点
环境这一章在很多人的笔记里被压缩成三行命令,结果是后面每次报错都要回头重查。它其实是整份笔记里唯一「一旦搞错,后面全错」的部分,值得单独摊开复习。这一章要解决的是一串因果关系:源文件怎么写、用什么编译、编译产物是什么、谁来执行它、执行时去哪儿找工具。把这五个问题串成一条线,环境配置就不再是照着步骤点下一步的机械操作。
2.1 三个缩写不是同义词:JDK、JRE、JVM 的包含关系
初学者最容易把这三个词当成同一件东西的三个叫法。梳理下来会发现它们是层层包含的:JVM 是真正执行字节码的虚拟机;JRE 是 JVM 加上运行所需的核心类库,只够「运行」不够「开发」;JDK 是 JRE 再加上编译器等开发工具,是开发者必须装的那一个。三者的关系可以用一句话记住:JDK ⊃ JRE ⊃ JVM。
| 名称 | 全称含义 | 里面有什么 | 谁需要 |
|---|---|---|---|
| JVM | 虚拟机 | 执行字节码的运行时 | 只要跑 Java 程序就需要 |
| JRE | 运行环境 | JVM + 核心类库 | 只想运行、不写代码的人 |
| JDK | 开发工具包 | JRE + 编译器 javac 等工具 | 写代码、编译代码的人 |
这个包含关系直接决定了一个常见现象:只装 JRE 的机器上,java命令能用,javac命令找不到。这不是装坏了,是装的东西本来就不包含编译器。复习时不妨把这条当成判断题来自测:能不能只有 JDK 没有 JRE?不能;能不能只有 JRE 没有 JDK?能,但写不了代码。
2.2 PATH 环境变量的作用与配置思路
PATH 的本质是一张「命令搜索目录清单」。你在控制台敲javac,系统并不知道它在哪,只会按 PATH 里列的目录一个个找,找到就执行,全找完没有就报「不是内部或外部命令」。所以配置 PATH 不是某种仪式,而是把 JDK 的bin目录告诉系统。很多人觉得这一步像玄学,其实只要问自己一句「我敲的命令,系统去哪儿找」就通了。
# Linux / macOS:先设 JAVA_HOME 指向 JDK 根目录,再把 bin 追加到 PATH 前面 export JAVA_HOME=/opt/jdk export PATH=$JAVA_HOME/bin:$PATH # 放在前面,优先使用这个 JDKREM Windows 命令行临时设置,永久生效要在系统环境变量里配 set JAVA_HOME=C:\jdk set PATH=%JAVA_HOME%\bin;%PATH%两段代码做的是同一件事,区别只在语法:$VAR与%VAR%。把$JAVA_HOME/bin放在$PATH前面而不是后面,是为了让这个 JDK 优先于机器上可能存在的其他版本,这也是多版本共存时不翻车的关键。配置完必须新开一个终端窗口验证,老窗口读的还是旧的环境变量。验证方式就两条:java -version和javac -version,两个都能出版本号,环境这关才算过。
注意:配置的是
bin目录,不是 JDK 根目录。这是最高频的一处手误,症状是命令始终找不到。
2.3 跨平台性的准确说法与 class 文件的角色
「一次编写,到处运行」这句话被引用得太多,反而容易被理解歪。准确的说法是:源码编译成字节码(.class文件)之后,这份字节码是平台无关的;真正与平台绑定的是各个平台上各自的 JVM 实现。换句话说,跨平台的是 class 文件,不是 JVM。同一份 class 文件在 Windows 和 Linux 上都能跑,前提是那两个平台都装了对应的 JVM。
这条区分在复习时很值钱,因为它能解释一串现象:为什么换了操作系统要重装 JDK;为什么同一份 class 在 A 机器能跑、B 机器报版本不兼容;为什么说 Java 的性能开销里有一部分来自虚拟机这一层。笔记里把 JVM 称为 Java 的核心机制,重点就在「中间多了一层」——多出来的这层换来了可移植性,也换来了需要理解的新概念。
2.4 相对路径、绝对路径与常用命令
笔记里把 DOS 命令标为「了解」,但路径概念不能只当了解。绝对路径是从根写起的完整位置,相对路径是相对于「当前所在目录」的位置。.表示当前目录,..表示上一级目录,这两个符号在后面的包结构、类路径、配置文件读取里会反复出现。
| 命令 | 作用 | 复习时的关注点 |
|---|---|---|
dir | 列出当前目录内容 | 确认文件到底在不在 |
cd 目录 | 切换目录 | 区分cd..与cd \ |
md/del | 建目录 / 删文件 | 删除不可逆,别手快 |
cls | 清屏 | 只是看着清爽,不影响结果 |
这些命令的价值不在背,而在于排查问题时有手段:编译报「找不到文件」,第一件事是用dir确认当前目录里到底有没有那个.java;运行时报告类找不到,先确认当前目录是不是 class 文件所在的目录。
3. 语法起步:第一个 Java 程序、转义字符与注释规范
语法层的复习目标不是「能抄出一个能跑的程序」,而是「看到一个程序能说出每一部分为什么必须这么写」。这条线上有四个必过关口:程序的结构、编译与运行的命令、字符串里的转义、注释与规范。这四个关口全过了,后面学变量和控制结构才不会是空中楼阁。
3.1 从需求到运行:第一个程序的完整链路
笔记里的快速入门是标准的三步:写源码、编译、运行。需求很简单——在控制台输出一句话,但这一步把整条工具链都串起来了。
// 文件名必须叫 HelloWorld.java,与 public 类名完全一致(含大小写) public class HelloWorld { // 主方法是程序入口,签名固定,改一个字母就找不到入口 public static void main(String[] args) { System.out.println("Hello, World!"); // 输出并换行 } }javac HelloWorld.java # 编译:源码 -> 字节码,产出 HelloWorld.class java HelloWorld # 运行:执行时写类名,不加 .class 后缀代码里三个细节值得逐条记住:类名与文件名必须一致,这是 Java 的硬性规定;main方法的签名是固定的,public static void main(String[] args)少一个修饰符都不是入口;System.out.println与System.out.print的差别只在是否换行。运行原理这条链是:javac把.java编译成.class字节码,java启动 JVM 加载并执行这个字节码。理解了这条链,就明白为什么改了源码必须重新编译——JVM 执行的是 class,不是你刚改的源文件。
3.2 转义字符表:写在字符串里的反斜杠
字符串里有些字符没法直接敲出来,比如换行、制表、引号本身,于是用反斜杠加一个字母来表示。这张表不长,但复习时必须能默写,因为它在后面拼接输出、格式化打印时天天用到。
| 转义写法 | 含义 | 实际效果 |
|---|---|---|
\n | 换行 | 光标移到下一行行首 |
\t | 制表 | 输出一个制表位,用于对齐 |
\r | 回车 | 光标回到本行行首 |
\\ | 一个反斜杠 | 输出\本身 |
\" | 一个双引号 | 在字符串里输出" |
\' | 一个单引号 | 在字符里输出' |
// 对比 \n 与 \t:一个换行,一个对齐 System.out.println("姓名\t年龄"); System.out.println("A同学\t18"); System.out.println("第一行\n第二行"); // 一条语句输出两行最容易忽略的是\\和\":想输出一个路径C:\java,写成"C:\java"会因为\j不是合法转义而报错,必须写成"C:\\java";想在输出里带引号,必须写\"。判断标准很简单:反斜杠后面紧跟的字符如果本身有转义含义,就必须再加一个反斜杠把它「还原」成普通字符。
3.3 三种注释:单行、多行与文档注释
注释不影响运行,但影响两件事:别人能不能读懂,以及以后自己能不能读懂。笔记里分了三种,用途完全不同。
// 单行注释:解释一行代码的意图 /* * 多行注释:成段说明 * 可以写多行,不能嵌套多行注释 */ /** * 文档注释:可以被工具提取成说明文档 * 通常写在类和方法前面,标注用途与参数 */ public class CommentDemo { public static void main(String[] args) { System.out.println("注释不参与编译"); // 编译后这部分直接消失 } }三者的差别不在写法,而在位置与用途:单行注释跟在代码后面或单独一行,解释「这行在干什么」;多行注释用于成段说明;文档注释写在类、方法、字段前面,是唯一能被工具提取出来生成文档的一种。使用细节上要把两条记牢:多行注释不能嵌套多行注释;文档注释必须写在声明之前,写在方法体里面就失去了它的意义。
3.4 代码规范:那些不影响运行但影响评价的细节
规范类的东西最容易在复习时被跳过,因为它「不考运行结果」。但恰恰是这些细节,决定了代码看起来是练过的还是野生的。梳理下来值得固定的习惯有这么几条:类名用大驼峰,方法名和变量名用小驼峰,常量全大写;每行只写一条语句;运算符两侧留空格;缩进统一用四个空格或一个制表符,不要混用;左大括号跟在语句同一行。
// 规范的写法:命名、缩进、空格都到位 public class ScoreDemo { public static void main(String[] args) { int studentAge = 18; // 小驼峰,见名知意 int totalScore = 0; totalScore = studentAge + 100; // 运算符两侧留空格 System.out.println(totalScore); } }对比一下不规范写法——int a=1;这种一行挤在一起的风格——就能看出差别全在可读性。之所以在起步阶段就把规范定下来,是因为等到写几百行的类时再改习惯,成本高得多,这类问题属于典型的「当时不改,后面全是后悔药」。规范不产生功能,但产生可维护性,而可维护性正是这门语言在企业级场景里被选中的原因之一。
4. 变量与数据类型:整数类型、取值范围与 + 号的两副面孔
变量这一章是从「能跑」到「能算」的分界线。它的复习重点不在定义,而在三件事:变量使用的固定步骤、整数类型的取值范围与溢出、+号在不同上下文下的两种含义。这三点没理清,后面学运算、类型转换、方法传参都会出现似是而非的理解。
4.1 变量是什么:三个要素与固定使用步骤
变量的本质是内存中一块有名字的存储区域,名字用来引用,类型决定这块区域的大小和能装什么,值就是里面装的东西。这三个要素缺一不可。笔记里强调「变量是程序的基本组成单位」,这句话的分量在于:程序的所有计算,都是对变量的读写。
// 步骤一:声明(告诉编译器有个变量、什么类型) int age; // 步骤二:赋值(把值放进这块内存) age = 18; // 声明与初始化可以合并成一步 int score = 100; // 先赋值再使用,这是硬性要求 int total = age + score; System.out.println(total);使用步骤就三步:声明、赋值、使用。最容易忽略的是第二步没做就直接用——局部变量未初始化就参与运算,编译直接报错,而不是给个默认值。这一点和成员变量不同,成员变量有默认值,局部变量没有,这也是初学者最容易混淆的一处差异。另外要记住变量的「变」:同一个变量可以被反复赋值,最后一次赋的值才是它当前的值。
4.2 整数类型与取值范围:为什么要有四种
四种整数类型的存在意义只有一个——在内存占用和表示范围之间做取舍。范围越大占的字节越多,选型的依据是「这个数据最大能到多少」。
| 类型 | 占用字节 | 位数 | 取值范围 |
|---|---|---|---|
byte | 1 | 8 | -128 ~ 127 |
short | 2 | 16 | -32768 ~ 32767 |
int | 4 | 32 | -2147483648 ~ 2147483647 |
long | 8 | 64 | -2^63 ~ 2^63-1 |
int count = 100; // 最常用,整数字面量默认就是 int long distance = 10000000000L; // 超出 int 范围必须加 L,否则编译报错 byte small = 100; // 在 byte 范围内,可以 // byte overflow = 200; // 超出 127,编译不通过这张表要记的不只是数字,还有两条推论:第一,整数字面量默认是int类型,写一个超过 int 上限的数必须加L,否则报「整数过大」;第二,byte和short在参与运算时会被提升为int,所以byte + byte的结果是int,赋回byte需要强转。范围边界建议直接背下来byte的 -128 到 127,因为它是溢出演示最常用的例子。
4.3+号的两种含义:算术加与字符串拼接
同一个符号在不同上下文里干两件完全不同的事,这是初学阶段最容易被绕晕的地方。判断规则只有一条:从左到右看,+两边只要有一边是字符串,这个+就是拼接;两边都是数值,才是加法。
System.out.println(1 + 2); // 3,两边都是数值,做加法 System.out.println("1" + 2); // 12,左边是字符串,做拼接 System.out.println(1 + 2 + "3"); // 33,先算 1+2=3,再和 "3" 拼接 System.out.println("1" + 2 + 3); // 123,先拼接成 "12",再拼接 "3"这段代码的两行结果(33和123)几乎每次复习都值得重看一遍,因为它们体现了「从左到右」这个顺序:1 + 2 + "3"里前两个是数值,先算出 3,再遇到字符串转成拼接;"1" + 2 + 3里第一个+就已经碰到了字符串,后面全部变成拼接。掌握这条,输出调试信息时拼接变量就不会再出现莫名奇妙的数字。
4.4 类型转换:自动提升与强制转换的边界
类型转换的规则可以浓缩成一句话:小范围到大范围自动转,大范围到小范围必须显式强转,且强转可能丢精度。
byte b = 10; int i = b; // 自动转换:byte -> int,安全 int n = 300; byte m = (byte) n; // 强制转换:300 超出 byte 范围,结果是 44 System.out.println(m); // 输出 44,这就是溢出后的截断结果(byte) 300得到 44 不是随意定的,而是 300 的二进制被截断成 8 位后的结果。复习时不必每次手算,但要记住这个现象:强转不报错,只默默给出一个「看起来合理」的错值,这类问题属于必须靠理解才能发现的黑匣子。另外,char与整数之间也能互转,boolean不参与任何数值转换,这两条边界要在脑子里划清楚。
5. 易错点:初学 Java 最容易翻车的五个地方
这一章单独拎出来,是因为前面四章里「懂了但会做错」的地方高度集中。下面五条按「易漏点 → 为什么漏 → 怎么补」写,每一条都对应一个可验证的自查动作,不是泛泛的提醒。
5.1 环境与执行链路的三处坑
易漏点一:只验证了java,没验证javac。为什么会漏:装完 JDK 后随手敲java -version看到版本号就以为大功告成,而真正报错往往发生在第一次编译。怎么补:装完立刻两条命令一起跑,java -version与javac -version都出版本号,才算环境可用;只装了 JRE 的机器上第二条必然失败,这正好是判断装对没装对的依据。
易漏点二:改了环境变量却不重开终端。为什么会漏:命令行窗口在启动时读取一次环境变量,之后就不再刷新,于是「明明配好了却没生效」。怎么补:任何环境变量改动之后,关掉旧窗口新开一个再验证;如果新窗口仍不行,检查配的是不是bin目录、是不是把新路径追加到了原 PATH 后面被旧路径抢先。
易漏点三:把 class 文件当成可以直接双击运行的东西,或者运行时带上.class。为什么会漏:直觉上「编译产物就是可执行文件」,于是双击或敲java HelloWorld.class。怎么补:记住运行命令只写类名java HelloWorld,且必须在 class 文件所在目录下执行;另外改完源码要重新javac,JVM 只认 class,不认源文件。
5.2 语法与类型的两处坑
易漏点四:主方法签名写错,程序「能编译但没输出」。为什么会漏:main方法少写static、把String[] args写成String args,编译照样通过,但运行时 JVM 找不到入口,报「主方法不存在」。怎么补:把签名当成模板默写三遍,public static void main(String[] args),一个修饰符都不能少;IDEA 之类工具里自动生成的主方法也建议自己核对一遍。
易漏点五:+号拼接顺序搞错,或者long字面量忘了加L。为什么会漏:这两处都不会编译报错(拼接那处),或报错信息不够直白(缺 L 报「整数过大」),于是被当成玄学。怎么补:遇到+就从左往右扫一遍,标出第一个字符串出现的位置,它之前做算术、之后做拼接;遇到超过int范围的字面量,第一反应是补L。
6. 复习清单:把零散笔记变成能自测的检查表
复习最怕的是「看一遍觉得都会,合上书什么都写不出」。把这份笔记转成一张可勾选的检查表,比反复重读有效得多。下面这张表按四个模块列,每一项都写成了可验证的动作——能做出动作才算过,做不出就回到对应章节。
| 模块 | 自测动作 | 通过标准 |
|---|---|---|
| 环境 | 新开终端,跑java -version与javac -version | 两条都出版本号 |
| 环境 | 口述 JDK、JRE、JVM 的包含关系 | 说清 JDK ⊃ JRE ⊃ JVM |
| 环境 | 解释「跨平台的是 class 不是 JVM」 | 能举出一个反例场景 |
| 语法 | 手写 HelloWorld,不查资料 | 类名、文件名、签名全对 |
| 语法 | 默写六个常用转义字符 | \n \t \r \\ \" \'全对 |
| 语法 | 说出三种注释的差别与位置要求 | 知道文档注释写在声明前 |
| 数据 | 默写四种整数类型的字节数与范围 | byte的 -128~127 必须准 |
| 数据 | 判断1 + 2 + "3"与"1" + 2 + 3的结果 | 分别是 33 和 123 |
| 数据 | 解释(byte) 300为什么不报错 | 说得出截断与溢出 |
| 综合 | 举出至少三个本方向的应用落点 | SSM、Android、大数据 |
这张表建议按「环境 → 语法 → 数据」的顺序过,因为后一层的错误常常是前一层没打牢伪装出来的。比如运行时报「找不到或无法加载主类」,八成不是代码问题,而是当前目录不对或类名与文件名不一致。
真正拉开差距的是「反向自测」:不是看代码猜输出,而是给定输出反推代码。比如要求输出两行对齐的表格,就该想到\t和\n;要求输出C:\java\bin这样一串带反斜杠的文本,就该想到每个反斜杠都要写成两个。这种练法比抄十遍示例更能暴露薄弱点。
最后补一个我自己的教训。刚学的时候我觉得环境配置是一次性劳动,配完就再也不用管,结果换机器、装多版本、路径带空格,每一种情况都翻车一次,每次都从零开始查。从那以后我每次动环境之前,都强制走一遍固定流程:先确认JAVA_HOME指向哪儿,再确认 PATH 里它的位置,然后新开窗口双命令验证,最后才动代码。这三步花不到一分钟,省下的是半小时的自我怀疑。希望帮到你。
本文还有配套的精品资源,点击获取