我教编程这些年,遇到最多的一句话就是“类和对象我背了八百遍,一写代码就懵”。其实这事不怪你,因为很多教材把“类 Class”讲得像在背法律条文:“类是现实世界事物的抽象,是具有相同属性和行为的对象的集合……”你读完了,脑子里只剩下“抽象”两个字,更晕了。
我用大白话给你翻译一下:类就是一张图纸,对象是按图纸造出来的那个真东西。 就这么简单。这篇文章不跟你绕弯子,我会用模具、饼干、咖啡馆、学生档案这些生活里随处可见的例子,把类 Class 和对象彻底讲明白。不管你是刚翻开编程书的新手,还是学了一个学期还在跟 this、new、self 搏斗的同学,看完这篇,你应该能松一口气。
1. 先从生活里找“类”:你真的天天都在用
很多人觉得“类”是编程里才有的高深玩意儿,其实你生活里早就在用了。想想饼干模具:一套模具是星星形状的,你用面团一压,出来一块星星饼干;再压一次,又出来一块一模一样的星星饼干。那块模具既不是第一块饼干,也不是第二块饼干,但它规定了所有星星饼干的共同点——大小、形状、花边。饼干模具就是类,每一块被压出来的饼干就是对象。
再举个更贴近日常的例子。奶茶店的菜单上写着“珍珠奶茶,20元,可加冰、可选糖度”,这行字贴在墙上,你看半天也不会喝到嘴里。只有你点单之后,店员一通操作,端出那杯加了冰、三分糖的珍珠奶茶,这才是一杯能喝的“对象”。菜单是类,每一杯按菜单做出来的奶茶,就是对象。
1.1 模具与饼干:最容易被记住的一组比喻
为什么说模具和饼干的比喻最好用?因为它把“类”的两个关键特点都讲清楚了。
第一个特点:类规定了对象“长什么样”。如果模具是圆的,你不可能压出一块方形的饼干。放到代码里就是:类里定义了属性,那这个类创建出来的每个对象,都得有这些属性。你写了一个“学生”类,里面有学号、姓名、成绩,那么系统里就不可能出现一个没有学号的“学生”对象,至少形态上它必须为你留出这个位置。
第二个特点:类只负责规定,不负责具体的“内容”。模具本身不是饼干,菜单本身不能喝。类也一样,它只是模板,你往属性里填不同的值,就得到一个个不同的对象。张三是学生类的对象,李四也是学生类的对象,但张三的分数是95,李四的分数是72,数据完全不同,可他们拥有相同的结构。
1.2 为什么有“类”会让写代码更轻松
你可能会问:如果只是少写几行重复定义,好像也没那么神?那我把真实项目里的场景说得再直白一点。
假设你做一个学校管理系统,有三千个学生。没有类的做法是:每个学生的信息你都单独开几个变量,名字叫 student1_name、student1_score、student2_name、student2_score……三千个学生得写一万多个变量,代码乱成一锅粥,改个需求你能加班到天亮。而有了类之后,你只需要写一个“学生”类,然后在需要时通过它不断创建新对象,代码量成倍减少,结构还特别清爽。
更重要的是可维护性。后来学校说要增加一个“家长联系方式”字段,没有类的话,你得去所有学生变量的位置一处一处加;有类的话,80% 的改动都集中在类定义这一处,其他地方几乎不用碰。这就是“统一模板”带来的好处,也是工程上把代码组织成类的根本原因:把重复的东西收拢起来,把变化的东西留给对象。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 对象是“活”的那个:类负责规定,对象负责存在
类只是“规定”,真正在程序里干活的是对象。你可以把类想象成一张写满了设计和规范的文件,它静静地躺在代码里,不占运行内存的“现实空间”;而当你使用 new 或者创建对象的语法时,程序才真正在内存里给它划分一块区域,这块区域里有实实在在的数据。
我自己带学生时特别喜欢用“咖啡馆点单”来讲这一段。菜单放在收银台前,它描述了所有饮品,但客人面前那杯热气腾腾的拿铁,才是真正被“制作出来”的对象。程序运行时处理的是这一杯一杯的具体咖啡,而不是抽象意义上的那本菜单。
2.1 实例化:从模具到成品的那一刻发生了什么
从类到对象的过程,专业术语叫“实例化”。很多人被这个词吓到,其实它想表达的就是那句话:按图纸造东西。
在代码里,比如 Python 写 s = Student("张三", 95),或 Java 写 Student s = new Student("张三", 95);,这行语句召回了这个过程:
第一步,在内存里给你这个对象分配一块空间,相当于准备好一个放着模具的工作台。第二步,
