gpt4 book ai didi

java - 继承和对象创建,理论上和实际

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:02 24 4
gpt4 key购买 nike

假设我有一个类A.java

enter image description here

当我执行 A 的构造方法时,它会为 xyz 对象创建一个内存空间。

A xyz = new A();

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

[xyz] ---> '0x34524'

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

现在,

如果一个类继承自不同的父类会怎样?将在内存中创建多少对象空间?

假设我们有,

enter image description here

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

D omg = new D();

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

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

注意:

  1. 这不是家庭作业问题,这只是一个好奇心问题。
  2. 我知道这样一个事实,如果我们在 A.java 中有一个实例变量,那么我们不会只创建对象 A,而是会在每次点击 new 关键字时创建其他内部对象。

最佳答案

首先,有点……调用对象的构造函数并不会分配它。在字节码中,初始化 new Object()被表达为某种效果...

new java/lang/Object
invokespecial java/lang/Object <init>()V

new 指令负责分配空间并获取对尚未初始化的对象的引用,而 invokespecial 处理调用构造函数本身(它在内部编译为 void method named <init> ,因此是 descriptor <init>()V )。

继续,对象分配的内部结构和 representation on the heap are entirely JVM specific .然而,据我所知,每个分配的对象只有 一个 分配的对象,无论其父类(super class)的数量如何。内存中的对象本身为其自身类及其父类(super class)的实例字段提供空间。它还必须有空间用于 virtual method table ,以便在为对象执行虚拟方法调用(例如通过 invokevirtual )时进行虚拟分派(dispatch)。

在内部,Oracle HotSpot JVM 管理称为oops 或普通对象指针的东西。您可以阅读有关 HotSpot 内存布局的更多信息 here .欢迎调用browse the HotSpot source repository .

关于java - 继承和对象创建,理论上和实际,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11837158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com