Java中类的内存分配?

3

类B继承类A。现在,当我们创建一个类型为B的对象时,为B分配了什么内存?它包括A和B吗?还是有其他的内存分配程序?

3个回答

3
当您创建对象B时,例如通过调用默认构造函数。
B myObject = new B();

然后JVM分配一个对象,包含以下内容:
  • B类中每个显式声明的字段所需的内存(通常每个字段约为4-8字节,但不同类型和主机系统差异很大)
  • A类及其祖先继承的每个字段所需的内存
  • 足够的内存以包含对调度向量的引用(这也应该约为4-8字节)
编译器使用调度向量存储可以在给定对象上调用的每个方法的地址,它取决于对象的类而不是对象本身的实例(毕竟每个B对象都具有相同的接口!)
因此,您不需要为A分配内存,因为没有单独的A对象。您没有实例化2个单独的对象。当您创建B时,您正在创建A的“专门”版本..可以将其视为带有更多内容的A。因此,只需要为B分配内存(但请记住,B还具有其所有祖先的内容)。

1

是的。当分配B类型对象时,它们包含A的部分。不需要担心这个问题(也就是不需要同时分配B和A)。


2
AB 对象的一部分。当您创建一个类型为 B 的对象时,它的内存布局包含了 A 的内存布局。因此,只需要使用 new B()。如果 A 有一个 int 成员,而 B 有另一个 int 成员,那么当您创建一个 B 时,它将包含这两个 int - Eran

1
当您通过new B()实例化B时,会隐式(或显式)调用A的构造函数。因此,内存分配是为两个类完成的。
更具体地说,如果A声明了三个整数成员,而B(扩展A)声明了2个浮点成员,则每个新的B将分配三个整数和两个浮点数。

构造函数不进行内存分配。在调用构造函数之前,JVM会完成内存分配。 - Joachim Sauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接