我试图了解如何在JVM中实现继承。 在我看来,如果我们有以下代码:
class A {
int aa;
}
class B extends A{
int bb;
}
....
B b=new B();
在JVM内部将创建三个对象:
B
的对象(带字段int bb
),A
的对象(带字段int aa
)Object
的对象。当然,程序员只能看到类B
的一个对象。我对吗?或者只是在JVM 中创建的一个对象?
我的想法:
new返回对B
的引用。为什么我这么认为(例如)如果我们在A
中覆盖B
中的某个方法,我们总是可以使用super
来获取它。除了默认构造函数B
之外,第一行将调用默认构造函数A
,只要该对象存在,我们就可以在其中调用某个对象上的构造函数。因此,存在单独的A
对象?
答案 0 :(得分:3)
首先,没有指定对象内部结构的spec says,所以从理论上讲,JVM可以在内部创建多个对象,其中B只包含B的新对象,以及指向对象的链接。一个对象,包含A。
的字段它还说明了Oracle JVM实现:类实例包含三个指针。一个到方法表,一个到堆中的某个空间,其中是实例字段的数据,一个是实例所属的Class对象。
您可以从中得出结论,每个对象只创建了一个实例,即B的实例。此实例的方法表包含B,A和Object中的所有方法。因为堆空间包含来自B,A(和对象)的字段的所有数据。
答案 1 :(得分:0)
这里只会创建一个对象。它是B对象。但是B对象具有A对象的状态和行为。由于每个类的超类型都是Object类,B对象也有Object的状态和行为。感谢
答案 2 :(得分:0)
类表示一种对象,但只有实例才能创建实际对象。因此,只创建了一个对象,它对应了B类与A类的结果合并。