在学习 Java 认证测试时,我了解到静态初始化块在加载类时按照源代码中出现的顺序运行一次,实例初始化块在每次创建实例时运行,并且构造函数中的代码每次运行之后创建一个实例。为了测试我创建了一个带有一些静态和实例初始化块的类以及一个带有打印内容的构造函数。一切都按预期工作——除了我认为“已加载”意味着仅在运行时,但我猜它在创建第一个实例时发生,因为除非我创建该类的至少一个实例,否则我根本不会得到任何输出。然后我用枚举尝试了同样的操作,订单全部关闭。首先,当在代码中第一次引用枚举时,初始化块针对枚举具有的每个值运行一次,其次——初始化块在我假设的实例初始化块之后标记为静态运行!这与我的预期相反。这是我的问题的细分。
- 为什么标记为静态的 init 块在枚举中最后运行?
- 枚举可以有实例初始化块吗?
- 为什么我认为是实例初始化块的块仅在加载枚举时运行一次,而不是每次引用新的枚举值时运行?
- 类静态初始化块在“加载”类时运行。已加载是什么意思?当一个对象在类中实例化时,它只发生一次吗?
谢谢!这让我很困惑。
public class EnumInit {
public static void main(String[] args) {
System.out.println(Color.RED.toString() + " Main");
MyInit myInit = new MyInit();
System.out.println(Color.BLUE.toString() + " Main");
MyInit mySecondInit = new MyInit();
}
}
enum Color {
RED, BLUE, GREEN;
String instanceVar = "Enum Instance Variable Text";
static { System.out.println("Enum Static init block 1"); }
{ System.out.println("Enum Instance init block 1"); }
static { System.out.println("Enum Static static init block 2"); }
Color() {
System.out.println(instanceVar);
System.out.println("Enum String Literal");
}
{ System.out.println("Enum Instance init block 2"); }
}
class MyInit {
String instanceVar = "Class Instance Variable Text";
static { System.out.println("Class Static init block 1"); }
{ System.out.println("Class Instance init block 1"); }
static { System.out.println("Class Static static init block 2"); }
MyInit() {
System.out.println(instanceVar);
System.out.println("Class String Literal");
}
{ System.out.println("Class Instance init block 2"); }
}
The Java 语言规范是这样描述的enum常量 http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2
除了枚举类型 E 继承自 Enum 的成员之外,对于每个声明的名为 n 的枚举常量,枚举类型都有一个
隐式声明名为 n 的 E 类型公共静态最终字段。这些
字段被认为是按照与
相应的枚举常量,在任何静态字段显式之前
在枚举类型中声明。每个这样的字段都被初始化为枚举
与其对应的常数。
So
enum Color {
RED, BLUE, GREEN;
...
}
实际上是
public static final Color RED = new Color();
public static final Color BLUE = new Color();
public static final Color GREEN = new Color();
这将在之前得到评估static
你拥有的方块。
为什么标记为静态的 init 块在枚举中最后运行?
往上看。
枚举可以有实例初始化块吗?
是的,编译你的代码,你就会看到。
为什么我认为是实例初始化块的块仅在加载枚举时运行一次,而不是每次引用新的枚举值时运行?
枚举类型初始化后,就会创建(实例化)枚举常量。你不创建一个新的enum
任何时候你这样做
Color color = Color.RED;
您只是引用一个已经创建的现有对象。
类静态初始化块在“加载”类时运行。已加载是什么意思?当一个对象在类中实例化时,它只发生一次吗?
当一个类第一次在 JVM 中被引用时,它会被加载ClassLoader
并初始化。在这里阅读更多相关信息。 https://stackoverflow.com/questions/3499214/java-static-class-initialization
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)