Java中静态变量和初始化顺序的文本顺序

时间:2014-03-06 08:58:12

标签: java

我只花了五分钟在SO中找到一份副本。

我的问题很简单。以下代码是否始终有效?

public class LexicalOrderStatic {
    private static Integer a1 = initA1();

    private static Integer a2 = initA2();


    private static Integer initA2(){
        return new Integer(5) / a1;
    }

    private static Integer initA1(){
        return new Integer(5);
    }

    public Integer getA1(){
        return new Integer(a2);
    }

    public static void main(String[] args) {
        LexicalOrderStatic lexLuthor = new LexicalOrderStatic();
        System.out.println(lexLuthor.getA1());

    }
}

在java中,我可以确定a1在a2之前始终初始化吗?

感谢。如果被问到或者它是否非常简单,Dw就可以了。

2 个答案:

答案 0 :(得分:8)

  

在java中我可以确定a1总是在a2之前初始化吗?

是的,因为规范(section 12.4.2)保证了它(强调我的):

  

接下来,执行类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,按文本顺序,就像它们是单个块一样。

请注意,常量早于非常量初始化(步骤6与上面引用的步骤9相比)。

答案 1 :(得分:0)

是。 元素链组(类的名称,静态属性,实例属性,静态方法,内部静态代码块等)(1)在编译时定义,而不是在运行时定义:它有确定性的行为。

当您运行 main 时,您第一次加载了 LexicalOrderStatic ,如果这是第一次加载,则会非常快速地加载静态元素(属性,方法)。

如果您加载 LexicalOrderStatic 的第二个对象,则该属性在两个实例之间共享。

Yu可以在运行此修改后的 main

时看到此语句
public static void main(String[] args) {
    LexicalOrderStatic lexLuthor = new LexicalOrderStatic();
    System.out.println(lexLuthor.getA1());
    LexicalOrderStatic lexLuthor2 = new LexicalOrderStatic();
    System.out.println(lexLuthor2.getA1());
}

(1)在我提到继承之前,但正如第一条评论所指出的那样情况