有以下简单的课程
class A {
int i;
int y;
A(int i, int y)
{
}
然后当我尝试在下面做
class B extends A
{
B()
{
super(i, y);
}
}
我得到错误说“在显式调用构造函数时无法引用实例字段y”。我知道这是错的,但我想知道为什么我不能这样做。由于A的构造函数首先被初始化,因此i和y都有0值,为什么不能将这些值传递给超级构造函数。
发布于 2018-10-11 14:01:13
由于A的构造函数首先被初始化,因此i和y都有0值,为什么不能将这些值传递给超级构造函数。
问题是在调用构造函数之前评估super(i, y)
(in B
)中的参数的表达式A
。
执行顺序new B()
如下:
B
触发静态初始化及其依赖项(如果尚未发生这种情况)。B
评估了构造函数参数的参数表达式。(在这种情况下,没有任何东西。)B
's'类型进行初始化,并且B
默认初始化所有字段(in 及其超类)。super
对参数B
进行评估。super
对参数A
进行评估。Object()
构造函数体被执行。A.i
和A.y
将被初始化(如果他们有初始化器)。A(int,int)
构造函数体被执行。B
将执行字段初始化程序。B()
构造函数体被执行。B
返回对已完成实例的引用。如您所见,第4步将引用在步骤7中初始化y
为1的步骤。
注意:以上是简化的。有关完整规范,请参阅JLS 15.9.4。
1 - 规则没有考虑到您的示例中没有初始化程序的事实。但那是件好事。1)考虑到这一点会使它们变得更加复杂和令人惊讶。2)如果知道它具有默认值,允许访问变量有什么用?你可以使用这个值!
https://stackoverflow.com/questions/-100005066
复制相似问题