带继承的构造函数链接中的对象创建

时间:2019-06-15 15:21:38

标签: java

当我们创建一个类的实例时,它将自动以一种或另一种方式调用超类构造函数。在继承中,当我们创建子类的实例时,它还具有不可见的父类字段引用,那么父类字段引用如何指向堆区域中的子类? 例如,当我们创建任何类的实例(A ref = new A();)时,将在堆内存(new A())中创建一个对象,该对象链接到堆栈区(ref)中存在的引用。

类似地,如果我创建一个类的n个实例,是否意味着我正在创建n个不同的Object类实例?由于每个类默认都会扩展Object类。

2 个答案:

答案 0 :(得分:4)

假定某些类B具有一些私有字段x和y。为了执行“其工作”,以便在调用B上的方法时提供所需的行为,这些字段当然必须存在于为B实例分配的“内存区域”中。

现在,当B用C扩展时,那么,当然,当您实例化C时,也需要分配这些字段x和y。您对此是正确的。

但是:这并不意味着您为C实例化了一个“附加的” B对象。它只是意味着当JVM为C实例分配内存时,它知道需要为继承的x提供空间。和y字段。

最后:Object类没有具有任何字段。因此,没有“因为任何东西都扩展了对象”的内存开销。

答案 1 :(得分:1)

也许(也许不是)。它完全取决于especific JVM。

通常,每个实例化对象仅分配一个表,其中包含类型,方法和数据。

有关Oracle JVM,请参见https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.7

  

2.7。对象表示

     

Java虚拟机不要求对象具有任何特定的内部结构。

     

在Oracle对Java虚拟机的某些实现中,对类实例的引用是指向本身是一对指针的句柄的指针:一个指向包含对象方法的表和指向Class的指针object代表对象的类型,另一个代表从堆为对象数据分配的内存。

相关问题