静态字段无法在静态块中进行前向引用,但可以为其分配值

时间:2012-07-04 15:47:37

标签: java jvm

看一下测试用例:

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允许这种写作?

2 个答案:

答案 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是封闭用法的最里面的类或接口。