实例和对象有什么区别?

127

实例和对象之间有什么区别? 是否有区别?


12
也许你可以从众所周知的错误信息“Object reference not set to an instance of an object.”中推断出:-> - herzmeister
1
从JVM规范中:“对象可以是动态分配的类实例或数组。” http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html - yfklon
1
我刚刚简要描述了对象和实例之间的区别,希望能有所帮助。StackOverFlow - Pushkarraj Pujari
25个回答

80

Instance和Object来自面向对象编程

对于一些编程语言,如Java、C++和Smalltalk,描述和理解代码是很重要的。在其他使用结构化编程的语言中,这个概念并不存在。

这是结构化编程的观点。这里没有真正显著的差异需要消耗太多时间。可能会有一些花哨的语言,有些人可能会花费大量的篇幅写关于这些差异,但就程序员、开发人员、程序员、架构师而言,类的实例和对象意思相同,通常可以互换使用。我在职业生涯中从未遇到过任何人会挑剔并花费半个小时试图指出差异,因为实际上并没有差异。时间可以更好地用于其他开发工作。

更新 关于Swift,苹果公司发明了Swift,它更喜欢:

类的实例传统上被称为对象。然而,Swift类和结构在功能上更接近于其他语言中的结构,本章的大部分内容描述的功能都适用于类或结构类型的实例。因此,使用更通用的术语“实例”。


那么对于没有类但有结构体的语言呢?我能说“一个结构体实例”吗?还是这本质上是错误的?在这种情况下我应该怎么称呼它?谢谢! - sagitta
这并不一定是错误的,但听起来会很别扭,就像在美国使用英式英语术语“lorry”、“lift”和“chips”而不是“truck”、“elevator”和“fries”一样。 - chepner

21

非常好的问题。

我将以最简单的方式来解释: 假设你的篮子里有5个苹果。每个苹果都是一种名为“苹果”的对象,具有某些特征(例如:大、圆、生长在树上)。

从编程角度来看,您可以有一个名为Apple的类,它具有变量大小:大、形状:圆、栖息地:生长在树上。要在篮子里放入5个苹果,您需要实例化 5个苹果。 Apple apple1, Apple apple2, Apple apple3等...

或者说:对象是某物的定义,实例则是其物理存在。

这样讲清楚了吗?


83
它不是这样的。 :) “对象是某物的定义” 这里所说的对象是指类。 - T-Gergely
这个比喻在“Alternative”那一行之前还不错。(尽管我会争辩说实例化苹果以产生单个苹果的是树,而不是拿着篮子的人。) - chepner

15

实例:实例意味着只创建一个引用(副本)。

对象:意味着使用new运算符将内存位置与对象关联(是类的运行时实体)。

简单来说,实例是指特定时间点上对象的副本,而对象是指类的内存地址。


1
说一个实例是一个对象的引用真的让我清楚了很多。 - John C
10
它不应该,因为它是不正确的。对象是类的一个实例。仅此而已。 - user207421

12

对象:

它是一个通用术语,基本上是一个具有状态(变量)和行为(方法)的软件包。

:

是一个对象的蓝图(模板),实例是一个独特的对象。比如,如果你创建了两次一个对象,那么这意味着你已经创建了两个实例。

让我举个例子。

Class student()
{
   private string firstName;
  public student(string fname)
  {
    firstName=fname;
  }
  Public string GetFirstName()
  {
    return firstName;
  }
}

对象示例:

Student s1=new student("Martin"); Student s2=new student("Kumar");

s1和s2是类Student的对象。

实例:

s1和s2是类student的实例,它们是唯一的。 它也可以被称为引用

实质上,s1和s2是被分配了对象的变量。


1
一个对象是一个类的实例。 - user207421

10

对象和实例大多相同;但是它们之间有一个非常小的区别。 如果Car是一个类,3个Car是三个不同的对象。所有这些对象都是实例。因此,这3辆车是Car类的实例对象。

但是,“实例”这个词也可以表示“结构实例”。但是“对象”只用于类。

所有的对象都是实例。 并非所有实例都必须是对象。实例可以是“结构实例”或“对象”。 我希望这使得区别对您更清晰明了。


8
假设你正在制作一些椅子。
显示如何制作和组装椅子的图表对应于软件类。
假设你按照该图表中的样式制作了五把椅子。同样地,您可以根据类中的样式构建五个软件对象。
每把椅子底部都有一个独特的编号以标识每个特定的椅子。椅子3是椅子模式的一个实例。同样,内存位置3可以包含软件模式的一个实例。
因此,实例(第3把椅子)是椅子模式的单个唯一特定表现形式。

3
一个对象是一个类的实例。一个实例不是一个对象的实例。答案没有意义。 - user207421
3
哇,终于有人在九年后指出了我解释中的缺陷。谢谢!现在更好了吗? - Brian Showalter

6

快速简明回答

  • 类(Class)对象的规范,蓝图...
  • 对象(Object)类在内存中的物理表示...
  • 实例(Instance)对象的唯一副本(相同结构,不同数据)...

4

一个对象是一种构造,它是静态的并具有某些特征和特性,例如属性和方法,它可以是任何东西(字符串、用户控件等)

一个实例是该对象的唯一副本,您可以使用它并执行各种操作。

想象一个产品,比如一台电脑。

xw6400工作站是一个对象

您的xw6400工作站(或您妻子的xw6400工作站)是xw6400工作站对象的一个实例


1
你的第一和第二段描述的是类,而不是对象。 - user207421

4

Java是一种面向对象的编程语言(OOP)。这意味着,Java中的所有东西,除了原始类型之外,都是对象。

现在,Java对象类似于现实世界中的对象。例如,我们可以在Java中创建一个汽车对象,它将具有像当前速度和颜色这样的属性,以及像加速和停车这样的行为。

这就是对象

enter image description here

实例,另一方面,是该对象的唯一初始化副本,看起来像Car car = new Car()

查看此处以了解更多关于Java类和对象的信息。


2

当一个自定义类型(类)的变量被声明时,只会创建一个称为对象的引用。在这个阶段,没有为这个对象分配任何内存。它只是作为指针(指向将来存储对象的位置)。这个过程被称为“声明”。

Employee e; // e is an object

另一方面,当使用new运算符声明自定义类型的变量时,会在堆中分配内存以创建该对象,并返回对分配内存的引用。现在将这个对象称为实例。这个过程被称为“实例化”。

Employee e = new Employee(); // e is an instance

然而,在一些语言中如Java,一个对象等同于一个实例,正如在Oracle Java文档中所写的那样:
引用: 注意:“实例化一个类”这个短语的意思与“创建一个对象”相同。当您创建一个对象时,您正在创建一个类的“实例”,因此是“实例化”一个类。

这只是一个看起来直观但错误的例子。在员工 e 中,e 指向不存在的地方。虽然从理论上讲,对象是一些真实存在的实体,它存在于蓝图(类)之外。 - Manish Kumar
@ManishSoni,你所说的是一个“实例”,除非你是在讨论将“对象”和“实例”视为同义词的语言上下文!这就是整个答案所解释的内容。 - Srishti Gupta
这个例子是误导性的,它与Java语法是同义的,但在这里并没有意义。然而,你的答案传达了相同的意思(概念上正确),这就是我所说的“看起来直观但是错误”的意思。 - Manish Kumar
@ManishSoni 这个例子并不仅仅适用于Java。如果你看其他语言(如C ++,C#,JavaScript等),它们中的许多都使用new运算符和类。 不要考虑Java或任何语言的语法,这个例子是与语言无关的。 - Srishti Gupta
当声明一个自定义类型(类)的变量时,只会创建一个引用,这个引用被称为对象。你认为这个说法正确吗?你对答案的阐述使得这个问题存在争议。其实这个问题有一个简洁明了的答案,为什么要复杂化和混淆呢? - Manish Kumar

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