Java中非法正向引用的问题

Dmi*_*try 6 java

为什么当我this在变量声明中使用引用时,没有出现非法正向引用?有this和没有声明之间有什么区别?

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

class FailsToCompile {
    int a = b; //illegal forward reference
    int b = 10;
}
Run Code Online (Sandbox Code Playgroud)

通过排位赛使用b的this编译错误消失。

class Compiles {
    int a = this.b; //that's ok
    int b = 10;
}
Run Code Online (Sandbox Code Playgroud)

Axe*_*elH 6

假设以下课程

public class MyClass {
    int a = b;
    int b = 10;
}
Run Code Online (Sandbox Code Playgroud)

在JLS 8.3.3。陈述你的情况:

有时会限制使用声明后在文本上出现声明的实例变量
-在C的实例变量初始化器或C的实例初始化器中,使用简单名称

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

public class MyClass {
    int a = this.b;
    int b = 10;
}
Run Code Online (Sandbox Code Playgroud)

您不会得到期望的值:

new MyClass().a //0
new MyClass().b //10
Run Code Online (Sandbox Code Playgroud)

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

上面的限制旨在在编译时捕获循环或其他格式不正确的初始化。

但是为什么允许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
    }
}
Run Code Online (Sandbox Code Playgroud)

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