2013-05-09 69 views

回答

2

目的是创建一次性:对于域的空间是基于知识的分配,对字段中X宣布,YZ的总和(和任何object开销,隐含X : Y : Z需求空间基地Z)。这些字段是继承的,因此X a Z

它们是从下往上初始化的,因为即构造函数是如何工作的;如果我们写:

class A : B 
{ 
    private int _a = 1; 
    public A() { Console.WriteLine("A"); } 
} 
class B { 
    private int _b = 1; 
    public B() { Console.WriteLine("B"); } 
} 

然后我们得到(对于B):

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
{ 
    .maxstack 8 
    L_0000: ldarg.0 
    L_0001: ldc.i4.1 
    L_0002: stfld int32 B::_b 
    L_0007: ldarg.0 
    L_0008: call instance void [mscorlib]System.Object::.ctor() 
    L_000d: ldstr "B" 
    L_0012: call void [mscorlib]System.Console::WriteLine(string) 
    L_0017: ret 
} 

A

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
{ 
    .maxstack 8 
    L_0000: ldarg.0 
    L_0001: ldc.i4.1 
    L_0002: stfld int32 A::_a 
    L_0007: ldarg.0 
    L_0008: call instance void B::.ctor() 
    L_000d: ldstr "A" 
    L_0012: call void [mscorlib]System.Console::WriteLine(string) 
    L_0017: ret 
} 

注意到它运行其自己的调用基构造函数前本地构造函数代码。还要注意,即使在那之前,字段初始化器也会出现。

3

让我们有一些例子:

class A 
{ 
    int x; 
    int y; 
} 

class B: A 
{ 
    int c; 
} 

如果您创建的A一个新实例,一块内存是在堆上创建。该内存将占用8个字节; 4个字节为x,4个字节为y。 (我知道,更多的内存是为它的类型保留的,等等,但我会在这个范围之外)。

如果您创建B的新实例,则会创建一个内存块。不是两个,只有一个。所以没有任何儿童实例或任何。这通过在长度为12个字节(4个字节为x,4个字节用于y和4个字节为新字段z

当在堆上创建一块内存一块内存意愿,就总是充满零。因此,所有fieds都会有自己的缺省值,在这种情况下0

如果这两个类将有一个公共的无参数的构造函数,这些构造函数都会被自动调用。

class A 
{ 
    int x; 
    int y; 
    public A() 
    { 
     x = 1; y = 2;  
    } 
} 

class B: A 
{ 
    int c; 
    public B() 
    { 
     z = 3; 
    } 
} 

B一个新的实例CRE被调用,B的构造函数被调用。构造函数的第一件事是调用构造函数AA将其字段设置为xy12。然后程序返回B的构造函数,它将初始化z的值为3

B构造也可以被写成(表明B呼吁其基础A的构造函数):

public B() 
     : base() 
    { 
     z = 3; 
    } 
0

一个简单的解释,这是思继承作为复印机

所以,让我们现在要创建的子对象定义2类

class Base 
{ 
} 

class Child : Base 
{ 
} 

。孩子有自己的领域,但由于它从基地继承,它必须去复制其基类的所有领域,并因此自动创建。

类是对象的模板,继承只不过是可创建新模板时可以附加的可重用模板。

+0

它并不“复制”所有的字段 - 它继承了它们;他们是*相同的字段* – 2013-05-09 09:18:55

+0

但是不是继承了仅仅复制基类模板的行为? – Anand 2013-05-09 09:19:55

+0

不会。这会使私人字段可用 – 2013-05-09 09:21:19

相关问题