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)。
每当在任何派生 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)。