3.1 面向对象的思想
面向对象 = 把"数据"和"会做的动作"打包成一个东西来思考和编程。类是图纸(抽象定义),对象是照图纸造出来的实物(实例)——Java 这门语言的整个招牌就立在"面向对象"四个字上。
前置知识:2.6 方法(动作打包)、2.7 数组(数据成排)——面向对象把这两样装进同一个"家"。
1. 从"面向过程"说起
前两章你写的代码全是面向过程风格:main 从头执行到尾,一步一步指挥——先这样、再那样、然后这样。这就像自己在家做一顿饭:
面向过程(自己做):买菜 → 洗菜 → 切菜 → 开火 → 炒菜 → 装盘
每一步都得自己动手,自己盯流程
能吃,但问题明显:明天下馆子还得把这套流程再来一遍;菜谱一改,每个自己做饭的人都得跟着改。
面向对象的思路不一样:
面向对象(下馆子):找到"厨师"这个对象 → 喊一声"来份鱼香肉丝" → 等上菜
你不关心他怎么洗怎么炒,只管下指令
对象的内部爱怎么复杂怎么复杂,对外只留"喊一声就能用"的接口——这就是面向对象的核心便利:复杂度被装进了对象肚子里。
面向对象不是替代面向过程——对象肚子里的方法(厨师怎么做菜)依然是面向过程的一步步。它是在过程之上多了一层组织方式:先把世界拆成一个个对象,再让对象之间协作。
2. 对象:身边到处都是
对象 = 现实中一个具体的、看得见摸得着的东西。你桌上的一切都是对象:这瓶水、这部手机、这只猫、昨天写完的 Demo08。
每个对象都由两部分构成:
| 部分 | 叫什么 | 例:一部手机 | 例:一只猫 |
|---|---|---|---|
| 它有什么 | 属性(数据) | 品牌、价格、电量 | 名字、毛色、年龄 |
| 它会做什么 | 行为(动作/方法) | 打电话、拍照、充电 | 叫、吃、抓老鼠 |
回顾一下:属性就是变量(2.2 的格子),行为就是方法(2.6 的积木)——面向对象只是把这两样装进同一个包装,让"这部手机"作为一个整体存在。
3. 类:造对象的图纸
对象千千万,总不能每个都从零描述。观察 100 部手机会发现:属性都是那几样(品牌/价格/电量),行为都是那几样(打电话/拍照)——不同的只是具体值。
于是把这套共同的定义抽出来,就是类(class):
类:手机(图纸) 对象:一部部具体的手机(实物)
属性:品牌、价格、电量 张三的手机(华为 / 5999 / 80%)
行为:打电话、拍照 李四的手机(小米 / 3999 / 55%)
关系三句话(对应上面那张图):
- 类是抽象的——只定义"有哪些属性、哪些行为",没有具体值,图纸不能开车
- 对象是具体的——每个属性都有真值,是照图纸 new 出来的实例
- 类只有一份,对象可以造无数个——
new一次造一个,每个对象的属性值各自独立
"实例(instance)"和"对象(object)"日常混用不区分:由某个类造出来的对象,就叫这个类的一个实例。听到"实例化"就是"照着图纸造一个实物"(new 的过程)。
4. 这个思想,你其实早就在用了
- 2.6 喊了三章的
System.out——它就是个对象,println是它的行为。你一直在对对象喊话 - IDEA 里右键 New → Java Class——你在创建的第一个类(
Demo01~Demo08),只是当时类里只有 main,没定义属性 - 数组变量存地址(2.7)——
arr指向堆里的数据,对象也一样:变量在栈里存地址,实物住在堆里。2.7 埋的"引用类型"伏笔,本章开始收网
Java 的世界万物皆对象:字符串是对象、异常是对象、甚至你以后写的大程序本身也是一堆对象在互相喊话。
5. 为什么 Java 要这么做?(面向对象三大好处)
| 好处 | 意思 | 对应生活 |
|---|---|---|
| 更符合直觉 | 代码按"现实里有哪些东西"来组织,不按"步骤" | 想到"手机"就想到品牌+打电话,天然成块 |
| 复用更强 | 图纸一份,实物无限——加新功能改图纸,所有实物受益 | 出新款:改设计稿,不重造每辆车 |
| 好维护 | 手机坏了修手机,不用检查全世界的电路 | 对象内部怎么改,外面喊话方式不变就行 |
第四章还会正式学到封装、继承、多态三大特性——这一节先让"类与对象"这对概念在你脑子里站住。
6. 动手:思维建模练习(不动键盘也值钱)
练习 1:挑三个身边的东西(水杯、台灯、自行车),各列一张"图纸":
类:台灯
属性:颜色、亮度档位、是否开着
行为:开灯()、关灯()、调亮度()
练习 2:想清楚一个问题:张三的车和李四的车,哪些一样、哪些不一样?(行为一样来自同一张图纸;属性值不一样来自各自 new)
练习 3(预告下一节):图纸用 Java 怎么写?先混个脸熟:
public class Car {
String color; // 属性:颜色
int speed; // 属性:速度
void run() { // 行为:跑
System.out.println("车在跑,时速" + speed);
}
}
看到没——属性就是变量,行为就是方法,你两章前就全学过了。下一节 3.2 就把这段代码敲进 IDEA,new 出第一辆车。
7. 常见误区小结
类是图纸,不能直接喊它干活(图纸不能开)。得先 new 出实物,再对实物操作。这是新手第三章第一个编译坎。
不是。语法全是学过的:属性 = 变量、行为 = 方法、调用 = 2.6 的喊法。变的只是组织思路。
不会。对象肚子里装的方法依然是过程式的一步步;简单脚本用面向过程写照样对。两者是层级关系不是替代关系。
先有类(图纸)后有对象(实物);改图纸不影响已造好的实物(除非以后学到别的机制,先记这条)。
8. 自测题
面向过程:自己一步步盯流程(自己在家做菜:买菜洗菜切菜炒菜);面向对象:找到会干活的"东西"喊它干(下馆子喊厨师)。核心区别:复杂度装进对象肚子里,你只管下指令。
类是抽象图纸(只有属性/行为的定义,没有具体值),对象是照图纸 new 出来的具体实物(属性有真值)。实例化 = 用 new 照着类造一个对象的过程;造出来的这个实物就叫该类的一个实例。
属性:名字、毛色、年龄;行为:叫()、吃饭()、捡球()。属性对应变量(2.2 的格子),行为对应方法(2.6 的积木)。
图纸(类定义)只有一份;车(对象)有两辆,各自独立、属性值互不影响——张三的车改漆色,李四的车不会跟着变。就像 2.7 里"每辆车各有各的格子"。
System.out 是对象(标准输出流对象),println 是它的行为(方法),"hi" 是传进去的实参。你从 1.3 起就一直在面向对象编程了——只是今天才点破。
9. 下一步学什么
- ☑ 3.2 类与对象(已完成)—— class 定义类、new 创建对象、点号使用、栈与堆、null 与空指针:3.2 类与对象
- ☐ 动手作业:完成思维建模练习 1(三张"图纸"),下一节马上用得上
10. 相关笔记
- 2.6 方法 ← 行为就是它
- 2.2 Java中的变量 ← 属性就是它
- 2.7 数组 ← 栈存地址/堆存数据的伏笔,本章收网
- 📇 Java基础 · 索引
- 🏠 返回主页