class A 在 Java 中继承 class B 时堆中会发生什么

What happens in the heap when class A inherits class B in Java

在 Java 中假设我们有两个 classes AB 这样 B 继承 A A 具有三个私有字段和一个具有三个参数的构造函数:

public class A {
private int a ;
private int b ;
private int c ;

 public A(int a, int b, int c) {
    this.a = a;
    this.b = b;
    this.c = c;
 }
}

这里是 class B

public class B extends A {        

  public B() {
    super(1,2,3);
 }
}

我们考虑下面的测试class

public class TestA {

        public static void main(String[] args) {
            A a = new A(1,2,3);
            B b = new B();        
        }
    }

问题是,当创建带有私有字段的class A 并由class B 继承它时,堆中的有序进程是什么?创建这两个 classes 的实例时,堆中会发生什么?内存分配是如何发生的以及 classes 如何在计算机内存中交互?

我们也知道 subclass 不能继承其 superclass 的私有字段,那么调用构造函数 B() 时究竟发生了什么?

Class object 像任何其他 object 一样被加载到堆中。这个object正好代表了Class.

Oracle official 'Understanding Memory guide'

和好旧的 java specs ,你可以阅读整个文档作为 class 加载器的工作原理,你不会找到任何 "Classes are loaded in Heap" .. 你可以做的更多在互联网上进行一些初步搜索以进一步澄清。

Class B 将完美编译。

现在您的问题按顺序排列:

what is the ordered process in the heap that occurs when creating the class A with private fields and inheriting it by the class B?

您无法确定它们的顺序取决于 jvm,因为它是如何管理它们的顺序的,私有成员不会被继承但存在于 parent(超级)中的实例化 object 中。

换句话说,是的,subclass 的实例将具有 parent class 的私有字段的副本。 然而,它们对子 class 不可见,因此访问它们的唯一方法是通过 parent class.

的方法

What happens in the Heap when creating instances of these two classes?

通常情况下,在创建 AB

实例之后,序列将类似于
  1. 引用 A.class object(在创建 Aclass 实例之后)
  2. 引用 B.class object(在创建 B class 实例之后)
  3. Object 个实例变量块
  4. A 个实例变量块(仅 a、b、c)
  5. B 个实例变量块(在本例中为 none)

然而,JVM 的每个实现都可以自由选择如何分配它们。

We know also that a subclass cant inherit the private fields of its superclass, so what happens exactly when the constructor B() is called?

当你打电话时 B()

B b = new B();

它将调用 super(1,2,3)

那之后会发生什么?传递给 super(); 的值没有传递给 A(int a, int b, int c),然后分配给 A 的实例变量,但这并不意味着 B 现在可以访问这些私有字段.. 您只是将值传递给超级 class 构造函数,仅此而已。

--编辑--

如果您想更好地了解堆和堆栈,请参阅 this question

--EDIT-2--

如果你花点时间研究一下这个wiki,它包含了关于 JVM 的一切,包括它在堆中的进程和其他内存结构

--最终 EDIT-3--

在 OP 关于 Super class

私有成员的评论的上下文中

Take a look at this这个问题的答案将消除你对继承成员和不可访问私有成员的困惑,因为子class实例是超级class的实例,它的实例有父亲的所有领域class!私有成员对那个 child 不可见!!这就是您所指的 JLS 规范!他们在 object 中占据了他们的 space。它们对 child class 不可见,但它们存在于该实例中。