枚举为实例变量
如果您有一个枚举,例如
enum Coffee {
BIG,
SMALL
}
和一个具有类似枚举的实例变量的类:
public class MyClass {
private Coffee coffee;
// Constructor etc.
}
为什么在构造函数中可以说例如?我不明白你可以使用参考?枚举作为实例变量是否初始化为不是 ?这是SCJP书第一章中的自检问题#4。我试图缩短代码和问题。coffee.BIGnull
如果您有一个枚举,例如
enum Coffee {
BIG,
SMALL
}
和一个具有类似枚举的实例变量的类:
public class MyClass {
private Coffee coffee;
// Constructor etc.
}
为什么在构造函数中可以说例如?我不明白你可以使用参考?枚举作为实例变量是否初始化为不是 ?这是SCJP书第一章中的自检问题#4。我试图缩短代码和问题。coffee.BIGnull
在
enum Coffee {
BIG,
SMALL
}
BIG 或 SMALL 是 Coffee 类的字段,与所有静态字段一样,它们可以通过类名进行访问,例如public static final
Coffee b1 = Coffee.BIG;
或通过与类类型相同的引用,例如
Coffee s2 = b1.SMALL;
Coffee s3 = Coffee.BIG.SMALL; //BIG is reference of type Coffee so it is OK (but looks strange)
但是,请记住,我们应该避免通过引用访问静态成员。这造成了混乱,因为我们不是真正访问实例的成员,而是类的成员(例如,没有多态行为)。
这是幕后发生的事情:
E:\workspace>type Coffee.java
public enum Coffee {
BIG,
SMALL
}
E:\workspace>javap Coffee
Compiled from "Coffee.java"
public final class Coffee extends java.lang.Enum<Coffee> {
public static final Coffee BIG;
public static final Coffee SMALL;
public static Coffee[] values();
public static Coffee valueOf(java.lang.String);
static {};
}
如您所见,本质上是枚举中的静态字段。BIGSMALL
JLS也明确了这一部分:
除了枚举类型 E 从枚举继承的成员之外,对于名称为 n 的每个已声明枚举常量,枚举类型还具有一个隐式声明的公共静态最终字段,该字段名为 N,类型为 E。这些字段被视为在枚举类型中显式声明的任何静态字段之前,以与相应的枚举常量相同的顺序声明。每个这样的字段都初始化为与其对应的枚举常量。
希望这能澄清您的问题。