在静态初始化器之后声明静态变量

declaring static variable after static initialzer

以下代码编译成功。根据我的理解,变量必须在使用它们之前声明,然后这里到底发生了什么

class A {
static {
    y=20;
    z=10;
}
static int z;
static int y=30;
{
    w=10;
}
int w;
public static void main(String args[]){
     System.out.println(y);
}
}

阅读评论后修改了问题。 这里的输出是 30。 所以首先发生变量声明,然后按照出现顺序执行所有初始化语句

变量由 classloader 在加载 class.

时声明

静态块将在第一次访问 class 时进行评估,因此届时将声明成员变量,因此顺序并不重要

variables have to be declared before using them

这只对了一部分。如果你在一个方法中并且你这样做:

System.out.println(i);
int i = 0;

显然它不会编译。

但是当您在 class 级别声明变量时,此规则不成立。在你的代码中,仅仅因为 w 的声明在它被使用后写了几行(w = 10;),并不意味着 int w; 行在 w = 10;.

这样想:编译器将首先看到所有静态字段的声明(class 级变量),然后是所有非静态字段,然后是代码块(构造函数、方法等) ) 在 class 中。在您的代码中:

class A {
    static {
        z=10;
    }
    static int z;
    {
        w=10;
    }
    int w;
}

编译器首先看到 z,然后是 w。然后假设您在代码的其他部分首次访问 A。现在执行静态块 (z=10;)。让我们再次假设您实际上正在创建 A 的新实例,现在 w=10; 将被执行。