对象和实例有什么区别?

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

1
不幸的是,这些答案中大多数都是错误的。因此请阅读它们所有的内容。 - Evan Carroll
1
@Evan Carroll - 我想我理解你的观点,但这取决于语言,不是吗?可以说“实例”是“对象”的子集吗? - Mark Ransom
@Pascal 将“java”标签替换为“language-agnostic”给这个问题增加了一个新的复杂度层次。不幸的是,大多数答案都无法达到这种复杂度。例如,请参见对Bill答案的评论。 - sfussenegger
10个回答

9
在大多数面向对象的编程语言中,“类的实例”和“对象”是同一个东西。“类的实例”只是“对象”这个术语的定义。

2
不是这样的。否则 JavaScript 和其他无类语言(如 Lua 等)就不会有对象了。而它们确实有对象。请参见 Dario 的答案,这里是最正确的答案。 - Evan Carroll
3
请查看问题的编辑历史记录。在我回答时,它带有“java”标签。 - Bill the Lizard

5

(编辑:本问题最初带有“Java”标签,因此没有类的语言超出了范围。)

对象

类的模式(示例)。 Dog类通过列出可能拥有的特征和行为来定义所有可能的狗; Lassie对象是一个具体的狗,具有特定版本的特征。狗有皮毛;Lassie对象有棕白色的皮毛。

实例

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

维基百科,面向对象编程


5

为了完整起见:基于原型的编程语言中没有区分类和实例/对象

如果你问这个问题,那么让我们退一步,你可能只知道基于类的面向对象编程。它大致是这样工作的:

  1. Class 告诉你想要什么(数据模式)以及如何操作它(方法)。
  2. 创建一个 Object,填充它所需的内容(数据),并使用定义在它上面的操作。

然而,如果你可以找到另一种回答“你想让我的对象做什么以及如何做”的方式,你就不需要一个 Class 来拥有一个对象。在一种叫做 原型对象导向 的替代模型中,实例是通过克隆现有实例(原型)并复制和扩展克隆的行为来创建的。在这种格式中,对象没有遵循任何模式。它们只是一组数据和对数据进行操作的东西。


这是理解问题所必需的,也是其他答案中被排除的。我认为如果你的答案再充实一些,你就会成为显而易见的赢家。大多数答案都是错误的或者完全偏离了题目。我正要发布这个参考资料。你只能实例化一个非对象。说A是A的一个实例并且A是一个对象是没有意义的 - 然而,我们说A是B的一个实例并且B是类。 - Evan Carroll

4
"object"、"class object"和"instance"这些术语只有历史上的区别。目前,甚至在维基百科上都有一篇文章来解释它们的关系:)
以下是一些证明"object"和"instance"是相等的证据(摘自Bertran Meyer的《面向对象软件构造》):
一个属于由ADT规范描述的对象集合的对象被称为ADT的实例。例如,满足STACK抽象数据类型属性的特定堆栈将成为STACK的实例。
像ADT一样,类也是一种类型:它描述了一组可能的数据结构,即类的实例。抽象数据类型也有实例;不同之处在于,ADT的实例是纯数学元素(某个数学集合的成员),而类的实例是可以在计算机内存中表示并由软件系统操作的数据结构。
“class”的定义产生了“object”的定义。对象就是某个类的实例。例如,STACK类的实例——代表特定堆栈的数据结构——是一个对象;POINT类的实例,代表二维空间中的一个点,也是一个对象。

3

它们是相同的。在上下文中,“instance”强调它是类定义的实例化;“object”强调它是一个独特的实体。


2

在这个上下文中,它们实际上是相同的。 "Object" 可能被用作一个稍微更一般/模糊的术语,"Instance" 通常更具体地用作“类的实例”。


2

对象是一个更加通用的术语。C语言使用对象这个词,尽管它根本没有类 - 从它的角度来看,任何变量(例如)都是一个对象。

有一些面向对象的语言也没有类。类是指定对象属性的一种方式;给定类的所有对象共享这些属性。然而,在某些语言中(例如Javascript、Self),您不需要在类中指定这些属性。相反,从一个对象("示例")开始,从中克隆一个新对象并根据需要进行修改。如果您创建了许多未修改的对象,则可以说你最终以某种方式拥有了一个“类”(具有相同属性的对象),但那几乎是偶然的。


1

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


1
我可以用Python最好地说明这一点,所以让我们开始吧: 在Python中,您可以创建一个类。让我们称之为Person类。然后,您创建Person类的一个实例。让我们称他为Bob。所以bob = Person()。问题是,bobPerson都是对象。当您执行Person()时,实际上是在Person对象上调用构造函数,这会给您一个实例对象,即bob

1
并且为了增加乐趣 - Person类也是一个对象。 :) - Epsilon Prime

1

当你想要强调一个对象是从给定类型或类创建的时,可以使用实例

请参阅维基百科中的这一段:

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

现实世界中的一个对象示例是“我的狗”,它是称为“狗”的类型(类)的实例,该类型是“动物”类的子类。


1
+1. 其他人都在说“对象是类的实例”,这是正确的;但他们也在说,“所以它们是同一件事。” 不完全正确。 “类的”告诉我们,“实例”具有关系内涵,而“对象”则没有,尽管每个对象都是一个(或在某些语言中更多)类的实例化。 - Carl Manaster
事实上,这并不是真的。有些语言在没有类的情况下实现了对象。 - Evan Carroll
在一种每个对象都是从类创建的语言中。 - sfussenegger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接