如何在Java中的基类和派生类实例之间组织物理内存?
当实例化子类C
,已知其超类的构造函数(比如A
和B
( B
扩展A
))将比C
更早地实例化。 这是否意味着:
- 为A的实例,B的实例和C的实例分配了单独的内存?
- 对于子类
C
的实例,它是否具有为从B
和A
inheritance的字段分配的所有物理内存,以及它自己的字段? -
B
的实例除了自己的实例还有从A
inheritance的字段的物理内存吗?
…众所周知,它的超类的构造函数(比如说A和B(B扩展为A))将被实例化……
类被实例化。 调用构造函数。
(在编辑中建议这应该是“对象被实例化”;但是,这在技术上并不正确。按照下面链接的相同JLS部分:“在评估类实例创建表达式时显式创建新的类实例导致一个类被实例化。“即你实例化一个类以获取一个对象。一个对象是一个实例。你没有实例化对象。)
1)为A的实例,B的实例和C的实例分配了单独的内存?
不,有一个类的实例。 就是一块记忆。
2)对于子类C的实例,它是否具有为从B和Ainheritance的字段分配的所有物理内存,以及它自己的字段?
是:“每当创建一个新的类实例时,为它分配内存空间,为类类型中声明的所有实例变量提供空间,并在类类型的每个超类中声明所有实例变量,包括可能的所有实例变量隐藏起来。“
3)B的实例是否具有从Ainheritance的字段的物理内存以及它自己的?
按照1,在这种情况下没有“B的实例”。 只有一个例子。
资料来源: 12.5。 创建新的类实例,JLS 7
- 只分配了一个实例。
- 该实例包含所有类的所有字段。
- 好吧,唯一的
C
实例具有从A
和B
inheritance的字段的内存。