当您创建对象B时,例如通过调用默认构造函数。B myObject = new B(); 然后JVM分配一个对象,包含以下内容: B类中每个显式声明的字段所需的内存(通常每个字段约为4-8字节,但不同类型和主机系统差异很大) A类及其祖先继承的每个字段所需的内存 足够的内存以包含对调度向量的引用(这也应该约为4-8字节) 编译器使用调度向量存储可以在给定对象上调用的每个方法的地址,它取决于对象的类而不是对象本身的实例(毕竟每个B对象都具有相同的接口!)因此,您不需要为A分配内存,因为没有单独的A对象。您没有实例化2个单独的对象。当您创建B时,您正在创建A的“专门”版本..可以将其视为带有更多内容的A。因此,只需要为B分配内存(但请记住,B还具有其所有祖先的内容)。
当您通过new B()实例化B时,会隐式(或显式)调用A的构造函数。因此,内存分配是为两个类完成的。更具体地说,如果A声明了三个整数成员,而B(扩展A)声明了2个浮点成员,则每个新的B将分配三个整数和两个浮点数。
A
是B
对象的一部分。当您创建一个类型为B
的对象时,它的内存布局包含了A
的内存布局。因此,只需要使用new B()
。如果A
有一个int
成员,而B
有另一个int
成员,那么当您创建一个B
时,它将包含这两个int
。 - Eran