首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么不能在显式调用构造函数java时引用实例字段?

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

Stack Overflow用户
提问于 2018-10-11 04:34:02
回答 1查看 0关注 0票数 0

有以下简单的课程

代码语言:javascript
复制
class A {
int i;
int y;

A(int i, int y)
{

}

然后当我尝试在下面做

代码语言:javascript
复制
class B extends A
{
    B()
    {
        super(i, y);        
    }
}

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

EN

回答 1

Stack Overflow用户

发布于 2018-10-11 14:01:13

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

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

执行顺序new B()如下:

  1. B触发静态初始化及其依赖项(如果尚未发生这种情况)。
  2. B评估了构造函数参数的参数表达式。(在这种情况下,没有任何东西。)
  3. 创建堆节点,使用B's'类型进行初始化,并且B默认初始化所有字段(in 及其超类)。
  4. super对参数B进行评估。
  5. super对参数A进行评估。
  6. Object()构造函数体被执行。
  7. 字段A.iA.y将被初始化(如果他们有初始化器)。
  8. A(int,int)构造函数体被执行。
  9. B将执行字段初始化程序。
  10. B()构造函数体被执行。
  11. B返回对已完成实例的引用。

如您所见,第4步将引用在步骤7中初始化y为1的步骤。

注意:以上是简化的。有关完整规范,请参阅JLS 15.9.4

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100005066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档