我在类,对象和实例之间感到困惑

时间:2015-03-16 08:09:55

标签: c#

我读了很多关于类,对象和引用之间的区别。 但我心里有疑问。所以请帮助我解决这个问题。 假设

Class A        //declaration of class
{
//
}

main()
{
    A s1 = new A();
    A s2 = new A();
}

现在的问题是 在上面的代码中,内存中有多少不同的对象和实例。?

如果有人说有两个不同的对象和两个实例(即s1和s2) 那么如果我们改变一个例子假设s1那么它也反映了s2的变化。这表明内存中只有一个对象。

那么我们怎样才能在同一个A类的内存中创建不同的对象?

提前致谢!!

3 个答案:

答案 0 :(得分:1)

与你的陈述相反,"如果我们在一个实例中改变假设s1然后它也反映了s2中的变化",s1中的变化将反映在s2中。因此, 在内存中有两个实例。

您可能会感到困惑,因为类可以包含属性或字段,该属性或字段是对另一个对象的引用。然后你可以在s1和s2中完美地引用相同的对象:

s1.s3 = new B();
s2.s3 = new B();

当然,在这种情况下,更改s1.s3中的任何内容都会反映在s2.s3中。

至于你的问题的标题,一个对象是一个类的实例。

答案 1 :(得分:1)

在您的示例代码中,内存中有2个类A的实例。 s1s2都指向A实例所在的内存地址。

使用单词objectinstance往往意味着相同的内容,因此您可以互换使用它们。

现在,如果你这样做了:

main()
{
    A s1 = new A();
    A s2 = s1;
}

在这种情况下,s1s2都指向同一个对象/实例(相同的内存地址)。因此,如果您对s1s2进行了更改,那么它们将以任一方式反映出来。

编辑:

一点额外的解释......

main()
{
    A s1 = new A();  
}

在上面的代码中,变量s1被实例化为新的A实例。这里发生了两件事

  • 已在堆内存区域中创建A的实例。
  • s1存储(在堆栈中)堆中的内存地址。

s1将在堆栈上创建,它实际上是指向堆中已创建A实例的内存地址的指针。

希望这些额外的信息有助于澄清事情。

编辑:

您可以创建与PC上的内存一样多的实例。

main()
{
    A s1 = new A();
    A s2 = new A();
    A s3 = new A();
    // etc until you run out of memory.
}

我强烈建议您购买一些书籍来帮助您掌握.NET编程的基础知识。它是我最喜欢的书,我转向了很多,CLR via C# 4th Edition。你不能错过那本书。

答案 2 :(得分:1)

根据MSDN网站:

  

对象基本上是根据蓝图分配和配置的内存块。程序可以创建同一类的许多对象。对象也称为实例,它们可以存储在命名变量或数组或集合中

对象和实例是相同的,它们属于一个类(由类创建),你在代码中创建了两个对象,变量s1s2是对这些对象的引用。

enter image description here

Image Source