有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java什么时候执行这些类和子类静态块(对于枚举)?

我正在尝试为枚举定义基类(SubStatus

下面什么时候调用static块?如果它们是类而不是枚举,我相信它们会在调用类构造函数之后被调用

但是因为它们是Enum类,所以它们不是更像static类吗?那么,当容器加载静态实例时,是否执行静态块

亚状态

public enum SubStatus
{
     WAITING(0),
     READY(1);

     protected static final Map<Integer,SubStatus> lookup 
          = new HashMap<Integer,SubStatus>();

     static {
          for(SubStatus s : EnumSet.allOf(SubStatus.class))
               lookup.put(s.getCode(), s);
     }

     protected int code;

     protected SubStatus(int code) {
          this.code = code;
     }

     public int getCode() { return code; }

     public static SubStatus get(int code) { 
          return lookup.get(code); 
     }
}

地位

public enum Status extends SubStatus
{
     SKIPPED(-1),
     COMPLETED(5);

     private static final Map<Integer,Status> lookup 
          = new HashMap<Integer,Status>();

     static {
          for(Status s : EnumSet.allOf(Status.class))
               lookup.put(s.getCode(), s);
     }

     private int code;

     private Status(int code) {
          this.code = code;
     }

     public int getCode() { return code; }

     public static Status get(int code) { 
          return lookup.get(code); 
     }
}

共 (3) 个答案

  1. # 1 楼答案

    命令如下:

    1. 枚举构造函数

      枚举构造函数在初始化静态字段之前运行。这是必需的,因为静态方法需要访问所有枚举值(实例)。枚举值隐式分配给静态字段

    2. 静态初始值设定项

      然后,按照出现的顺序调用静态初始值设定项和静态块

    参考资料:

  2. # 2 楼答案

    “类构造函数”是一个口语术语,根据规范,名称为static initializer。请注意:Java中没有“静态类”这样的东西;-)

    Java中的枚举是类。它们都有相同的修剪和行为(它们甚至可以有可变的字段,尽管这通常是个坏主意)。它们仅在类型层次结构(它们不能显式扩展另一个类,也不能显式扩展它们自己)和构造(它们的枚举值是可以创建的实例)中受到限制

    因此,静态初始化程序块的执行方式与普通类相同:加载/初始化类时。这通常发生在第一次访问时

  3. # 3 楼答案

    在第一次调用enum时,但在创建所有enum值之后,将处理静态块。顺便说一句,你的代码不起作用。Java枚举中没有继承。如果你需要这样的东西,就求助于界面