静态初始化后声明静态变量

时间:2017-05-20 11:28:24

标签: java static instance declaration instantiation

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

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。 因此,首先发生变量声明,然后按照出现顺序执行所有初始化语句

2 个答案:

答案 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;将被执行。