Java 实例变量初始值设定项的排序

Java 实例变量初始值设定项的排序,java,initialization,Java,Initialization,从直觉上看,在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

从直觉上看,在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,找不到任何明确的确认。

是的,是的

se7 JLS在以下章节中介绍了实例变量初始化顺序:


4.执行该类的实例初始值设定项和实例变量初始值设定项,分配实例变量的值 在 它们在源代码中从左到右的文本显示顺序 为了班级。如果执行这些初始值设定项中的任何一个会导致 异常,则不再处理其他初始值设定项,并且 过程突然完成,但出现了相同的异常。否则,, 继续执行步骤5。

在“课程”部分提到:

执行静态初始值设定项和类变量初始值设定项 按文本顺序


是,类中的变量初始化以相同的顺序执行。因此,在第二行中,y取z的默认值o,因为z在分配
y
时没有初始化,
z
仍然没有初始化,因此它显示
0
@ShivanRaptor:这正是我的直觉。问题在于联合联络小组是否正式规定了这一点。