【问题标题】:What is the difference between object and instance?对象和实例有什么区别?
【发布时间】:2024-01-24 11:00:01
【问题描述】:

我想知道对象和类实例之间的区别。我觉得两者都一样,但是为什么我们用两个名字来称呼。有人可以用现实生活中的例子来解释吗?

【问题讨论】:

  • 不幸的是,这些答案中的大多数都是错误的。所以请全部阅读。
  • @Evan Carroll - 我想我明白你的意思,但这取决于语言,不是吗?可以说instanceobject 的子集吗?
  • @Pascal 用“语言无关”替换“java”标签为这个问题增加了新的复杂性。不幸的是,大多数答案都达不到这种复杂性。例如,参见 cmets 对 Bill 的回答。

标签: language-agnostic oop programming-languages


【解决方案1】:

(编辑:这个问题最初有“java”标签。因此没有类的语言超出了范围。)

对象

一个类的模式(范例)。这 类 Dog 定义所有可能的狗 列出特征和 他们可以有的行为;物体 Lassie 是一只特别的狗, 的特定版本 特征。狗有毛;恋人 有棕白色的皮毛。

实例

可以有一个类的实例; 实例是实际对象 在运行时创建。在程序员 行话,Lassie 对象是 Dog 类的实例。该组 a的属性值 特定对象称为其状态。 对象由状态和 中定义的行为 对象的类。

(Wikipedia, Object-oriented programming)

【讨论】:

    【解决方案2】:

    它们是一样的。在上下文中,“实例”强调它是类定义的实例化这一事实; “对象”强调它是一个独特的实体。

    【讨论】:

      【解决方案3】:

      在大多数面向对象的语言中它们是相同的。 “类的实例”就是“对象”一词的定义方式。

      【讨论】:

      • 不,不是。否则 javascript 和所有其他无类语言(lua 等)将没有对象。而且,他们做到了。请参阅 Dario 的答案以获得最正确的答案。
      • @Evan Carroll:检查问题的编辑历史。我回答时它有java 标签。
      【解决方案4】:

      为了完整起见:prototype-based programming languages 中,类和实例/对象之间没有区别

      如果您要问这个问题,让我们退后一步,您可能只知道基于类的面向对象。它有点像这样。

      1. Class 告诉您您想要拥有什么(数据架构),以及您希望如何对其进行操作(方法)。
      2. 创建一个Object,用它需要的东西(数据)填充它,并使用它定义的操作。

      但是,如果您可以找到不同的方式来回答问题您希望我的对象做什么以及如何做,则您不需要Class 来拥有对象。在称为面向对象的原型的替代模型中,实例是通过克隆现有的(原型)并复制和扩展克隆的行为来创建的。对象没有遵循这种格式的模式。它们只是一组数据和作用于数据的东西。

      【讨论】:

      • 这对于理解问题至关重要,并且被排除在其他答案之外。我认为,如果您的答案在实质上有所增长,那么您将是明显的赢家。这些答案中的大多数都是错误的或偏离了方向。我也正要发布这个参考。您只能实例化一个非对象。说 A 是 A 的实例而 A 是对象是没有意义的 - 但是,我们说 A 是 B 的实例而 B 是类。
      【解决方案5】:

      “对象”、“类对象”和“实例”术语只有历史区别。目前在 Wiki 中甚至有一篇关于所有这些的文章:)

      这里有额外的证明,“对象”和“实例”这两个词是可限定的(来自 Bertran Meyer 的“面向对象的软件构造”):

      属于 ADT 规范描述的对象集合的对象称为 ADT 的实例。例如,满足 STACK 抽象数据类型属性的特定堆栈将是 STACK 的一个实例。

      像 ADT 一样,类是一种类型:它描述了一组可能的数据结构,称为 类的实例。抽象数据类型也有实例;不同的是,一个 ADT 的实例是纯数学元素(某些数学元素的成员 set),而类的实例是一种数据结构,可以在 计算机的内存并由软件系统操作。

      “类”的定义作为副产品产生了“对象”的定义。一个对象是 只是某个类的一个实例。例如堆栈类的一个实例——一个数据 表示特定堆栈的结构——是一个对象; POINT 类的实例也是如此, 表示二维空间中的一个特定点。

      【讨论】:

        【解决方案6】:

        在这种情况下,它们实际上是相同的。 “对象”可以用作一个更笼统/模糊的术语,“实例”通常更具体地用作“类的实例”。

        【讨论】:

          【解决方案7】:

          对象是一个更通用的术语。 C 使用术语对象,即使它根本没有类——从它的角度来看,任何变量(例如)都是对象。

          一些面向对象的语言也没有类。类是指定对象属性的一种方式;给定类的所有对象都共享这些属性。但是,在某些语言(例如 Javascript、Self)中,您不必在类中指定这些属性。相反,从一个对象(“示例”)开始,从中克隆一个新对象并根据需要对其进行修改。当/如果您在不修改它们的情况下创建多个对象时,您最终可能会以某种方式得到一个“类”(具有相同属性的对象),但这或多或少是个意外。

          【讨论】:

            【解决方案8】:

            同样的事情:“对象”实际上是“类的实例”。

            【讨论】:

              【解决方案9】:

              我可以用 python 来最好地说明这一点,所以这里是: 在 Python 中,您可以创建一个类。让我们称之为Person 类。然后创建Person 类的实例。让我们称他为鲍勃。所以bob = Person()。问题是,bobPerson 都是对象。当您执行Person() 时,实际上是在调用Person class 对象上的构造函数,它为您提供了一个instance 对象——即bob

              【讨论】:

              • 为了增加乐趣—— Person 类也是一个对象。 :)
              【解决方案10】:

              instance 当你想强调一个对象是从给定的类型或类创建的。

              Wikipedia上查看此段:

              在每个对象都是从一个类创建的语言中,一个对象被称为该类的一个实例。如果每个对象都有一个类型,那么具有相同类的两个对象将具有相同的数据类型。创建类的实例有时称为实例化类。

              对象的真实示例是“my dog”,它是称为“dog”的类型(类)的实例,它是“animal”类的子类。

              【讨论】:

              • +1。其他人都在说“一个对象是一个类的一个实例”,这是真的。但他们也在说,“所以他们是一回事。”不完全的。 of a class 告诉我们“instance”具有“object”所没有的关系内涵,即使每个对象都是一个对象的实例化(或者,在某些语言中,更多)类。
              • 其实这不是真的。有些语言实现了没有类的对象。
              • @evan "在一种语言中,每个对象都是从一个类中创建的"