Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么“a”;自定义枚举构造函数“;是否返回所有其他枚举类型的信息?_Java_Enums - Fatal编程技术网

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