1. 引言

在本篇文章中,我们将深入讲解面向对象编程(Object-Oriented Programming,OOP)中两个最基础、也最容易混淆的概念:类(Class)对象(Object)

这两个概念构成了 OOP 的核心基础,理解它们的差异和各自角色,对于写出结构清晰、易于维护的代码至关重要。

2. 面向对象编程概述

面向对象编程(OOP)是一种以“数据为中心”的编程范式。它强调的是“我们处理的是什么”,而不是“如何处理”。这与函数式编程等其他编程范式形成了鲜明对比。

在 OOP 中,类、对象、属性和方法 是构建程序的四大基本元素:

OOPS Building Blocks

3. 类 vs. 对象

属性是一个对象所拥有的数据的一部分,方法则是对象可以执行的操作。那么,类和对象之间到底有什么区别呢?

3.1. 角色差异

类是模板,对象是根据这个模板创建出来的具体实体。

类定义了一组对象应具备的属性和行为(方法),而对象则是类的一个具体实例。

举个例子,我们可以定义一个类 Person,它表示“人”的通用结构。而 person1person2 就是这个类的两个具体实例(对象)。

3.2. 示例说明

我们以 Person 类为例,假设它包含以下属性:

  • name(姓名)
  • age(年龄)
  • jobStatus(职业状态)
  • gender(性别)

再定义两个方法:

  • getNewJob():找到新工作,将 jobStatus 设为 "employed"
  • leaveCurrentJob():离职,将 jobStatus 设为 "unemployed"

类的结构如下图所示:

Person

接下来我们创建两个对象:

Object

可以看到,这两个对象的属性值是具体的,是类定义在运行时的具象化。

总结一句话:类是用户定义的类型,对象是该类型的变量。

3.3. 定义 vs. 实例化

  • 类只有定义,没有创建。它是一种抽象模型,在代码编译前就已经确定。
  • 对象是类的实例化结果,发生在运行时

也就是说,类是“蓝图”,对象是根据蓝图盖出来的“房子”。

3.4. 属性管理

  • 定义类时,我们要声明所有属性的名称、类型以及访问权限(如 Java 中的 privatepublic 等)。
  • 创建对象时,我们需要为这些属性赋具体值。

3.5. 继承关系

  • 类之间可以继承。子类可以继承父类的属性和方法(非 private 的)。
  • 对象之间没有继承关系,但它们的类型(即类)可以构成继承链。

例如,对象 x 是类 A 的实例,类 A 继承自类 B,那么 x 同时是 AB 类型的实例。这种特性称为 多态(Polymorphism)

3.6. 可变性

  • 类一旦定义完成,就不能再改变(至少在标准 OOP 中是这样)。
  • 对象可以在创建后修改其属性值,前提是类允许这样做。

因此,类是静态的结构定义,对象是动态的数据实体。

3.7. 内存分配

  • 对象在堆内存中分配空间
  • 类的定义在编译时处理,其内存管理因语言而异:
    • C++ 中类定义放在代码段(code section)
    • Java 中类本身也作为对象存在,放在堆中

4. 类与对象的区别总结

特性 类(Class) 对象(Object)
抽象性 抽象模型 具体实体
类型 类型 变量
作用 模板/蓝图 模板的实例
可变性 不可变 可变
属性 定义属性类型 指定属性值

5. 总结

类与对象是面向对象编程的基石。理解它们的区别,有助于我们更好地组织代码结构、设计系统架构。

  • 类是对一组具有相同属性和行为的对象的抽象描述
  • 对象是类的具体实例,它遵循类的定义,并拥有自己的状态(属性值)

一句话总结:类定义了对象的结构和行为,对象是类的运行时体现。


如果你在开发中经常遇到类与对象混淆的问题,建议多画 UML 图或类图来辅助理解。这有助于你更清晰地看到类之间的关系,以及对象是如何在系统中流转的。


原始标题:Class vs. Object in OOP