12

当一个子类C被实例化时,它的超类的构造函数(比如A,和BBextends A))会比C. 那么这是否意味着:

  1. 为A的实例,B的实例和C的实例分配了单独的内存?
  2. 对于subclass实例,除了它自己的字段之外,C它是否具有为继承自Band的字段分配的所有物理内存?A
  3. 那么's 的实例除了它自己的之外还有B继承自的字段的物理内存吗?A
4

2 回答 2

12

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

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

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

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

不,有一个类的实例。即一块内存。

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

是:“每当创建一个新的类实例时,都会为其分配内存空间,并为该类类型中声明的所有实例变量和该类类型的每个超类中声明的所有实例变量,包括所有可能的实例变量被隐藏起来。”

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

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

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

于 2012-12-16T01:41:23.563 回答
5
  1. 只分配一个实例。
  2. 该实例包含所有类的所有字段。
  3. 好吧,唯一的实例具有从和C继承的字段的内存。AB
于 2012-12-16T01:42:07.087 回答