实例变量初始化器的排序

时间:2013-04-05 09:53:25

标签: java initialization

似乎很直观地清楚,在Java中,instance variable intitializers按照它们在类声明中出现的顺序执行。

我正在使用的JDK中肯定会出现这种情况。例如,以下内容:

public class Clazz {
    int x = 42;
    int y = this.z;
    int z = this.x;
    void print() {
        System.out.printf("%d %d %d\n", x, y, z);
    }
    public static void main(String[] args) {
        new Clazz().print();
    }
}

打印42 0 42(换句话说,y获取默认值z)。

这个订单真的有保证吗?我一直在查看JLS,但找不到任何明确的确认。

2 个答案:

答案 0 :(得分:6)

是的,是的。

se7 JLS涵盖了12.5 Execution部分中的实例变量初始化顺序:

  

...
  4.为此类执行实例初始值设定项和实例变量初始值设定项,分配实例变量的值   初始化器到相应的实例变量中   从左到右的顺序,它们在源代码中以文本形式出现   为了上课。如果执行任何这些初始化程序导致   异常,然后没有处理进一步的初始化程序   程序突然完成同样的异常。除此以外,   继续步骤5.
  ...

the JLS for Java 5在“课程”部分提到:

  

执行静态初始值设定项和类变量初始值设定项   以文字顺序。

答案 1 :(得分:0)

是的,类中的变量初始化以相同的顺序执行。因此,在第二行中,y采用z的默认值o,因为z未初始化