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



当一个子类C被实例化时,它的超类(比如AB(B扩展了A))的构造函数将早于C被实例化。这是否意味着:

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

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

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

(在一次编辑中,有人建议这应该是"对象被实例化";然而,这在技术上是不正确的。根据下面链接的JLS部分:"当对类实例创建表达式的求值导致类被实例化时,会显式创建新的类实例。"。"也就是说,你实例化一个类是为了得到一个对象。对象就是一个实例。你不实例化对象。)

1)是否为A的实例、B的实例和C的实例分配了单独的内存?

否,存在该类的实例。即一段记忆。

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

是:"每当创建一个新的类实例时,都会为其分配内存空间,其中包括在类类型中声明的所有实例变量和在类类型的每个超类中声明的全部实例变量,包括所有可能隐藏的实例变量。">

3),那么B的实例除了拥有自己的物理内存外,还拥有从A继承的字段的物理内存吗?

根据1,在这种情况下没有"B的实例"。只有一个例子。

资料来源:12.5。创建新的类实例,JLS 7

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

最新更新