在静态初始值之后声明静态变量



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

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

变量由类加载器在装入类时声明。

静态块将在第一次访问类时被计算,因此在这段时间内将声明成员变量,因此顺序并不重要

最新更新