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

mon*_*ica 12 java oop

C实例化子类时,已知其超类的构造函数(例如A,和B(Bextends A))将在之前实例化C.这是否意味着:

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

Rya*_*art 12

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

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

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

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

不,有一个实例.就是一块记忆.

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

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

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

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

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


Lou*_*man 5

  1. 只分配了一个实例.
  2. 该实例包含所有类的所有字段.
  3. 好吧,唯一的C实例具有从A和继承的字段的内存B.

  • 我还原了你的答案.请参阅添加的括号解释,了解原件在技术上更准确的原因. (4认同)