为什么这段代码有效?在宣布之前分配?

Mob*_*Mob 4 java initialization

这是Java.据我了解,1至的分配index是一个initialization block即当类实例化第一次运行,但为什么这有效吗?

public class arr {
    {
        index = 1;
    }

    int index;

    void go() {
        System.out.println(++index);
    }
    public static void main(String [] args){
          new arr().go(); 
        }
    }
Run Code Online (Sandbox Code Playgroud)

输出为2.

我应该得到一个symbol not found编译错误.此行为是初始化块原生的吗?在正常情况下int index;应该来之前index = 1;.

Evg*_*eev 5

+1,看起来很奇怪.但事实上,非静态初始化块只是由javac插入到对象构造函数中.如果我们反编译arr.class,我们将获得真正的代码

public class arr {
    int index;

    public arr() {
        index = 1;
    }

    void go() {
        System.out.println(++index);
    }

    public static void main(String args[]) {
        (new arr()).go();
    }

}
Run Code Online (Sandbox Code Playgroud)

考虑这个难题,让更多乐趣

public class A {
    int index;

    A() {
        index = 2;
    }

    {
        index = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是新的A().索引?正确的答案是2.参见反编译的A.class

class A {
    int index;

    A() {
        index = 1;
        index = 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,非静态初始化块首先出现在对象构造函数中