Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在显式调用java构造函数时不能引用实例字段_Java_Constructor - Fatal编程技术网

为什么在显式调用java构造函数时不能引用实例字段

为什么在显式调用java构造函数时不能引用实例字段,java,constructor,Java,Constructor,嗨,我有以下简单的课程 class A { int i; int y; A(int i, int y) { } 然后当我试着做下面的事情 class B extends A { B() { super(i, y); } } 我得到的错误是 “显式调用构造函数时无法引用实例字段y”。 我知道这是错误的,但我想知道为什么我不能这样做。由于A的构造函数首先被初始化,所以i和y的值都为0,为什么不能将这些值传递给超级构造函数呢 由于A的构造

嗨,我有以下简单的课程

class A {
int i;
int y;

A(int i, int y)
{

}
然后当我试着做下面的事情

class B extends A
{
    B()
    {
        super(i, y);        
    }
}
我得到的错误是 “显式调用构造函数时无法引用实例字段y”。 我知道这是错误的,但我想知道为什么我不能这样做。由于A的构造函数首先被初始化,所以i和y的值都为0,为什么不能将这些值传递给超级构造函数呢

由于A的构造函数首先被初始化,所以i和y的值都为0,为什么不能将这些值传递给超级构造函数呢

问题是
super(i,y)
(in
B
)中的参数表达式在调用
A
构造函数之前进行求值

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

  • 将触发
    B
    及其依赖项的静态初始化(如果尚未发生)
  • 计算
    B
    的构造函数参数的参数表达式。(在本例中没有。)
  • 创建一个堆节点,用
    B
    的类型初始化,所有字段(在
    B
    及其超类中)都默认初始化
  • B
    super
    参数进行评估
  • A
    super
    参数进行评估
  • 执行
    Object()
    构造函数主体
  • 将初始化
    A.i
    A.y
    字段(如果它们有初始值设定项)
  • 执行
    A(int,int)
    构造函数主体
  • B
    的字段初始值设定项将被执行
  • 执行
    B()
    构造函数主体
  • 返回对已完成的
    B
    实例的引用 如您所见,步骤4引用了尚未初始化的
    y
    。在第7步之前,它不会被初始化

    注:以上内容已简化。有关完整规格,请参阅



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

    可能的副本。所以在输入标题时没有暗示这个问题,或者它没有回答你的问题?@achAmháin,我已经读过了。对于实例方法来说没关系。但是为什么我们不能选择不初始化超级类实例变量呢。@achAmháin yes这并没有回答我的问题。
    A
    只定义了一个2参数构造函数,所以
    B
    必须使用它。例如:
    B(){super(0,0);}
    super(i,y)
    正试图用
    A.i
    A.y
    调用
    A的构造函数,但
    A.i
    A.y
    尚未初始化,因为
    A
    的构造函数尚未被调用。