为什么静态块可以分配在其后声明的静态变量但不能访问它?
class Parent {
static {
i = 2; // valid
// can only assign new value to it instead of accessing it?
// System.out.println(i); // invalid - compile-error
}
static int i = 0;
static {
i = 3; // valid
}
}
是否由于以下事实造成的:该值尚未初始化,因此我们只是明确禁止您使用它?还是有我不知道的与安全相关的东西?
更新
这不是那个问题的重复
Why this doesn’t happen when accessing with class name?
这个问题是关于为什么我们要有这种设计?出于什么目的?
解决方法:
静态字段根据它们在代码中出现的顺序进行初始化.
因此,当您为i变量赋值时,您只是对编译器说:“嘿,伙计,当您初始化该变量时,请将其值设置为…”.但是您不能使用它,直到它被初始化,因为它根本不存在.
更新:
正如James Gosling,Bill Joy,Guy Steele和Gilad Bracha在“ Java语言规范”一书中所说的:
These restrictions are designed to catch, at compile time, circular or
otherwise malformed initializations.
考虑一下:
static {
i = 2;
j = i + 5; //should it be 7 or 15?
}
static int i = 10;
static int j;
j变量应该是7还是15?
如果为7,则由于变量字段是静态的,因此我们已经两次将i变量初始化了,这是不可能的.如果是15,那么我= 2?意思?
该代码不明确,因此Java规范不允许这样做.
标签:static-block,java-8,static,java
来源: https://codeday.me/bug/20191108/2006114.html