gpt4 book ai didi

Java:new、inheritance和objects number

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:06 25 4
gpt4 key购买 nike

我想了解 JVM 内部是如何实现继承的。 在我看来,如果我们有以下代码:

class A {
int aa;
}

class B extends A{
int bb;
}
....
B b=new B();

在 JVM 中将创建三个对象:

  1. B 的对象(带有字段int bb),
  2. A 的对象(带有字段 int aa)
  3. 对象的对象。

当然,程序员只能看到 B 类的一个对象。我对吗?还是在 JVM 中只创建了一个对象?

我的想法:

new 返回对B 的引用。我这么认为的原因是(例如)如果我们在 B 中覆盖 A 中的某些方法,我们总是可以使用 super 获取它。除了在默认构造函数 B 中,第一行将调用默认构造函数 A ,其中我们可以在特定对象上调用构造函数,仅当此对象存在时。因此存在一个单独的 A 对象?

最佳答案

起初,spec says对象的内部结构未指定,因此理论上,JVM 可以在内部创建多个对象,其中 B 仅包含 B 的新字段,以及指向 A 对象的链接,该对象包含 A 的字段。

它还说明了有关 Oracle JVM 实现的一些内容:一个类实例包含三个指针。一个是方法表,一个是实例字段数据所在的堆中的某个空间,一个是实例所属的 Class 对象。

由此可以得出结论,每个创建的对象只有一个实例,即B的实例。该实例的方法表包含B、A和Object的所有方法,以及因为堆空间包含来自 B、A(和对象)的字段的所有数据。

关于Java:new、inheritance和objects number,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32252292/

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