如何在Java中的基类和派生类实例之间组织物理内存?

时间:2012-12-16 01:26:04

标签: java oop

当实例化子类C时,已知其超类的构造函数(例如ABB扩展A) )将在C之前实例化。这是否意味着:

  1. 为A的实例分配了单独的内存,B的实例和C的实例?
  2. 对于子类C实例,它是否具有为从BA继承的字段分配的所有物理内存,以及自己的领域?
  3. B的实例除了自己的实例外,还有从A继承的字段的物理内存吗?

2 个答案:

答案 0 :(得分:12)

  

...众所周知,超类的构造函数(比如A和B(B扩展为A))将被实例化......

实例化类。构造函数被调用

(在编辑中建议这应该是“对象被实例化”;但是,这在技术上并不正确。根据下面链接的相同JLS部分:“在评估类时显式创建新的类实例实例创建表达式会导致实例化类。“即实例化一个类以获取对象。对象是一个实例。您不实例化对象。”

  

1)为A的实例,B的实例和C的实例分配了单独的内存吗?

不,有该类的实例。即一段记忆。

  

2)对于子类C的实例,它是否具有为从B和A继承的字段分配的所有物理内存,以及它自己的字段?

是:“每当创建一个新的类实例时,为它分配内存空间,为类类型中声明的所有实例变量提供空间,并在类类型的每个超类中声明所有实例变量,包括所有实例可隐藏的变量。“

  

3)B的实例是否具有从A继承的字段的物理内存以及它自己的?

按照1,在这种情况下没有“B的实例”。只有一个例子。

来源:12.5. Creation of New Class Instances, JLS 7

答案 1 :(得分:5)

  1. 只分配了一个实例。
  2. 该实例包含所有类的所有字段。
  3. 嗯,唯一的C实例具有从AB继承的字段的内存。