1. 引言
在本篇文章中,我们将深入讲解面向对象编程(Object-Oriented Programming,OOP)中两个最基础、也最容易混淆的概念:类(Class) 与 对象(Object)。
这两个概念构成了 OOP 的核心基础,理解它们的差异和各自角色,对于写出结构清晰、易于维护的代码至关重要。
2. 面向对象编程概述
面向对象编程(OOP)是一种以“数据为中心”的编程范式。它强调的是“我们处理的是什么”,而不是“如何处理”。这与函数式编程等其他编程范式形成了鲜明对比。
在 OOP 中,类、对象、属性和方法 是构建程序的四大基本元素:
3. 类 vs. 对象
属性是一个对象所拥有的数据的一部分,方法则是对象可以执行的操作。那么,类和对象之间到底有什么区别呢?
3.1. 角色差异
类是模板,对象是根据这个模板创建出来的具体实体。
类定义了一组对象应具备的属性和行为(方法),而对象则是类的一个具体实例。
举个例子,我们可以定义一个类 Person
,它表示“人”的通用结构。而 person1
和 person2
就是这个类的两个具体实例(对象)。
3.2. 示例说明
我们以 Person
类为例,假设它包含以下属性:
- name(姓名)
- age(年龄)
- jobStatus(职业状态)
- gender(性别)
再定义两个方法:
getNewJob()
:找到新工作,将jobStatus
设为 "employed"leaveCurrentJob()
:离职,将jobStatus
设为 "unemployed"
类的结构如下图所示:
接下来我们创建两个对象:
可以看到,这两个对象的属性值是具体的,是类定义在运行时的具象化。
✅ 总结一句话:类是用户定义的类型,对象是该类型的变量。
3.3. 定义 vs. 实例化
- 类只有定义,没有创建。它是一种抽象模型,在代码编译前就已经确定。
- 对象是类的实例化结果,发生在运行时。
也就是说,类是“蓝图”,对象是根据蓝图盖出来的“房子”。
3.4. 属性管理
- 定义类时,我们要声明所有属性的名称、类型以及访问权限(如 Java 中的
private
、public
等)。 - 创建对象时,我们需要为这些属性赋具体值。
3.5. 继承关系
- 类之间可以继承。子类可以继承父类的属性和方法(非 private 的)。
- 对象之间没有继承关系,但它们的类型(即类)可以构成继承链。
例如,对象 x
是类 A
的实例,类 A
继承自类 B
,那么 x
同时是 A
和 B
类型的实例。这种特性称为 多态(Polymorphism)。
3.6. 可变性
- 类一旦定义完成,就不能再改变(至少在标准 OOP 中是这样)。
- 对象可以在创建后修改其属性值,前提是类允许这样做。
因此,类是静态的结构定义,对象是动态的数据实体。
3.7. 内存分配
- 对象在堆内存中分配空间。
- 类的定义在编译时处理,其内存管理因语言而异:
- C++ 中类定义放在代码段(code section)
- Java 中类本身也作为对象存在,放在堆中
4. 类与对象的区别总结
特性 | 类(Class) | 对象(Object) |
---|---|---|
抽象性 | 抽象模型 | 具体实体 |
类型 | 类型 | 变量 |
作用 | 模板/蓝图 | 模板的实例 |
可变性 | 不可变 | 可变 |
属性 | 定义属性类型 | 指定属性值 |
5. 总结
类与对象是面向对象编程的基石。理解它们的区别,有助于我们更好地组织代码结构、设计系统架构。
- 类是对一组具有相同属性和行为的对象的抽象描述。
- 对象是类的具体实例,它遵循类的定义,并拥有自己的状态(属性值)。
一句话总结:类定义了对象的结构和行为,对象是类的运行时体现。
如果你在开发中经常遇到类与对象混淆的问题,建议多画 UML 图或类图来辅助理解。这有助于你更清晰地看到类之间的关系,以及对象是如何在系统中流转的。