3

看一个测试用例:

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

4

2 回答 2

0

他们的Java 语言规范建议这是为了“在编译时捕获循环或其他格式错误的初始化”。

NAME = AAA;你是可编译的原因NAME是在语句的左侧。


8.3.2.3。初始化期间使用字段的限制

仅当成员是类或接口 C 的实例(分别为静态)字段并且满足以下所有条件时,成员的声明才需要在使用之前以文本形式出现:

  • 该用法出现在 C 的实例(分别为静态)变量初始化器或 C 的实例(分别为静态)初始化器中。

  • 用法不在作业的左侧。

  • 用法是通过一个简单的名称。

  • C 是包含用法的最里面的类或接口。

于 2012-07-04T16:22:52.427 回答
0

您必须了解初始化的顺序

静态初始化程序和类变量初始化程序按文本顺序执行。在您的示例中,静态块在静态变量分配之前。如果换了顺序,答案就会不一样。

当一个类被实例化(对象被创建)时,实例变量被初始化,然后构造器被调用。

于 2012-07-04T15:55:50.303 回答