9

看起来很直观,在 Java 中,实例变量初始化程序是按照它们在类声明中出现的顺序执行的。

在我使用的 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,但找不到任何明确的确认。

4

2 回答 2

6

是的。

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

...
4. 执行该类的实例初始化器和实例变量初始化器,将实例变量初始化器的值分配给相应的实例变量,按照它们在源代码中以文本形式出现的从左到右的顺序. 如果执行这些初始化程序中的任何一个导致异常,则不会处理更多初始化程序,并且此过程会突然完成相同的异常。否则,继续第 5 步。
...

JLS for Java 5在“类”部分中提到:

静态初始化程序和类变量初始化程序按文本顺序执行。

于 2013-04-05T10:05:44.837 回答
0

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

于 2013-04-05T10:12:40.070 回答