Java 字段初始化顺序

Java 字段初始化顺序,java,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 ma

考虑以下示例:

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

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

静态字段和实例字段的初始值设定项是类,并按照它们在源代码中出现的顺序执行

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

为什么?

  • 因为政府是这么说的:

    4)执行该类的实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值按从左到右的顺序分配给相应的实例变量,这些值在该类的源代码中以文本形式出现

    (如果你觉得没有意义,请参考JLS,结合上下文阅读句子。)

  • 因为这样做是有道理的:

    • 未指定的初始化顺序将不利于代码的可移植性
    • 任何其他顺序(如倒序、词汇顺序)都是违反直觉的

  • 阅读精细手册:实际问题是什么?您应该避免对与Java API类型名称匹配的自定义类型使用类型名称,特别是来自
    Java.lang
    及其子包的名称,尤其是著名和广泛使用的类型名称,如
    Constructor
    而不是类构造函数。但是
    Test
    声明
    c1
    c2
    并使用
    新构造函数(…)
    初始化它们。我的回答解释了当您
    newtest()
    时会发生什么。所发生的是创建了这两个
    构造函数
    实例。