☕ 第三章 面向对象(上)

3.1 面向对象的思想

📄 一句话概括

面向对象 = 把"数据"和"会做的动作"打包成一个东西来思考和编程。类是图纸(抽象定义),对象是照图纸造出来的实物(实例)——Java 这门语言的整个招牌就立在"面向对象"四个字上。

前置知识:2.6 方法(动作打包)、2.7 数组(数据成排)——面向对象把这两样装进同一个"家"。


1. 从"面向过程"说起

前两章你写的代码全是面向过程风格:main 从头执行到尾,一步一步指挥——先这样、再那样、然后这样。这就像自己在家做一顿饭:

面向过程(自己做):买菜 → 洗菜 → 切菜 → 开火 → 炒菜 → 装盘
        每一步都得自己动手,自己盯流程

能吃,但问题明显:明天下馆子还得把这套流程再来一遍;菜谱一改,每个自己做饭的人都得跟着改。

面向对象的思路不一样:

面向对象(下馆子):找到"厨师"这个对象 → 喊一声"来份鱼香肉丝" → 等上菜
        你不关心他怎么洗怎么炒,只管下指令

对象的内部爱怎么复杂怎么复杂,对外只留"喊一声就能用"的接口——这就是面向对象的核心便利:复杂度被装进了对象肚子里。

📝 重要认知

面向对象不是替代面向过程——对象肚子里的方法(厨师怎么做菜)依然是面向过程的一步步。它是在过程之上多了一层组织方式:先把世界拆成一个个对象,再让对象之间协作。

2. 对象:身边到处都是

对象 = 现实中一个具体的、看得见摸得着的东西。你桌上的一切都是对象:这瓶水、这部手机、这只猫、昨天写完的 Demo08。

每个对象都由两部分构成:

部分 叫什么 例:一部手机 例:一只猫
它有什么 属性(数据) 品牌、价格、电量 名字、毛色、年龄
它会做什么 行为(动作/方法) 打电话、拍照、充电 叫、吃、抓老鼠

回顾一下:属性就是变量(2.2 的格子),行为就是方法(2.6 的积木)——面向对象只是把这两样装进同一个包装,让"这部手机"作为一个整体存在。

3. 类:造对象的图纸

对象千千万,总不能每个都从零描述。观察 100 部手机会发现:属性都是那几样(品牌/价格/电量),行为都是那几样(打电话/拍照)——不同的只是具体值。

于是把这套共同的定义抽出来,就是类(class):

类:手机(图纸)          对象:一部部具体的手机(实物)
  属性:品牌、价格、电量        张三的手机(华为 / 5999 / 80%)
  行为:打电话、拍照            李四的手机(小米 / 3999 / 55%)

关系三句话(对应上面那张图):

  1. 类是抽象的——只定义"有哪些属性、哪些行为",没有具体值,图纸不能开车
  2. 对象是具体的——每个属性都有真值,是照图纸 new 出来的实例
  3. 类只有一份,对象可以造无数个——new 一次造一个,每个对象的属性值各自独立
💡 实例 = 对象

"实例(instance)"和"对象(object)"日常混用不区分:由某个类造出来的对象,就叫这个类的一个实例。听到"实例化"就是"照着图纸造一个实物"(new 的过程)。

4. 这个思想,你其实早就在用了

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. 常见误区小结

⚠️ 误区 1:把类当成对象用

类是图纸,不能直接喊它干活(图纸不能开)。得先 new 出实物,再对实物操作。这是新手第三章第一个编译坎。

⚠️ 误区 2:以为面向对象 = 全新的编程语言

不是。语法全是学过的:属性 = 变量、行为 = 方法、调用 = 2.6 的喊法。变的只是组织思路。

⚠️ 误区 3:以为面向对象彻底淘汰面向过程

不会。对象肚子里装的方法依然是过程式的一步步;简单脚本用面向过程写照样对。两者是层级关系不是替代关系。

⚠️ 误区 4:类和实例的关系记反

先有类(图纸)后有对象(实物);改图纸不影响已造好的实物(除非以后学到别的机制,先记这条)。


8. 自测题

❓ Q1:用自己的话说出"面向过程"和"面向对象"的区别,各举一个生活例子。

面向过程:自己一步步盯流程(自己在家做菜:买菜洗菜切菜炒菜);面向对象:找到会干活的"东西"喊它干(下馆子喊厨师)。核心区别:复杂度装进对象肚子里,你只管下指令。

❓ Q2:类和对象是什么关系?"实例化"是什么意思?

类是抽象图纸(只有属性/行为的定义,没有具体值),对象是照图纸 new 出来的具体实物(属性有真值)。实例化 = 用 new 照着类造一个对象的过程;造出来的这个实物就叫该类的一个实例。

❓ Q3:给"狗"这个类列 3 个属性、3 个行为。属性和行为分别对应你学过的哪两样东西?

属性:名字、毛色、年龄;行为:叫()、吃饭()、捡球()。属性对应变量(2.2 的格子),行为对应方法(2.6 的积木)。

❓ Q4:`new Car()` 执行了两次,内存里有几份图纸?几辆车?两辆车的颜色会互相影响吗?

图纸(类定义)只有一份;车(对象)有两辆,各自独立、属性值互不影响——张三的车改漆色,李四的车不会跟着变。就像 2.7 里"每辆车各有各的格子"。

❓ Q5:`System.out.println("hi")` 这行你喊了两章的代码里,谁是对象、谁是它的行为?

System.out 是对象(标准输出流对象),println 是它的行为(方法),"hi" 是传进去的实参。你从 1.3 起就一直在面向对象编程了——只是今天才点破。


9. 下一步学什么


10. 相关笔记