gpt4 book ai didi

java - 为什么在显式调用构造函数 java 时无法引用实例字段

转载 作者:行者123 更新时间:2023-11-30 06:03:13 24 4
gpt4 key购买 nike

嗨,我有以下简单的类(class)。

class A {
int i;
int y;

A(int i, int y)
{

}

然后当我尝试做下面的事情时

class B extends A
{
B()
{
super(i, y);
}
}

我收到错误提示“在显式调用构造函数时无法引用实例字段 y”。我知道这是错误的,但我想知道为什么我不能这样做。由于 A 的构造函数首先被初始化,因此 i 和 y 的值均为 0,为什么不能将这些值传递给 super 构造函数。

最佳答案

Since A's constructor gets initialized first it has 0 value for both i and y and why cannot pass those values to super constructor.

问题在于 super(i, y)(在 B)中的参数表达式在调用 A 构造函数之前被评估.

new B()的执行顺序如下:

  1. B 及其依赖项的静态初始化被触发(如果这还没有发生)。
  2. B 的构造函数参数的参数表达式被求值。 (在这种情况下,没有。)
  3. 创建一个堆节点,用 B 的类型初始化,并且所有字段(在 B 及其父类(super class)中)都默认初始化。
  4. 评估Bsuper 参数。
  5. 评估Asuper 参数。
  6. Object() 构造函数体被执行。
  7. 字段 A.iA.y 将被初始化(如果它们有初始化器)。
  8. A(int,int) 构造函数体被执行。
  9. B 的字段初始值设定项将被执行。
  10. B() 构造函数体被执行。
  11. 返回对完成的B 实例的引用。

如您所见,第 4 步引用了尚未初始化的 y1。直到第 7 步才会初始化。

注意:以上是简化的。引用JLS 15.9.4获取完整规范。


1 - 规则没有考虑到您的示例中没有初始值设定项这一事实。但这是一件好事。 1) 考虑到这一点会使它们变得更加复杂和……令人惊讶。 2) 如果您知道变量具有默认值,那么允许访问该变量有什么用处?您可以直接使用该值!

关于java - 为什么在显式调用构造函数 java 时无法引用实例字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52724452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com