对象和实例的区别

94

我知道这种问题以前已经被问过了,但我仍然觉得答案对我(以及一些/大多数初学者)来说太模糊了。

我一直在尝试自学编程的更广泛概念,而不仅仅是过程性和基本面向对象编程。我理解面向对象编程的具体概念(你创建一个类,其中包含数据(成员)和函数(方法),然后在运行时实例化该类以实际执行操作,那种东西)。

我认为我已经掌握了类是什么(有点像在编译时创建实例的设计蓝图)。但如果是这样,那么对象又是什么呢?我也知道,在基于原型的语言中,这可能会让事情变得更加混乱,但也许这就是为什么在我的思维中需要清晰区分对象和实例的原因。

除此之外,我对“对象”和“实例”的概念感到困惑。我读过许多资源(包括SO上的答案),它们说它们大体相同,区别在于语义。其他人则说两者之间存在真正的概念差异。
SO的专家能够帮助初学者达到“恍然大悟”的境界,进入面向对象编程的世界吗?
注:这不是作业,我不是学生——然而,我认为这会帮助那些正在寻找作业帮助的人们。

1
我想知道你是否想添加一些额外的问题,比如“所有实例都是对象吗?”和“所有对象都是实例吗?”如果两个问题的答案都是“是”,那么我们可以确认它们是相同的。 - WesternGun
一旦您使用new实例化一个类,那个被实例化的东西就成为了一个对象。对象是可以遵循面向对象编程的封装、多态、抽象原则的,并且是程序与之交互以消耗类中定义的实例成员的真正事物。对象包含实例成员(非静态成员)。因此,类的实例是一个对象。当您提到它的起源时,使用“实例”这个词更清晰,如果您说“类的对象”相比之下就不太清晰了。 - Praveen Tiwari
15个回答

0

让我们比较苹果和苹果。我们都知道什么是苹果。它的外观,味道。这就是一个类。它是一件事物的定义。这是我们对一件事物的了解。

现在去找一个苹果。那就是一个实例。我们可以看到它。我们可以品尝它。我们可以用它做很多事情。这就是我们所拥有的。

类 = 我们对某个事物的了解。一个定义。

对象/实例 = 符合我们所拥有的定义并且可以进行操作的东西。


0
在某些情况下,“对象”一词可能用于描述一个实例,但在其他情况下,它被用来描述对实例的引用。术语“实例”仅指实际实例。
例如,列表可以被描述为对象的集合,但它实际上持有的是对对象实例的引用。

所以在这种情况下,引用只是一个包含指向实例的链接的占位符?这里的链接可能类似于内存地址? - TCCV

0

我一直喜欢将类的定义等同于"抽象数据类型"的概念。也就是说,当你定义一个类时,你正在定义一种新的“某物”的类型,它的数据类型表示以原始数据和其他“某物”为基础,并且它的行为是通过函数和/或方法来定义的。(对于这种泛化和形式化的表述,我感到抱歉)

每当你定义一个类时,你就打开了一个新的可能性,可以定义具有其属性和行为的特定实体。当你实例化和/或创建一个特定对象时,你实际上是实现了这种可能性。

有时候,“对象”和“实例”这两个术语是可以互换使用的。一些面向对象编程(OOP)的纯粹主义者会坚持认为一切都是对象,我不会反驳,但在真正的OOP世界中,我们开发人员使用两个概念:

  1. 类:抽象数据类型的示例,可以从中派生其他ADT并创建对象。
  2. 对象:也称为实例,代表给定抽象数据类型所表示的数据结构和函数的特定示例。

0

我想最好的答案已经被给出了。

类是蓝图,对象是该蓝图的建筑或示例,这对我也很有帮助。

有时候,我认为类就像 MS Word 中的模板,而对象则是使用该模板的文档。


0

面向对象编程是一种系统隐喻,它可以帮助您以更容易开发程序的方式组织程序处理所需的知识。当您选择使用OOP进行编程时,您戴上OOP-Googles,决定将现实世界的问题视为许多对象之间协作发送消息。您不再看到一个人在开车,而是看到一个人向汽车发送消息,指示他想要汽车做什么。汽车是一个大对象,会通过向其引擎或轮子发送消息来响应该消息,以便能够正确地响应驾驶员在消息中告诉它要做的事情,等等...

创建系统隐喻后,您将所有与问题域相关的内容放入PC中,并将现实世界视为发送消息的对象。您会发现有很多人驾驶不同的汽车,单独为每个人编写行为是没有意义的,因为它们都以相同的方式行动... 因此,您可以说两件事:

  • 所有那些人都表现出相同的行为,因此我将创建一个名为Driver的类,该类将指定全世界所有司机的行为方式,因为他们都表现出相同的行为。(并且您正在使用基于类的面向对象编程)
  • 或者你可以说:嘿!第二个司机的行为方式与第一个司机相同,只是他喜欢开得更快一点。第三个司机的行为方式与第一个司机相同,只是他喜欢在驾驶时曲线行驶。(并且您使用基于原型的面向对象编程)。
然后,您开始将所有驱动程序的行为信息(或第一个驱动程序的行为方式以及第二个和第三个与该驱动程序的不同之处)输入计算机。过一段时间后,您就有了自己的程序,并使用代码创建了三个驱动程序,这些驱动程序是您在计算机内部使用的模型,用于引用您在现实世界中看到的驱动程序。您在PC内创建的这3个驱动程序是原型(实际上第一个是原型,根据您建模的方式,第一个本身可能是原型)或您创建的类的实例。
实例和对象之间的区别在于对象是您在现实世界中使用的隐喻。您选择将人和汽车视为对象(将它们视为实例是不正确的),并相互协作。然后,您将其用作启发来创建您的代码。实例仅存在于您创建原型或类之后的程序中。 "对象"存在于PC外部,因为它是您用于将现实世界与程序结合起来的映射。它将人与您在PC中创建的Driver实例联系起来。因此,对象和实例密切相关,但它们并不完全相同(实例是程序中对象的“腿”,而另一条“腿”在现实世界中)。

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