Java 形象版:用生活比喻讲一遍
看完这页,回去看《java-知识点》的章节版查细节。先懂再背,不然背完就忘。
1. 类与对象 = 饼干模子 与 饼干
- 类是模子,对象是压出来的饼干。
- 一个模子可以压无数块饼干(
new 多少次就多少块),每块饼干可以有自己的巧克力豆(成员变量)。
- 你改了一块饼干的糖量,别的饼干不受影响(对象各自独立)。
- 但如果两个变量指向同一块饼干(
A a2 = a1;),你动 a2 就是动 a1——这是「引用」。
考试爱考:== 比的是"是不是同一块饼干",equals 比的是"饼干配方一样不一样"。
2. 构造方法 = 出厂设置
- 买手机开箱就有默认壁纸、默认语言——这就是构造方法。
- 名字必须和类名一样,没有返回值(连 void 都不写)。
- 你可以要"高配出厂"(有参构造)和"标准出厂"(无参构造)——这就是构造重载。
- 一旦你自己写了高配出厂,厂家就不送标准出厂了(默认无参构造消失)——这是新手最常踩的坑。
this = "我自己"。this.name = name 就是"我的名字 = 你传进来的名字",用来区分同名变量。
3. 封装 = 手机外壳
- 内部电路(成员变量)用
private 藏起来,只留几个按钮(get/set)。
- 好处:别人不能乱改;你可以在 set 里检查(比如年龄不能是 -5)。
- 一句话:能藏就藏,要用给接口。
4. 继承 = 儿子继承家产
- 儿子自动拥有爸爸的姓、房子(非 private 成员)。
- private 是爸爸的私房钱,儿子拿不到。
- 重写 = 儿子把爸爸的"说话方式"改了:同一个方法名、同样的参数,但行为不同(口音变了)。
- 重载 = 同一个"吃饭",可以"吃饭()"、"吃饭(一碗)"、"吃饭(两碗)"——名字一样参数不同。
- 记忆法:重写是改内容(子类改父类),重载是加花样(同一个类里多版本)。
- super = "我爸"。
super.方法() 调用爸爸的版本,super() 调用爸爸的构造(必须第一行)。
5. 多态 = 同一个指令,不同的反应
- 你喊"叫一声",猫喵、狗汪、鸭嘎——同一条命令,不同对象不同表现。
- 代码里:
Animal a = new Dog(); a.speak(); → 出狗叫。
- 规矩:
- 成员方法看右边(new 的是谁就调谁)
- 成员变量看左边(声明的是什么类型就用谁的)
- 记忆法:方法是"活的",变量是"死的"。
6. 抽象类 = 毛坯房;接口 = 插座标准
- 抽象类:毛坯房,不能直接住(不能 new),得装修(子类实现);但里面可以有水电(普通方法)。
- 接口:墙上的插座标准,不管你是台灯还是电脑,插头对就能用;一个设备可以插多个标准(多实现)。
- 区别(考试背这 4 条):
- 抽象类用
abstract class,接口用 interface
- 类只能单继承,接口可以多实现
- 抽象类可以有构造方法,接口没有
- 抽象类可有普通方法,接口的方法默认是抽象的(JDK8 后有 default)
7. static = 全班共用的黑板擦
- 黑板擦不属于某个学生,属于整个班级(类)。
- 所以:静态方法里不能直接叫某个学生的名字(不能访问非静态成员)——因为不知道是哪个学生。
- 静态代码块 = 开学第一天全班一起做的事,只做一次。
8. 数组 = 一排编号的储物柜
- 柜子数量固定,编号从 0 开始。
length 是柜子总数(属性,不是方法,别加括号)。
- 越界 = 你拿着 6 号钥匙去开 5 个柜子的柜门 →
ArrayIndexOutOfBoundsException。
9. 集合 = 可伸缩的收纳箱
| 集合 | 比喻 | 特点 |
|---|
| ArrayList | 一排带编号的椅子 | 找第 n 个人快,中间插人要把后面全挪一遍 |
| LinkedList | 手拉手的一队人 | 插队容易(松手插进去),找人得从头数 |
| HashSet | 验票口 | 同一张票进不去(去重),顺序不管 |
| TreeMap | 按拼音排好的字典 | 自动排序,找"以 a 开头的"很快 |
| Stack | 一摞盘子 | 后放的先拿(后进先出) |
| Queue | 排队买饭 | 先来的先打(先进先出) |
- 泛型 = 给箱子贴标签:"这个只装苹果"。贴了标签就不会混进香蕉,也不用每次拿出来再确认(不用强转)。
考试爱考:为什么 HashSet 能去重?因为它先比 hashCode 再比 equals——像验票口先看票号再看人脸。
10. 异常 = 火警
try = 正常流程(在厨房做饭)
catch = 着火了怎么办(灭火器)
finally = 不管着不着火,走之前都要关煤气(一定执行)
throw = 主动报警(我这儿有问题!)
throws = 门口贴告示:"本店可能着火,进来小心"(声明可能抛异常)
记忆法:throw 是扔出去,throws 是写在门上的预告。
11. IO 流 = 水管
- 字节流:直接搬水(什么都能搬:图片、视频、文字)
- 字符流:搬之前先过滤(只搬文字,还能按行读)
- 缓冲流:给水管加个蓄水池,一次搬一桶,比一滴一滴快得多
- 记忆法:处理文本用字符流 + 缓冲流,处理图片视频用字节流。
12. 多线程 = 一个厨房多个厨师
- 一个厨房(进程)可以有多个厨师(线程),共用一口锅(共享变量)。
- 两个厨师同时往锅里加盐 → 菜毁了 → 所以要 加锁(synchronized):谁用锅谁挂牌子。
start() = 让厨师开始干活;run() = 你自己替厨师干活(没用,还是单线程)——这就是它俩的区别。
13. 一张图记住整门课
写代码 → 数据怎么放(变量/数组/集合/栈队列)
→ 代码怎么组织(类/继承/接口/多态)
→ 出错怎么办(异常)
→ 数据从哪来(IO)
→ 同时干几件事(线程)
考前自问 10 句(能答上来就稳了)
- 类和对象的区别?构造方法有什么用?
- 重写和重载的区别?(各说一句)
- 多态是什么?成员变量和方法分别看哪边?
- 抽象类和接口的区别?(4 条)
- static 为什么不能访问非 static?
== 和 equals 的区别?
- try-catch-finally 谁一定执行?
- ArrayList 和 LinkedList 怎么选?
- 栈和队列的区别?各用什么方法?
- 为什么线程要加锁?