Tea*_*App 5 java inheritance memory-management
可以说我有一堂课A.java,

当我执行A的构造函数方法时,它将为xyzObject 创建一个内存空间。
A xyz = new A();
Run Code Online (Sandbox Code Playgroud)
对内存的引用可能类似于
[xyz] ---> '0x34524'
Run Code Online (Sandbox Code Playgroud)
那就是OOP的基础。很简单!
如果一个类从不同的父类继承,会发生什么?内存中将创建多少个对象空间?
可以说我们有

然后创建一个class对象D.java,
D omg = new D();
Run Code Online (Sandbox Code Playgroud)
在这里我们知道D的对象将调用C.java的构造,依此类推,直到A.java。这是否意味着在内存中我们有4个不同的内存引用,因为我们实例化了所有四个对象(一个直接实例化,另一个间接3个实例化)?
[omg] ---> '0x34525'
[C] ---> '0x34526'
[B] ---> '0x34527'
[A] ---> '0x34528'
Run Code Online (Sandbox Code Playgroud)
注意 :
new关键字时都将创建其他内部对象。首先,tid位...调用对象的构造函数不会分配它。在字节码中,初始化new Object()表示为对...有影响的东西。
new java/lang/Object
invokespecial java/lang/Object <init>()V
Run Code Online (Sandbox Code Playgroud)
该new指令负责分配空间并获取对尚未初始化的对象的引用,而invokespecial句柄则调用构造函数本身(内部构造void为名为<init>的方法,因此称为描述符 <init>()V)。
继续,对象分配的内部和堆上的表示完全是特定于JVM的。但是,据我所知,每个分配的对象只有一个分配的对象,无论其超类的数量是多少。内存中的对象本身为它自己的类和其超类的实例字段留出空间。它还必须具有用于虚拟方法表的空间,以便在invokevirtual对对象执行虚拟方法调用(例如,通过)时进行虚拟调度。
在内部,Oracle HotSpot JVM管理称为oops或普通对象指针的事物。您可以在此处阅读有关HotSpot内存布局的更多信息。随意浏览HotSpot源存储库。
| 归档时间: |
|
| 查看次数: |
2217 次 |
| 最近记录: |