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);
}
}
# 1 楼答案
命令如下:
枚举构造函数
枚举构造函数在初始化静态字段之前运行。这是必需的,因为静态方法需要访问所有枚举值(实例)。枚举值隐式分配给静态字段
静态初始值设定项
然后,按照出现的顺序调用静态初始值设定项和静态块
参考资料:
# 2 楼答案
“类构造函数”是一个口语术语,根据规范,名称为static initializer。请注意:Java中没有“静态类”这样的东西;-)
Java中的枚举是类。它们都有相同的修剪和行为(它们甚至可以有可变的字段,尽管这通常是个坏主意)。它们仅在类型层次结构(它们不能显式扩展另一个类,也不能显式扩展它们自己)和构造(它们的枚举值是可以创建的仅实例)中受到限制
因此,静态初始化程序块的执行方式与普通类相同:加载/初始化类时。这通常发生在第一次访问时
# 3 楼答案
在第一次调用enum时,但在创建所有enum值之后,将处理静态块。顺便说一句,你的代码不起作用。Java枚举中没有继承。如果你需要这样的东西,就求助于界面