「 Java 面向对象系列 01」
本文抛开复杂语法,只搞懂 OOP 底层思想,零基础也能看懂。
我们会从你最熟悉的代码痛点出发,一步步讲清楚:
- 为什么需要 OOP
- OOP 和 POP(面向过程)的本质区别在哪里
- 为什么你早就用过 OOP 却不知道
全文重在思想理解,代码片段仅用来对比感受结构,不需要你动手敲,无上手压力。
一、为什么要学习面向对象?「从一段“让人头疼的代码”说起」
绝大多数 Java 初学者,写的第一段代码是这样的——用一堆零散变量描述几个学生:
// 第一名学生的信息
String stu1Name = "张三";
int stu1Age = 18;
String stu1Class = "高一1班";
// 第二名学生的信息
String stu2Name = "李四";
int stu2Age = 17;
String stu2Class = "高一2班";
只有两三个人时,这么写一点问题都没有,清晰直观,跑得飞快。
但请你想象一个更现实的场景:如果要管理一个年级 200 名学生,每名学生包含姓名、年龄、班级、学号、性别、成绩、班主任、家庭住址等十几个字段……
你打算定义多少变量?stu1Name、stu1Age、stu1Class…… 一直到stu200Address?光是起名就能把人逼疯。
更可怕的是后续维护: 想查 “张三的班主任是谁”?你得在一大堆零散变量里找到stu1Name,再匹配对应的班主任变量。数据没有整体归属,全靠人肉索引。
学校突然要求「为所有学生统一添加一个 grade 年级字段」?你得手动给 200 个学生逐个新增变量,改 200 遍。
这种写法的本质缺陷:不是代码长,不是变量多,而是:只零散地保存了数据,却没有把「属于同一个事物的所有信息」整合到一起。每个学生的数据像散落的拼图碎片,没有整体归属,查询、修改都极其痛苦。
这就是面向过程思维下的数据管理方式:数据是分散的,逻辑按线性顺序执行。小程序没问题,一旦项目规模变大就很难维护。
二、用面向对象怎么改?
我们换一种完全不同的思路:先把「学生」这一类事物的所有特征,统一封装成一个通用模板。后续要哪个学生,就从模板生成一个具体的 “实例”。
💡重要提醒:类只是模板(相当于图纸),图纸本身不存储真实数据,new出来的对象实例才真正保存学生的数据。
为了让大家先直观感受差距,我提前贴出面向对象的标准写法。目前完全不用纠结任何语法细节,只需简单对比,感受「整合式模板」和「零散变量」在组织方式上的区别即可。所有语法细节,下一篇会手把手逐行拆解。
// 面向对象写法:统一封装学生模板,按需创建对象
// 1. 先定义通用学生模板(称为“类”,下篇细讲)
class Student {
String name; // 姓名
int age; // 年龄
String className; // 班级
}
// 2. 根据模板创建具体学生对象
public class Test {
public static void main(String[] args) {
Student stu1 = new Student();
stu1.name = "张三";
stu1.age = 18;
stu1.className = "高一1班";
Student stu2 = new Student();
stu2.name = "李四";
stu2.age = 17;
stu2.className = "高一2班";
}
}
看一眼就够,不用深究。你能明显感受到:所有学生的信息不再是散落的变量,而是被整齐收纳在统一模板中。
三、很多新手会问:代码没变少,凭什么说它好?
这是一个非常关键且真实的疑问,必须正面回答。
看上面代码:面向对象写法并没有比零散变量少写几行,甚至因为多了class Student的定义,代码量还变多了。那凭什么说面向对象更好?
明确回答:面向对象的优势,从来不是 “少写代码”,而是结构规整、便于扩展、极易维护,专门用来扛复杂大型项目。
两种写法的核心差距,不在代码行数,而在数据管理方式:
| 零散变量 | 每个属性都是独立变量,散落各处,无整体归属 | 给200个学生逐个加变量,改动200处 | 逐个修改200处,极易遗漏 |
| 面向对象 | 所有属性统一打包在模板中,每个学生是完整独立对象 | 仅在 Student 类中添加1个字段,后续所有通过该类创建的对象自动拥有该字段,不需要给每一个学生手动添加变量 | 仅修改类中1处,后续新建对象全部生效,无需逐个对象修改 |
⚠️注意:已经 new 出来的旧对象不会自动更新;修改类模板后,只有重新 new 出来的新对象才会拥有新增字段。
200 个学生时,差距是:改动 1 处 vs 改动 200 处。 如果是 2000 个学生、20 个字段,这个差距会被进一步放大。
项目越大、数据越多、业务越复杂,面向对象的结构化优势就越明显。企业级开发全部采用面向对象,不是追逐潮流,不是因为它 “高级”,而是它真的扛得住业务持续迭代。
四、两种核心编程思想:面向过程(POP)vs 面向对象(OOP)
在正式开始对比之前,先明确两个术语:
- OOP = Object‑Oriented Programming,面向对象编程
- POP = Procedure‑Oriented Programming,面向过程编程
编程界主流两种核心思维,理解二者本质区别,就理解了 OOP 存在的根本意义。
1. 面向过程编程:关注「怎么做」
核心思想:自己动手,走完所有步骤。
面向过程把功能拆解成一个个执行步骤,按顺序调用函数完成需求。全程聚焦 “每一步代码怎么写”,所有底层细节都要自己亲手实现。
举个例子:如果我们用面向过程的思维去实现 “键盘输入”,你需要手动处理 IO 流、字节读取、编码转换、换行处理、异常捕获、数据校验…… 底层细节全部要自己一行行敲。
补充:Java本身是面向对象语言,这里只是思维层面举例,C语言是更典型的面向过程语言。
形象比喻:面向过程就像包饺子,从和面、揉面团、擀皮、剁馅、下锅全部自己干,每一个环节都不能省略。
特点:代码繁琐、重复度高、复用性差。一旦需求变更(比如从 “控制台输入” 改成 “文件输入”),整条流程代码都要大幅修改,牵一发动全身,维护成本极高。
2. 面向对象编程:关注「谁来做」
核心思想:找到对的 “实体”,指挥它干活。
面向对象不再纠结繁琐执行步骤,而是先梳理场景中有哪些实体事物,把它们的特征和功能封装成对象,指挥对象去完成工作。
依旧拿 “键盘输入” 举例:Java 官方已经把复杂底层全部封装到Scanner类。我们只需要两行代码:
// 1. 创建 Scanner 对象(根据模板造个实例)
Scanner sc = new Scanner(System.in);
// 2. 指挥对象干活,完成输入功能
int age = sc.nextInt();
我们不需要懂底层 IO 流,不需要手动处理字节转换。Java 已经帮我们封装好了底层处理逻辑,两行代码搞定。 我们从 “亲自写步骤的执行者”,变成了 “指挥对象干活的指挥者”。
形象比喻:面向对象就像去饺子馆,直接跟老板说 “来份饺子”。不用关心怎么揉面、调馅、把控火候,只需要找到对应的 “对象”,调用它的功能即可。
特点:代码极简、复用性强,需求微调只需要改动少量代码。如果将来要从控制台输入切换为文件输入,只需要更换对象,调用方式几乎不变,适配复杂场景非常灵活。
3. 两种思想核心对比
| 面向过程 | 怎么做(执行步骤) | 亲手干活的执行者 | 拆分多个函数,按顺序调用 | 修改一处可能牵动全局,改动成本高 |
| 面向对象 | 谁来做(事物实体) | 指挥对象的指挥者 | 定义各类对象,依靠对象互相配合 | 仅修改对应对象的属性 / 行为,改动范围小 |
五、破除第一个误区:你早就在用 OOP 了
很多初学者觉得「面向对象」是一个陌生、还没学的新知识。我们回头看两段零基础必写的代码,你会发现它们的写法就是标准的面向对象模式,只是当时没人告诉你这叫 OOP。
控制台打印:System.out.println(); System.out 是系统提前创建好的输出对象。System是类,out是它的静态成员变量,是已经实例化好的PrintStream对象。不需要我们手动创建,不用了解底层如何输出,直接调用println()方法即可打印。本质就是指挥现成对象干活。
Scanner 键盘录入 上面演示的 Scanner 代码,就是我们第一次手动创建对象、调用对象方法,是 Java 入门最经典的面向对象案例。
你早就熟练使用 OOP,只是今天才正式认识它。
这正是 OOP 的核心魅力:封装一切复杂底层,开发者只关心 “用什么对象、调用什么方法”,不用重复造轮子。Java 官方把成千上万的底层逻辑封装成现成的类,我们直接拿来使用。
如果你看得懂 Scanner sc = new Scanner(System.in);,就已经跨过 OOP 第一道门槛,只是以前不知道这叫 “创建对象”。
六、破除第二个误区:面向过程不是没用,只是场景不同
学到这里,有的同学会产生误解:“面向过程这么麻烦,C 语言是不是白学了?”
这个想法不对,必须纠正。 两种编程思想没有绝对优劣,只有场景适配的差异。
面向过程:逻辑直接、执行效率高、代码轻量,没有对象相关额外开销。适合简单固定流程、单片机、操作系统内核、硬件驱动开发。这也是 C 语言在嵌入式领域至今无可替代的原因。比如写一个 LED 灯闪烁,面向过程几行就搞定,OOP 反而大材小用。
面向对象:会带来少量对象、虚方法等额外开销,但现代JVM优化后业务开发几乎感知不到。擅长封装复杂业务、代码可复用、易维护,支持团队协作。适合大型企业级项目、电商、金融平台、复杂业务迭代场景。这就是 Java 主打企业后端的原因,不是它多么高级,而是它可以驾驭业务的复杂度。
一句话总结: 小型固定流程、底层硬件开发用面向过程 —— 快、轻、直接。 大型业务开发、团队协作项目用面向对象 —— 稳、清晰、易维护。
我们学习 Java 的 OOP,是适配 Java 的应用场景,而不是否定面向过程的价值。两者都理解,才是完整的编程通识。
注意:面向对象完整四大特性:封装、继承、多态、抽象。本篇只解决思想认知,后续文章再逐一拆解。
全文核心小结
- POP(面向过程):以步骤为核心,数据零散,自己动手实现所有逻辑。
- OOP(面向对象):以数据封装为核心,定义模板(类),指挥对象干活。
- OOP 优势:不是代码变少,而是结构清晰、好维护——改模板一处,新建对象自动生效。
- 认知纠正:OOP 不陌生,System.out 和 Scanner 就是 OOP;POP 也非无用,看场景。
⚖️ 怎么选:底层硬件、轻量流程用 POP;企业业务、复杂大型业务、团队协作用 OOP。两者无优劣,只看场景。
🚀 下篇预告:本篇只搞懂思想,下篇正式落地实操——类怎么定义、对象怎么创建、代码怎么敲。





