为什么在显式调用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)
(inB
)中的参数表达式在调用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
的构造函数尚未被调用。