我读了很多关于类,对象和引用之间的区别。 但我心里有疑问。所以请帮助我解决这个问题。 假设
Class A //declaration of class
{
//
}
main()
{
A s1 = new A();
A s2 = new A();
}
现在的问题是 在上面的代码中,内存中有多少不同的对象和实例。?
如果有人说有两个不同的对象和两个实例(即s1和s2) 那么如果我们改变一个例子假设s1那么它也反映了s2的变化。这表明内存中只有一个对象。
那么我们怎样才能在同一个A类的内存中创建不同的对象?
提前致谢!!
答案 0 :(得分:1)
与你的陈述相反,"如果我们在一个实例中改变假设s1然后它也反映了s2中的变化",s1中的变化将不反映在s2中。因此, 在内存中有两个实例。
您可能会感到困惑,因为类可以包含属性或字段,该属性或字段是对另一个对象的引用。然后你可以在s1和s2中完美地引用相同的对象:
s1.s3 = new B();
s2.s3 = new B();
当然,在这种情况下,更改s1.s3
中的任何内容都会反映在s2.s3
中。
至于你的问题的标题,一个对象是一个类的实例。
答案 1 :(得分:1)
在您的示例代码中,内存中有2个类A
的实例。 s1
和s2
都指向A
实例所在的内存地址。
使用单词object
和instance
往往意味着相同的内容,因此您可以互换使用它们。
现在,如果你这样做了:
main()
{
A s1 = new A();
A s2 = s1;
}
在这种情况下,s1
和s2
都指向同一个对象/实例(相同的内存地址)。因此,如果您对s1
或s2
进行了更改,那么它们将以任一方式反映出来。
编辑:
一点额外的解释......
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网站:
对象基本上是根据蓝图分配和配置的内存块。程序可以创建同一类的许多对象。对象也称为实例,它们可以存储在命名变量或数组或集合中
对象和实例是相同的,它们属于一个类(由类创建),你在代码中创建了两个对象,变量s1
和s2
是对这些对象的引用。