1. 简介
在本教程中,我们将讨论面向对象编程中两个基本概念之间的区别:对象和类。面向对象编程
2. 面向对象编程
面向对象编程或OOP是一种计算机编程模型,它侧重于“是什么”而不是“如何”。 在其中,我们将代码组织成数据,而不是其他范例,例如函数式编程,在这种范例中,我们将设计基于可以对输入执行的操作。
基于OOP的设计构建块是类、对象、属性和方法:
3. 类与对象
属性是对象所具有数据的独立部分。方法是我们可以在对象上执行的操作。 但是,什么是类和对象,它们有什么区别?
3.1. 作用
类与对象在整体设计中的作用不同。
因此,类是一个模板,我们使用它来在程序中创建尽可能多的对象。 它定义了对象的相关属性(属性)和行为(方法)。 类的对象是每个符合类规范并具有其定义的全部属性和方法的实体。
让我们通过一个例子来了解。
3.2. 示例
假设我们将人类建模为一个名为Person的类。 我们可以定义以下四个属性,每个人在我们的应用程序中都会拥有
- 名称
- 年龄
- 工作状态
- 性别
当然,我们可以添加其他属性,例如姓氏、身高或体重。 但是,关键在于类应该仅定义对我们的软件相关的那些属性。 因此,如果我们需要编写一个只需要知道每个人以上四个事情的程序,我们应该仅将它们定义为类的属性。
接下来,我们定义两种方法来模拟人可以使用这些属性执行的操作
- 获得新工作()
- 辞去当前工作()
如果一个人获得新工作,我们将调用获得新工作()方法。 它会将属性工作状态从失业更改为已就业。 同样,要将状态改回失业,我们将调用辞去当前工作()方法。
示意图如下是我们的类
现在,让我们创建这个类的两个对象
正如我们所见,它们的属性在创建时具有特定值。
总而言之,我们称类为用户定义的类型,而我们可以将该类的对象视为该类型的变量。
3.3. 定义 vs. 实例化
我们可以说类永远不会被创建,并且仅被定义。 这意味着类是现实世界实体的抽象模型,因此它只能有一个定义。 它不能存在于其对象之中,只能描述它们。 我们需要在编译/执行之前完全定义类。
相反,对象模拟现实世界中的实体。 因此,我们说它们可以被创建,这是一种我们称之为实例化的过程。 这发生在运行时。
3.4. 属性
要创建一个对象,我们需要为它的类指定的属性分配特定值。
相反,要定义一个类,我们需要列出它的对象应该具有的所有属性和方法。 对于每个属性,我们需要指定它的名称和类型。 在大多数编程语言中,我们还使用各种访问修饰符来限定每个属性,例如Java中的private或public。 这些修饰符确定属性和方法是否可以从类及其对象外部访问。
3.5. 继承
类可以互相继承。 子类包含其父类的定义。因此,父类的属性和方法也存在于其子类中。这有一个前提条件:父类的属性和方法必须是可继承的。例如,Java 中的私有方法在子类中不可见。
另一方面,我们不会说对象互相继承。相反,对象的类型是它们所属的类。如果我们将对象 x 实例化为类 A 的实例,并且让 B 是 A 的父类,我们会说 x 是类型 A 和 B。由于 A 更具体,我们将 x 声明为类型 A 的变量,但将它视为类型 B 的对象也是正确的。我们可以将这称为 多态。
3.6. 可变性
定义后,我们无法更改类。这是大多数此类语言中面向对象编程的运作方式。
另一方面,我们可以在实例化后更改对象。这意味着我们可以更改它们的属性。前提是它们的类定义允许我们这样做。
从这个角度来看,类是静态的,而对象是动态的构造,因为前者不能但后者可以在代码执行期间改变。
3.7. 内存
一旦我们创建一个对象,操作系统就会为其分配内存。对象通常位于进程内存布局的堆区。
类的定义也占用少量内存,但实际管理取决于编程语言。在 C++ 中,我们将类定义存储在进程代码段中。在 Java 中,类被视为与对象相同,因此它也位于堆中。
4. 差异总结
让我们快速总结一下类和对象之间的区别。下表突出了两者之间的关键差异
| \textcolorwhite类 | \textcolorwhite对象 |
|---|---|
| 抽象模型 | 特定的实体 |
| 一种类型 | 一个变量 |
| 一个模板(或蓝图) | 模板的一个实例 |
| 无法更改 | 可以修改 |
| 定义属性类型 | 指定属性值 |
5. 结论
在本文中,我们回顾了面向对象编程及其两个基本构造:类和对象。
类是对具有共同定义和共同属性和方法的实体组的正式描述。它充当这些实体的编程模板,我们称之为对象。类定义了对象是什么,它将具有什么属性以及它将如何表现。因此,对象是类的实例,并且始终符合其类模型的模板。