Java中非法正向引用的问题

时间:2019-05-02 09:39:39

标签: java

为什么当我在变量声明中使用引用this时,没有出现非法的前向引用?有this的声明和没有class FailsToCompile { int a = b; //illegal forward reference int b = 10; } 的声明有什么区别?

由于非法的前向引用,以下示例无法编译:

b

通过this限定使用class Compiles { int a = this.b; //that's ok int b = 10; } ,编译错误消失了。

withTransaction

1 个答案:

答案 0 :(得分:6)

假设以下课程

public class MyClass {
    int a = b;
    int b = 10;
}

JLS 8.3.3.说明您的情况:

  

使用实例变量,其声明在使用后有时会以文本形式出现
   -在C的实例变量初始值设定项或C的实例初始值设定项中使用的名称很简单

现在,使用成员this可以访问已经用默认值(a = 0, b = 0声明但尚未完全初始化的实例。如果您检查以下结果,则可见:

public class MyClass {
    int a = this.b;
    int b = 10;
}

您不会得到期望的值:

new MyClass().a //0
new MyClass().b //10

我无法解释为什么这是合法的,因为这永远不会给出正确的值。我们可以找到有关限制存在的原因的解释:

  

上述限制旨在在编译时捕获循环或其他形式的初始化。

但是为什么允许this起作用...


知道实例初始化期间会发生以下动作:

  1. 成员声明
  2. 依次执行块执行和字段初始化
  3. 构造函数执行

给出一些奇怪的行为:

public class MyClass {

    {
        b = 10;
    }
    int a = this.b;
    int b = 5;
    {
        b = 15;
    }

    public static void main(String[] args) {
        MyClass m = new MyClass();
        System.out.println(m.a); //10
        System.out.println(m.b); //15
    }
}

我会限制构造函数中的初始化。