2012-08-04 86 views
19

如果你有一个枚举如枚举实例变量

enum Coffee { 
    BIG, 
    SMALL 
} 

而且具有这样的枚举的实例变量的类:

public class MyClass { 
    private Coffee coffee; 

    // Constructor etc. 
} 

在构造函数中为什么有可能说例如coffee.BIG? 我不明白,你可以使用参考?是枚举作为实例变量初始化为null以外的东西?这是第一章SCJP书中的自测问题#4。 我试图缩短代码和问题。

回答

18

enum Coffee { 
    BIG, 
    SMALL 
} 

大或小是咖啡类的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) 

但是让我们记住我们应该避免通过引用访问静态成员。这会造成混淆,因为我们并不真正访问实例的成员,但的成员(因此没有多态行为)。

5

在Java 5之前,实现枚举的方法是创建一个具有私有构造函数的类和初始化为特定值的同一类的public final字段。

由于Java 5,枚举结构实际上是一种糖,做同样的,也照顾之类的东西空值是不允许的,枚举值将成为公共静态字段等

12

这是什么情况背后场景

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枚举常量继承成员,枚举类型有一个 隐声明的公共静态final字段名为n类型E.这些 字段被认为是按照与枚举类型中声明的任何静态字段显式地 相对应的枚举常量的 相同的顺序声明的。每个这样的字段被初始化为与其对应的枚举 常量。

希望能够澄清您的问题。