以下代码编译成功。根据我的理解,变量必须在使用它们之前声明,那么这里到底发生了什么
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。 所以变量声明首先发生,然后按照出现的顺序执行所有初始化语句
使用之前声明它们
这只是部分正确。如果您在某个方法中并执行以下操作:
System.out.println(i);
int i = 0;
显然它不会编译。
但是,当您在类级别声明变量时,此规则不成立。在你的代码中,仅仅因为w
的声明是在它被使用后写的几行(w = 10;
),并不意味着行int w;
是在w = 10;
行之后执行的。
可以这样想:编译器将首先看到所有静态字段的声明(类级变量),然后是所有非静态字段的声明,然后是类中的代码块(构造函数、方法等)。在您的代码中:
class A {
static {
z=10;
}
static int z;
{
w=10;
}
int w;
}
编译器首先看到z
,然后看到w
。然后,假设您第一次在代码的其他一些部分中访问A
。现在静态块被执行(z=10;
)。让我们再次假设您实际上正在创建一个新的A
实例,现在w=10;
将被执行。
变量由类加载器在装入类时声明。
静态块将在第一次访问类时被计算,因此在这段时间内将声明成员变量,因此顺序并不重要