Java枚举为什么静态行只执行一次?

Java枚举为什么静态行只执行一次?,java,enums,enumeration,Java,Enums,Enumeration,结果是: 1 3 1 3 1 3 2 构造函数为A、B和C运行(3次)。但如果使用static关键字,它只运行一次。这是什么原因?为什么这一行最后执行 enum Enums { A, B, C; { System.out.println(1); } static { System.out.println(2); } private Enums() { System.out.println(3)

结果是:

1
3
1
3
1
3
2
构造函数为A、B和C运行(3次)。但如果使用static关键字,它只运行一次。这是什么原因?为什么这一行最后执行

enum Enums {
    A, B, C;

    {
        System.out.println(1);
    }

    static {
        System.out.println(2);
    }

    private Enums() {
        System.out.println(3);
    }
}

public class MainClass{
    public static void main(String[] args) {
        Enum en = Enums.C;
    }
}

这里有三个不同的因素:

private Enums()
{
    System.out.println(3);
}
这是构造函数。它(或其他一些潜在的构造函数)在创建实例时运行

{
    System.out.println(1);
}
这是一个实例初始值设定项。它在构造对象时运行,而不管使用哪个构造函数

static
{
    System.out.println(2);
}

这是一个静态初始值设定项。一旦这个类被加载到JVM中,它就会运行,不管是否正在创建实例。但是,由于我们处理的是枚举,因此必须在加载类时创建它的所有实例。这就是为什么它在三个构造函数和初始值设定项之后运行。

要补充@smallhacker answer,您应该阅读中的答案

Uff!什么是静态初始值设定项?

静态初始值设定项是java类中的静态{}代码块, 在调用构造函数或main方法之前只运行一次


您对Java中
静态
的含义有何理解?您的问题措辞非常奇怪。“但是如果您使用static关键字,它只运行一次”,这里似乎是指构造函数,但构造函数仍然执行了三次。它只是执行一次的静态块。