在静态初始化器之后声明静态变量
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;
将被执行。
以下代码编译成功。根据我的理解,变量必须在使用它们之前声明,然后这里到底发生了什么
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;
将被执行。