2012-08-04 104 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.這些 字段被認爲是按照與枚舉類型中聲明的任何靜態字段顯式地 相對應的枚舉常量的 相同的順序聲明的。每個這樣的字段被初始化爲與其對應的枚舉 常量。

希望能夠澄清您的問題。