Java 为什么“a”;自定义枚举构造函数“;是否返回所有其他枚举类型的信息?
输出:Java 为什么“a”;自定义枚举构造函数“;是否返回所有其他枚举类型的信息?,java,enums,Java,Enums,输出: enum TrafficSignal { //this will call enum constructor with one String argument RED("wait"), GREEN("go"), ORANGE("slow down"); private String action; public String getAction() { return this.action; }
enum TrafficSignal {
//this will call enum constructor with one String argument
RED("wait"),
GREEN("go"),
ORANGE("slow down");
private String action;
public String getAction() {
return this.action;
}
// enum constructor - can not be public or protected
TrafficSignal(String action){
this.action = action;
System.out.println(this.action);
}
}
public class EnumConstructorExample{
public static void main(String args[]) {
// Only one Enum object initialized/instaniated
TrafficSignal c1 = TrafficSignal.GREEN;
}
}
我只是想知道,尽管我只初始化了一个枚举对象(
TrafficSignal.GREEN
),为什么输出会给出所有其他枚举类型的信息。枚举值是枚举类上的常量(公共静态最终字段)。初始化枚举类本身时,它将经历正常的类初始化过程,包括初始化所有字段(包括值实例)和运行静态初始化程序块。使用Class.forName
可以获得相同的行为,而无需实际引用任何值。枚举可以有构造函数,并且在加载枚举类时为每个枚举常量分别执行该构造函数。类加载时自动实例化的所有枚举对象
你说:
尽管如此,我只初始化了一个枚举对象(TrafficSignal.GREEN)
不对。您没有实例化枚举对象
您访问了enum类的现有对象。该对象是在加载枚举的类时实例化的
事实上,所有枚举对象都是在类加载时实例化的。作为为每个常量名实例化一个对象的一部分,将自动调用其构造函数。所有这些都是在加载枚举类时发生的。所有这些都发生在代码执行之前。必须先加载代码中使用的类,然后才能执行代码。因此,三个命名常量意味着构造函数被调用三次,每次在访问名为
GREEN
的常量所引用的对象之前打印操作
成员字段值,加载枚举类时将创建所有枚举值。当这种情况发生时,将为每个值调用构造函数,而不仅仅是您使用并触发初始化的值。并且TrafficSignal c1=TrafficSignal。绿色
根本不初始化任何内容。
wait
go
slow down