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
声明之前,因此首先执行它,并由您看到的输出指示
为什么?
- 未指定的初始化顺序将不利于代码的可移植性
- 任何其他顺序(如倒序、词汇顺序)都是违反直觉的
阅读精细手册:实际问题是什么?您应该避免对与Java API类型名称匹配的自定义类型使用类型名称,特别是来自
Java.lang
及其子包的名称,尤其是著名和广泛使用的类型名称,如Constructor
而不是类构造函数。但是Test
声明c1
和c2
并使用新构造函数(…)
初始化它们。我的回答解释了当您newtest()
时会发生什么。所发生的是创建了这两个构造函数实例。