2010-11-18 17 views
2

我有一個基本問題, 當涉及內存佈局時,繼承與關聯有何不同。當涉及到內存佈局時,它如何繼承不同於關聯

class BaseClass{ 
private int i; 
public void DoSomethinG(){} 
} 

class DerivedClass : BaseClass{ 
} 

class AssocClass { 
private BaseClass bClass = new BaseClass(); 
} 

除了對私人成員的訪問限制,我相信DerivedClass和AssocClass都是相同的。 BaseClass中變量i的內存分配在兩種情況下,DerivedClass和AssocClasss的大小應該相同。

我對我的假設還是缺少一些微不足道的東西?

問候, 哎呀

回答

2

內存佈局是在兩者之間不同。通過DerivedClass,來自DerivedClassBaseClass的數據將被一起存儲。如果沒有隱含實例BaseClass,則不能有DerivedClass的實例。

AssocClass有一個參考BaseClass的實例。這可能是空的,因此可能根本沒有實例。如果存在實例,則它是存儲在別處的單獨對象。例如。它可能在堆的不同代。這也意味着這些實例可以獨立垃圾收集(當然,AssocClass的實例沒有引用BaseClass的實例)。

+0

感謝您澄清布賴恩,你是真實的情況下關聯的情況下可以在不同的一代 – JeeZ 2010-11-18 06:31:38

+0

@Jeez:它可能是在不同的一代,但與你的例子代碼中它不會。如果通過垃圾收集持有AssocClass的實例併爲bClass引用分配一個新對象,那麼'AssocClass'的實例將位於比BaseClass的實例更早的一代。 – 2010-11-18 06:34:57