简介:这份PDF笔记面向零基础、希望系统入门Java的编程学习者,内容源自韩顺平循序渐进学Java课程,覆盖从语法基础到进阶应用的主要知识点。笔记按三个阶段组织:先讲数据类型、控制结构、类与对象等基础,再延伸到异常处理、多线程、I/O流、集合框架等进阶主题,最后介绍数据库操作、网络编程和面向对象设计原则,并补充Java在SSM框架、Android开发与Hadoop大数据等场景中的应用及就业方向说明,便于读者建立完整的学习路线。资源包共1个PDF文件,约59.36MB,适合打印或离线查阅,也可按章节对照课程进度复习。目前已有2718人学习,适合需要一份体系化课堂笔记辅助理解与查漏补缺的Java初学者。
1. 零基础学 Java 到底在学什么:先弄明白这门语言能帮你干什么
很多人对 Java 零基础入门的第一反应是:装一堆看不懂的软件,敲几行英文,然后屏幕上冒出一片红字。我第一次打开教程时也是这种感觉,满屏都是 JDK、JVM、环境变量,像在看另一门语言。其实这套 Java 零基础完整笔记做的事很朴素:把“怎么让电脑按你的想法干活”拆成很小的一步一步,从装环境、打印第一行字,到变量、数据类型、判断和循环,一路带着你走。它不是给熟手查漏补缺的手册,而是给完全没碰过编程的人准备的路线图。适合谁?适合想学一门能找工作的语言、又担心自己数学英语不行的人;适合在校生、想转行的人、想自己写个小工具的人。你要做的不是先把名词全看懂,而是先把第一个程序跑起来。
2. 为什么先学 Java:岗位多、资料全、语法规矩,这三条够不够
2.1 三个实打实的理由:岗位、资料、规矩
先说岗位。企业里大量的后台系统——订单、库存、结算、管理系统——都是用 Java 写的,这类系统不追求花哨,追求稳定和好维护,所以岗位需求常年存在。你学会 Java,能投的方向不止一个,这一点对零基础的人很重要:学完之后有地方去,学习才有意义。新手最怕的不是难,是学完发现用不上。
再说资料。Java 火了这么多年,几乎每个概念都能找到十种讲法,你卡在某一个点上,换一个例子、换一本书就能绕过去。这套笔记本身就是“资料全”的体现,从课程三个阶段的总览,到变量、数据类型、控制结构,再到面向对象和后面的进阶主题,它把一条完整路线先摆在你面前,你不用自己猜下一步学什么。
最后说语法。Java 是强类型语言,写错一个分号、类型对不上,编译就直接失败。听上去很烦,但对零基础反而是好事:编译器像个严格的教练,你刚写错它立刻指出来,不会让你带着错误跑出去很远才发现。血泪经验是,初学阶段最怕的不是报错,是“看起来跑通了但其实全错”,Java 在这一点上帮你省了很多后悔药。
2.2 它到底能做什么:三类最常见的落地场景
第一类是企业后台系统。你在手机上点一份外卖、查一次物流、看到的一条订单记录,背后往往有一串 Java 服务在处理。这类系统看不见摸不着,但需求量大、生命周期长,是 Java 最主流的战场。学 Java 的人,大部分最终会落在这个方向上。
第二类是移动端应用。很多手机应用的核心逻辑层是用 Java 体系写的,即使界面换了别的技术,底层的数据处理和业务规则还是那一套。你把 Java 的面向对象、集合、异常处理学明白,看这类代码不会发怵。
第三类是大数据与后台批处理。处理海量数据的框架里,有相当一部分是用 Java 写的,或者提供 Java 接口。你不需要一入门就冲着这个方向去,但知道“学了能往这儿走”,会让前面那些枯燥的语法练习变得有盼头。这三类场景不需要你现在就选,先知道地图有多大就够了。
2.3 JDK、JRE、JVM:用厨房比喻一次讲明白
新手最先被绕晕的就是这三个缩写。换个说法:JVM 是灶台,负责真正把菜做出来;JRE 是灶台加锅碗瓢盆,是一个能开火做饭的完整环境;JDK 是整个厨房,除了灶台锅碗,还带一套工具箱,里面有切菜刀、量杯,也就是编译器这类开发工具。你要“做饭给别人吃”,得用 JRE;你要“自己研发新菜”,得用 JDK。
那 Java 为什么能“一次编写,到处运行”?你写的.java文件是菜谱,编译器javac把菜谱翻译成一种中间语言.class字节码,然后每个平台上的 JVM 负责把字节码变成当地能懂的做法。菜谱只有一份,各地灶台自己适配,所以同一份代码换个系统还能跑。
理解了这层关系,你就明白为什么装环境时反复出现这三个词:装的是 JDK,因为它包含 JRE 和 JVM;配的是 PATH,因为要让命令行找得到工具箱里的javac和java。这块是玄学高发区,后面第 5 章会专门讲翻车现场。
2.4 动手前先做一次体检:看看你电脑上现在是什么状态
别急着下载,先花两分钟确认现状。打开命令行(Windows 叫“命令提示符”,Mac 叫“终端”),敲下面两行,一行一行来:
# 查看当前 Java 运行环境的版本,能显示版本号说明已经有 JRE java -version # 查看编译器版本,能显示说明 JDK 也装好了 javac -version第一行有输出、第二行提示“不是内部或外部命令”,说明你电脑上只有运行环境,没有开发工具,需要装 JDK。两行都有输出但版本很老,也建议重装一个新版本,避免后面跟着教程敲代码时出现奇怪的兼容问题。两行都提示找不到命令,那就是干净环境,从零开始装,反而是最省事的。
这里有个小习惯值得早点养成:每次装完或改完环境变量,关掉命令行再重新打开一个。很多人改完 PATH 发现没生效,急得反复重装,其实就是旧窗口还揣着老配置。这个坑我后面还会提,因为它是新手第一天最容易卡住的地方。
3. 迈出第一步:装好 JDK,让第一行代码真正跑起来
3.1 安装 JDK:路径里千万别有中文和空格
去官网找 JDK 的下载页,选你系统对应的安装包。这一步唯一要提醒的是安装路径:不要放在带中文、带空格的目录里,比如“桌面/我的资料/Java 学习”这种路径,后面编译时很容易出莫名其妙的错。稳妥做法是装在盘符根目录下的一个纯英文短路径,比如D:\java\jdk。
安装过程一路下一步就行,中间会让你选安装位置,记住这个位置,配置环境变量时要用。装完之后,按 2.4 里的两行命令再验证一次,能看到版本号就说明装成功了。如果还是提示找不到命令,先别怀疑安装包,八成是新开的命令行窗口还没读到新配置,或者 PATH 压根没配——接着往下看。
提示:安装路径和你的项目代码路径,最好都保持纯英文。这不是迷信,是新手阶段最划算的一条纪律。
3.2 配置 PATH:为什么命令行能认出 javac
命令行有个习惯:你敲一个命令,它会在几个“默认会去找的文件夹”里挨个翻。PATH 就是这张文件夹清单。你把 JDK 的bin目录加进 PATH,命令行才知道去那里找javac.exe和java.exe。不配 PATH,你就得每次敲完整路径,比如D:\java\jdk\bin\javac,麻烦到没法用。
Windows 上的操作顺序:右键“此电脑” → 属性 → 高级系统设置 → 环境变量 → 在“系统变量”里找到Path→ 编辑 → 新建 → 粘贴D:\java\jdk\bin→ 一路确定。注意是加到bin这一层,不是 JDK 根目录。加错了的现象是命令行能打开java,但javac依然找不到。
Mac 或 Linux 上,一般是在用户目录下的 shell 配置文件里追加一行,改完执行source让它生效:
# 把 JDK 的 bin 目录追加到 PATH 末尾,路径换成你自己的 export PATH=$PATH:/usr/local/java/jdk/bin # 让当前终端立刻读到新配置 source ~/.bash_profile改完记得关掉旧窗口、开新窗口,再敲一次javac -version。这一步过了,环境就算搭好了,接下来才是真正有意思的部分。
3.3 第一个程序:HelloWorld 的每一步
新建一个文件夹当你的代码工作区,比如D:\code。在里面新建一个文本文件,名字必须叫HelloWorld.java,注意大小写和扩展名——Windows 默认隐藏扩展名,很容易变成HelloWorld.java.txt,这是新手第一个隐形炸弹。用记事本或任意编辑器打开它,敲进去:
// 文件名必须和这个类名完全一致,包括大小写 public class HelloWorld { // 程序入口:JVM 从这里开始执行 public static void main(String[] args) { // 向控制台打印一行文字并换行 System.out.println("Hello, Java"); } }保存。然后打开命令行,进到这个文件所在的目录,依次执行:
# 切换到代码目录 cd /d D:\code # 编译:把 .java 源码翻译成 .class 字节码 javac HelloWorld.java # 运行:注意这里不要加 .class 后缀 java HelloWorld第一行命令如果没报错,你会看到目录里多出一个HelloWorld.class文件,这是编译产物。第二行命令执行完,屏幕上出现Hello, Java。到这一步,你已经完成了新手最难的一关:环境、编译、运行三件事全部打通,后面的所有内容都是在同一个流程上不断加料。
3.4 把代码拆开看:每一部分在干什么
public class HelloWorld这句话在声明一个类,类名必须和文件名一致,public表示这个类可以被外部访问。Java 的代码都装在类里面,你现在不用深究“类”是什么,把它当成一个装代码的盒子就行。盒子名字起错了、和文件名对不上,编译直接失败。
public static void main(String[] args)是程序的入口。JVM 运行一个类时,会专门去找这个固定签名的方法,从它的第一行开始执行。少一个static、括号里写错参数类型,都会导致“找不到主方法”的报错。新手不用背,先照着写,写多了自然记住。
System.out.println("Hello, Java");是打印语句,双引号里的内容原样输出,末尾的ln表示输出完换一行。分号是语句结束符,Java 里少一个分号就编译不过。这三行结构你接下来会重复写几百遍,第一次不用全懂,先让它跑起来,理解会跟着练习一起长出来。
4. 入门必学的四个地基:变量、数据类型、运算符、注释
4.1 变量:给数据贴个标签
变量说白了就是给一块内存起个名字,方便你反复用。生活里的类比是储物柜:你租一个柜子,贴上一个标签写上“冬衣”,以后说“冬衣”就是那个柜子。程序里写int age = 18;,意思是申请一块能放整数的空间,贴上标签age,里面放 18。
使用变量有三个动作:声明类型和名字、赋值、使用。这三步可以合成一行,也可以分开写。分开写的时候要注意,局部变量必须先赋值再使用,否则编译报错。这个报错很常见,尤其是你声明了一堆变量,用了其中一个却忘了赋值。
// 声明并赋值:类型 名字 = 值 int age = 18; // 先声明,后赋值,也可以 double score; score = 92.5; // 使用变量:打印时直接写名字 System.out.println(age);命名上,Java 习惯用小驼峰:首字母小写,后面每个单词首字母大写,比如studentName、totalPrice。名字不能用数字开头,不能是关键字,也别用拼音缩写,三个月后你自己都看不懂。这条建议听起来婆婆妈妈,但它能省下大量“这变量是干嘛的”时间。
4.2 八种基本数据类型:什么时候用 int,什么时候用 double
Java 的基本数据类型有八种,新手前期真正高频用的是四个:int、long、double、boolean,再加上表示单个字符的char。选择逻辑不复杂,按“装什么”来定:
| 类型 | 占多大 | 装什么 | 典型场景 |
|---|---|---|---|
byte | 1 字节 | 很小的整数 | 文件字节流、少用 |
short | 2 字节 | 小整数 | 几乎不用 |
int | 4 字节 | 常规整数 | 年龄、数量、编号 |
long | 8 字节 | 大整数 | 时间戳、超大计数 |
float | 4 字节 | 单精度小数 | 少用,精度低 |
double | 8 字节 | 双精度小数 | 金额以外的普通小数 |
char | 2 字节 | 单个字符 | 'A'、'中' |
boolean | 1 字节 | 真或假 | 判断条件、开关 |
写的时候有个细节:long类型的字面量后面要加L,float要加F,不然编译器按int和double处理,赋值时类型对不上就报错。char用单引号,字符串用双引号,这是两个完全不同的东西,混用必报错。
long timestamp = 1700000000000L; // 不加 L 会被当成 int,超出范围报错 float rate = 0.85F; // 不加 F 会被当成 double char level = 'A'; // 单个字符用单引号 String name = "小明"; // 字符串是引用类型,用双引号 boolean passed = true; // 只有 true 和 false 两个值还有一条要早点知道:double做金额计算会出现精度误差,比如0.1 + 0.2不等于0.3。入门阶段你先记住这个结论,别拿double算钱,后面学到专门的高精度类型再换。
4.3 运算符与类型转换:为什么 1/2 等于 0
算术运算符+ - * / %里,最容易翻车的是除法。两个整数相除,结果还是整数,小数部分直接被砍掉,不做四舍五入。所以1 / 2得到 0,不是 0.5。想让结果带小数,得让其中一边变成小数:1.0 / 2才会得到 0.5。
+号还有第二种用法:只要有一边是字符串,它就变成拼接。1 + 2是 3,"1" + 2是"12"。这个差异在打印输出时特别容易搞混,血泪经验是:看到结果不对,先检查参与运算的变量到底是什么类型。
类型转换分自动和强制两种。小范围往大范围转是自动的,int转double没问题;大范围往小范围转必须强转,要写括号,而且可能丢精度:
int a = 1, b = 2; System.out.println(a / b); // 输出 0,整数除法砍掉小数 System.out.println(a / 2.0); // 输出 0.5,有一边是小数 System.out.println("和是" + (a + b)); // 输出 和是3,加括号先算加法 double d = 9.7; int i = (int) d; // 强转,输出 9,小数被截断最后一行那个括号不能省。"和是" + a + b会得到和是12,因为从左往右先拼了字符串,后面的加法就都变成拼接了。这类问题不报错,只是结果不对,属于典型的需要靠练习养出直觉的地方。
4.4 注释和代码规范:写给三个月后的自己
注释是给人看的,编译器会跳过。Java 有三种:单行//、多行/* */、文档注释/** */。入门阶段用得最多的是单行注释,写在难懂的语句上方或右侧,一句话说清“这行在干什么、为什么这么写”。
/** * 计算订单总价(文档注释,可被工具提取成说明文档) */ public class OrderDemo { public static void main(String[] args) { // 单价与数量,单位:元、件 double price = 19.9; int count = 3; // 总价 = 单价 × 数量 double total = price * count; System.out.println(total); } }代码规范这块,新手先守三条就够:类名首字母大写,方法名和变量名小驼峰,每层缩进用四个空格(别用 Tab 混着来)。再加一条:一行只做一件事,别把五六个操作挤在一行里。代码是写给人读的,读得懂才改得动,这个习惯从第一个程序就开始养,成本最低。
4.5 转义字符:换行、制表、引号怎么写
有些字符没法直接敲进字符串,比如换行、制表符、双引号本身。Java 用反斜杠加一个字母表示,这叫转义字符。常用的几个:\n换行、\t制表(对齐用)、\"表示一个双引号、\\表示一个反斜杠。
// \n 换行,\t 制表对齐,\" 输出双引号本身 System.out.println("姓名\t年龄"); System.out.println("小明\t18"); System.out.println("他说:\"我在学 Java\"");注意\t的对齐效果取决于字符宽度,中文和英文混排时未必整齐,别在这上面较劲。真正要记牢的是:字符串里出现反斜杠,就要想想它是不是转义符;路径里写\也要转义成\\,或者干脆用正斜杠/。这个细节在后面读文件、写路径时会反复出现。
5. 新手避坑:这五个坑我替你踩过了
5.1 坑一:命令行提示“不是内部或外部命令”
现象:敲javac HelloWorld.java,命令行回你一句“'javac' 不是内部或外部命令,也不是可运行的程序”。你明明装好了 JDK,甚至java -version还能出结果。
原因:PATH 里只加了java所在的目录,或者根本没配;也有可能是配好了但你没重开命令行窗口,旧窗口读的还是老配置。另一种情况是把 JDK 根目录加进去了,而不是它下面的bin目录。
解决:回到环境变量,确认Path里那条指向的是...\jdk\bin;改完关掉所有命令行窗口,重新开一个再试。还是不行就敲where javac(Mac 用which javac),看看系统到底在哪儿找它。这一步能把“配没配对”变成看得见的事实,比反复重装高效得多。
5.2 坑二:类名和文件名对不上
现象:编译时报“类 HelloWorld 是公共的,应在名为 HelloWorld.java 的文件中声明”,或者“找不到符号”。代码你反复看了三遍,语法确实没问题。
原因:Java 要求一个文件里的public类名必须和文件名完全一致,包括大小写。你文件叫helloworld.java,类写的是HelloWorld,就过不去。还有一种更隐蔽的:Windows 隐藏了扩展名,你以为文件叫HelloWorld.java,实际叫HelloWorld.java.txt。
解决:先把文件扩展名显示出来,确认后缀真的是.java;再逐字比对文件名和类名,大小写也要一致。养成习惯:先想好类名,再用这个名字去建文件,别反过来。
5.3 坑三:中文乱码和中文路径
现象:程序能编译能运行,但打印出来的中文是一堆问号或方块;或者编译时直接报编码相关的错。还有一种情况是装在中文目录下,编译行为诡异。
原因:源文件的保存编码和编译器默认读取的编码不一致。Windows 上记事本有时会存成某种本地编码,而编译器按另一种编码去读,中文就乱了。中文路径则会在某些工具链里引发解析问题。
解决:把源文件统一存成 UTF-8,编译时显式指定编码:
# 指定用 UTF-8 读取源码,避免中文乱码 javac -encoding UTF-8 HelloWorld.java同时把代码目录移到纯英文路径下,比如D:\code。这两条一起做,能解决九成以上的乱码问题。剩下的那一成,通常是编辑器保存时又偷偷换了编码,回头检查一下保存设置。
5.4 坑四:整数除法和小数精度
现象:算平均分,五个人的总分是 440,除以 5 应该得 88,结果对;换成总分 441 除以 5,你期望 88.2,输出却是 88。算钱的时候更离谱,0.1 + 0.2打出来是0.30000000000000004。
原因:两个int相除,结果还是int,小数部分被直接丢弃;double用二进制表示小数,某些十进制小数天生存不准。这两个都不是 bug,是语言本身的规则。
解决:要小数结果,就让参与运算的至少一边是浮点类型,比如441 / 5.0,或者先强转(double) 441 / 5。涉及金额,入门阶段先用“分成”为单位存整数,等学到高精度类型再换。这个坑不报错,只给你错的结果,所以每次看到“数值不太对”,第一反应就该查类型。
5.5 坑五:用 == 比较字符串
现象:两个字符串内容看起来一模一样,用==比较却返回false,判断逻辑整个跑偏。
原因:==比较的是引用,也就是这两个变量是不是指向同一块内存,而不是比较里面的字是不是一样。字符串内容相同但来源不同,很可能指向两个不同对象,结果就是false。
解决:比较字符串内容统一用equals:
String a = "java"; String b = new String("java"); System.out.println(a == b); // false,比的是引用 System.out.println(a.equals(b)); // true,比的是内容这个坑的隐蔽之处在于,有时候==恰好返回true,让你以为写对了,换个场景就翻车。所以别赌,记住一条:字符串比内容,永远用equals。
6. 下一步学什么:从语法到能写小工具的路线图
第一个程序跑通、变量和类型摸过一遍之后,最容易犯的错是“什么都想学”。今天看多线程,明天翻框架,结果每个都停在第一章。我带新人的时候见过太多这种情况,最后能坚持下来的,都是把路线收窄、按顺序推进的人。
入门阶段建议按这个顺序走,每一阶段都配一个能看见结果的小目标:
| 阶段 | 学什么 | 小目标 |
|---|---|---|
| 第一段 | 变量、数据类型、运算符、输入输出 | 写一个能算总价和找零的控制台程序 |
| 第二段 | 分支if/switch、循环for/while | 打印九九乘法表、猜数字小游戏 |
| 第三段 | 数组、方法(函数)定义与调用 | 把重复代码抽成方法,做成绩统计 |
| 第四段 | 类与对象、封装、继承、多态 | 用面向对象重写前面那个成绩统计 |
| 第五段 | 集合、异常处理、常用类 | 做一个能增删改查的控制台通讯录 |
这张表的关键不在内容多少,而在每一段都有“能跑出来给人看”的产物。编程是手上功夫,看十遍不如敲一遍。我的建议是每学一个知识点,立刻把它塞进你正在写的小程序里,哪怕只是个打印语句。你会发现,看教程时觉得懂了的东西,一动手就漏。
具体到这份笔记,它的章节顺序本身就是一条循序渐进的路径:先讲课程全貌和就业方向,让你知道学完能去哪儿;再讲 Java 概述、JDK 安装、环境变量、第一个程序,把地基打牢;然后进入变量、数据类型这些真正的语法内容。跟着它的节奏走,不要跳章,尤其是环境配置那几节,跳过去后面每一步都会难受。
还有一个很实用的小习惯:给自己建一个“错题本”。不用多正式,一个文本文件就行,每次报错就把报错信息、原因、怎么改的三行记下来。新手期的报错其实就那么几十种,记满一页之后你会发现,大部分红字你都认识了,心态会稳很多。
最后说个我自己的教训。我刚开始学的时候,总觉得报错是坏事,一看到红字就烦,习惯性地把代码删掉重写,结果同一个错误反复出现。后来我强迫自己每遇到一次报错,先读懂它说了什么,再动手改,改完在错题本上留一行。从那以后我每次写新程序,都会先把编译和运行的命令完整走一遍,确认环境没问题再写业务逻辑,反而快了很多。希望这份路线能帮你少绕几个弯,也希望你能早点跑出属于自己的那第一行输出。
本文还有配套的精品资源,点击获取