inheritance与对象创造,理论与现实

可以说我有一个A.java类,

在此处输入图像描述

当我将执行A的构造函数方法时,它将为xyz Object创建一个内存空间。

 A xyz = new A(); 

对内存的引用可能是这样的,

 [xyz] ---> '0x34524' 

这是OOP的基础知识。 很简单!

现在,

如果一个类inheritance自不同的父类会发生什么? 内存中将创建多少个对象空间?

让我们说,我们有,

在此处输入图像描述

然后我们创建一个D.java类的对象,

 D omg = new D(); 

在这里,我们知道D的对象将调用C.java的构造,依此类推,直到A.java。 这是否意味着在内存中我们有4个不同的内存引用,因为我们实例化所有这四个对象(一个直接,另一个3间接)?

 [omg] ---> '0x34525' [C] ---> '0x34526' [B] ---> '0x34527' [A] ---> '0x34528' 

注意 :

  1. 这不是作业问题,这只是一个好奇的问题。
  2. 我知道如果我们在A.java中有一个实例变量,那么我们不会只创建对象A,但只要我们点击new关键字,我们就会创建其他内部对象。

首先,tid位…调用对象​​的构造函数不会分配它。 在字节码中,初始化new Object()表示为……的效果。

 new java/lang/Object invokespecial java/lang/Object ()V 

new指令负责分配空间并获取对尚未初始化的对象的引用,而invokespecial句柄调用构造函数本身(在内部编译为名为void方法 ,因此描述符 ()V )。

继续, 堆上的对象分配和表示的内部完全是JVM特定的 。 但是,据我所知,每个分配的对象只有一个分配的对象,无论它的超类数量如何。 内存中的对象本身具有用于其自己的类及其超类的实例字段的空间。 它还必须具有虚拟方法表的空间,以便在对对象执行虚拟方法调用(例如,通过invokevirtual )时进行虚拟调度。

在内部,Oracle HotSpot JVM管理称为oops或普通对象指针的东西。 您可以在此处阅读有关HotSpot内存布局的更多信息。 随意浏览HotSpot源存储库 。

JVM仅为一个对象分配内存(此处为D)

  1. 内存分配和初始化发生在底部(这里是D)到顶部(对象)
  2. 初始化/调用构造函数发生Top(Object)到Bottom(这里是D)

参考:

http://www.artima.com/designtechniques/initialization.html

除了我的经验之外,我没有在任何地方读过这本书 当你调用new D() ,构造函数链开始,它首先创建一个java.lang.Object然后extendsextendsA ,我的意思是在创建Object (它是所有对象的根)之后,在它上面初始化A ,为A的成员添加内存,包括字段和方法(指向某些代码的指针!)。 然后它extends到B等等。

在扩展的过程中,如果方法被覆盖,则对象中的方法指针将指向新代码。

这只是D的一个参考。