Java枚举为何静态行仅执行一次?

时间:2018-07-31 14:57:39

标签: 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);
    }
}

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

2 个答案:

答案 0 :(得分:1)

这里有三种不同的玩法:

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

这是构造函数。创建实例时,它(或其他潜在的构造函数)运行。

{
    System.out.println(1);
}

这是实例初始化程序。它在构造对象时运行,无论使用哪种构造器。

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

这是静态初始化程序。一旦将此类加载到JVM中,无论是否正在创建实例,它都将运行。但是,由于我们正在处理枚举,因此必须在加载类时创建其所有实例。这就是为什么它在三个构造函数和初始化程序之后运行。

答案 1 :(得分:1)

要补充@smallhacker答案,您应该阅读Static initializer in Java

中的答案
  

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

     

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