Java:新的,继承和对象编号

时间:2015-08-27 14:35:10

标签: java inheritance jvm

我试图了解如何在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. Object的对象。
  4. 当然,程序员只能看到类B的一个对象。我对吗?或者只是在JVM 中创建的一个对象?

    我的想法:

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

3 个答案:

答案 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类的结果合并。