2013-05-09 182 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

相關問題