实例变量初始化器的排序
直观地说,在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涵盖12.5执行部分中的实例变量初始化顺序:
…
4.为此类执行实例初始化程序和实例变量初始值设定项,将实例变量初始值设定项的值按从左到右的顺序分配给相应的实例变量,在这些顺序中,它们以文本方式出现在类的源代码中。 如果执行任何这些初始值设定项导致exception,则不会处理其他初始值设定项,并且此过程会突然完成同样的exception。 否则,继续步骤5。
…
JLS for Java 5在“类”部分中提到:
静态初始值设定项和类变量初始值设定项以文本顺序执行。
是的,类中的变量初始化以相同的顺序执行。 因此,在第二行中,y采用z的默认值o,因为z未初始化