java 中构造函数的继承

Inheritance of constructors in java

每当在任何派生 class 中调用任何构造函数时,任务只能通过最终隐式或显式调用基 class 构造函数来完成 (如果我在这里错了,请纠正我)。

由于我们打算创建派生的实例 class,但由于最终调用了基础 class 构造函数。

那么,尽管调用了基础 class 的构造函数,如何构造派生 class 的实例?

不要将构造函数视为创建实例。将其视为 初始化 实例,相对于特定 class.

因此初始化过程类似于:

  • 分配内存
  • java.lang.Object
  • 的角度初始化对象
  • your.package.Superclass
  • 的角度初始化对象
  • your.package.Subclass
  • 的角度初始化对象

(即使您从调用 new Subclass(...) 开始,超级 class 构造函数主体也会先执行。)

对象初始化的细节在JLS section 12.5中给出。

Constructor 不是很幸运的名字。它可能暗示它负责 creating(构建)对象,但实际上它负责 初始化 已经存在的 对象。

对象由 new 运算符创建。但是该对象 "set up" 的所有字段都填充有默认值:null、false、0(取决于类型)。为了使这样的对象 在我们的应用程序中可用 我们需要正确地 "set it up" (初始化),这是构造函数的工作。

但是由于 classes 可以扩展其他 classes,因此 subclass 的构造函数需要仅在执行 superclass 的构造函数之后才执行其代码(例如,确保所有继承的字段都已正确初始化,以便我们可以在构造函数中使用实际使用那些 superclass 字段的继承方法)。这就是为什么 super(..) 调用显式或隐式地放置在每个构造函数的开头(Object class 除外,因为它不扩展其他 class)。