以下代码成功编译。根据我的理解,变量必须在使用之前声明,然后在这里发生了什么
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。 因此,首先发生变量声明,然后按照出现顺序执行所有初始化语句
答案 0 :(得分:1)
变量在加载类时由类加载器声明。
静态块将在第一次访问类时进行评估,因此在那个时候会声明成员变量,所以顺序并不重要
答案 1 :(得分:1)
变量必须在使用前声明
这只是部分正确。如果您使用的是方法而且执行此操作:
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;
将被执行。