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'
注意 :
- 这不是作业问题,这只是一个好奇的问题。
- 我知道如果我们在A.java中有一个实例变量,那么我们不会只创建对象A,但只要我们点击
new
关键字,我们就会创建其他内部对象。
首先,tid位…调用对象的构造函数不会分配它。 在字节码中,初始化new Object()
表示为……的效果。
new java/lang/Object invokespecial java/lang/Object ()V
new
指令负责分配空间并获取对尚未初始化的对象的引用,而invokespecial
句柄调用构造函数本身(在内部编译为名为
的void
方法 ,因此描述符
)。
继续, 堆上的对象分配和表示的内部完全是JVM特定的 。 但是,据我所知,每个分配的对象只有一个分配的对象,无论它的超类数量如何。 内存中的对象本身具有用于其自己的类及其超类的实例字段的空间。 它还必须具有虚拟方法表的空间,以便在对对象执行虚拟方法调用(例如,通过invokevirtual
)时进行虚拟调度。
在内部,Oracle HotSpot JVM管理称为oops或普通对象指针的东西。 您可以在此处阅读有关HotSpot内存布局的更多信息。 随意浏览HotSpot源存储库 。
JVM仅为一个对象分配内存(此处为D)
- 内存分配和初始化发生在底部(这里是D)到顶部(对象)
- 初始化/调用构造函数发生Top(Object)到Bottom(这里是D)
参考:
除了我的经验之外,我没有在任何地方读过这本书 当你调用new D()
,构造函数链开始,它首先创建一个java.lang.Object
然后extends
它extends
为A
,我的意思是在创建Object
(它是所有对象的根)之后,在它上面初始化A ,为A的成员添加内存,包括字段和方法(指向某些代码的指针!)。 然后它extends
到B等等。
在扩展的过程中,如果方法被覆盖,则对象中的方法指针将指向新代码。
这只是D的一个参考。