看一下测试用例:
public class StaticFieldTest {
public static int A= 1;
static {
A=2;
NAME="AAA";
// System.out.println(NAME); // Can't forward reference
}
public static String NAME = "Archer";
public static void main(String[] args) {
System.out.println(NAME);
}
}
输出为Archer
。
很明显,NAME="AAA"
是乏味的。为什么Java允许这种写作?
答案 0 :(得分:0)
您必须了解初始化的顺序
静态初始值设定项和类变量初始值设定项以文本顺序执行。在您的示例中,静态块在静态变量赋值之前。如果订单被切换,答案将会有所不同。
当实例化类(创建对象)时,实例变量被初始化,然后调用 Contructor 。
答案 1 :(得分:0)
他们Java Language Specification表明这是“在编译时捕获循环或其他错误的初始化”。
NAME = AAA;
可编辑的原因是NAME
位于声明的左侧。
8.3.2.3. Restrictions on the use of Fields during Initialization
成员声明只有在成员是类或接口C的实例(分别是静态)字段并且满足以下所有条件时才需要以文本方式显示:
用法发生在C的实例(分别是静态)变量初始值设定项或C的实例(分别是静态)初始值设定项中。
该用法不在作业的左侧。
用法是通过一个简单的名称。
C是封闭用法的最里面的类或接口。