字段初始化顺序

时间:2017-05-06 04:25:14

标签: java

考虑以下示例:

public class Constructor
{
     Constructor(int i)
     {
            System.out.println(i);
     }
}

public class Test
{

       Constructor c1 = new Constructor(1);

       Constructor c2 = new Constructor(2);

       public static void main(String[] args)
       { 
           new Test();
       }
}

输出:

1
2

请解释为什么会发生这种情况以及此行为是否一致。

1 个答案:

答案 0 :(得分:0)

静态和实例字段的初始化程序是按照它们在源代码中出现的顺序执行的。

在您的示例中,c1声明位于c2声明之前,因此它首先执行,并由您看到的输出指示。

为什么呢?

  1. 因为JLS这样说:

      

    “4)为此类执行实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值分配给相应的实例变量,按从左到右的顺序在源中以文本方式显示该类的代码。“

    (如果这对您没有意义,请参阅JLS以在其上下文中阅读该句子。)

  2. 因为这样做是有道理的:

    • 未指定的初始化顺序对代码可移植性不利,
    • 任何其他顺序(例如逆序,词汇顺序)都会违反直觉。