在C#.NET中,我有2个具体的类。 A类和B类.B类是A类的子类。
为每行代码创建了多少个实例(堆上的对象)以及从堆栈到堆对象的引用:
ClassB b = new ClassB();
ClassA a = new ClassB();
答案 0 :(得分:4)
比喻对象是一个气球而且引用是一个与气球相关的字符串,在下列每种情况下都会有一个balolon和一个字符串:
ClassB b = new ClassB(); //one reference, one heap object
ClassA a = new ClassB(); //one reference, one heap object
因此,同时运行两个对象将创建两个对象和两个引用。
编辑看一下从ClassB
构造函数生成的IL:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void InheritanceTest.ClassA::.ctor()
IL_0006: ret
} // end of method ClassB::.ctor
call instance void InheritanceTest.ClassA::.ctor()
表示它将ClassA
构造函数称为成员函数(不是作为成员对象的函数)。这符合我对继承类实例所发生的事情的理解,派生类只是基类的所有成员,后面跟着自己的成员,类似于C ++。
答案 1 :(得分:0)
这实际上取决于每个班级的成员。假设它们是空类,每个对象一个引用,总共两个。也就是说,创建ClassB
对象不会创建对其本身的引用。
如果他们有成员,当然,会员还有其他参考资料,但我认为这不是你问题的要点。
答案 2 :(得分:-1)
在第一种情况下 - 你将只有一个B类实例。在第二种情况下,你将有一个B类实例。在第二种情况下不会创建A类实例。