2011-12-23 67 views
4
enum icecream { 
    vanilla(100), strawberry(20); 
    int price; 

    icecream(int i) { 
     price = i; 
    } 

} 

我對如何在編譯時是如何枚舉在編譯時轉換以及如何對象創建

我看到一些例子,他們提到它像這樣

創建枚舉對象有點困惑
public enum Flavor 
{ 
    COFFEE, VANILLA, CHOCOLATE, STRAWBERRY, RUM_RAISIN, PEACH 
} 

這被翻譯成(編譯時)

public final class Flavor 
extends java.lang.Enum 
{ 
    public static final Flavor COFFEE = new Flavor("COFFEE", 0); 
    public static final Flavor VANILLA = new Flavor("VANILLA", 1); 
    // ... 
} 

鏈接:http://www.kdgregory.com/index.php?page=java.enum

但是,當我將一個值與名稱一起傳遞給我時,它們是如何創建的,它們就像方法調用一樣。 E.x.香草(100)在這裏爲香草的價格是100,但它是如何創建的?我沒有得到它。請幫忙:(

+0

您已經很好地回答了問題(在問題中)。那麼你還不清楚什麼?枚舉按照您所描述的方式進行翻譯。被翻譯的代碼不清楚? – 2011-12-23 20:28:01

+0

我對這個香草(100)感到困惑......這個100值如何初始化爲價格,因爲我稱之爲香草()而不是冰淇淋()構造函數 – Nav 2011-12-23 20:30:16

+0

'public static final Flavor COFFEE = new Flavor(「COFFEE」,0 );'。你可以看到該對象是通過調用構造函數創建的。 – 2011-12-23 20:30:32

回答

1

vanilla(100), strawberry(20)只是一個java5 +符號。它被編譯到正確的對象創建代碼中譯:

public static final icecream vanilla = new icecream(100); 
public static final icecream strawberry = new icecream(20); 

BTW,Java類型應遵循駝峯格式,所以,icecream應該命名爲IceCream

+0

謝謝你的回答...還有什麼關於序數值將不需要被初始化,當對象與名稱一樣被創建時,就像在public static final Flavor VANILLA = new Flavor(「VANILLA」,1); – Nav 2011-12-23 20:40:09

+0

由於枚舉是「特殊的」,你不能通過你的自己創建對象java可以跟蹤它的值的順序。如果使用序列化和特定枚舉的不同版本,它甚至可以合理工作。 – 2011-12-23 20:47:28

+0

第二行代碼不應該是「草莓」而不是「香草」?另外,正如你提到的CamelCase,不應該把「Icecream」而是「IceCream」?對不起,如果我挑剔 - 只是爲了澄清,以防其他人遇到這個職位... – 2011-12-23 21:09:19

1

枚舉被java編譯器讀取爲常量,但最終它們像任何其他對象一樣實現(即它們不是特殊類型,比如ints/floats/arrays,而是一個語法因此,枚舉具有可以重寫的構造函數,所以你的靜態枚舉不僅僅是一個名字,這可能是非常有用的,例如,如果你想讓你的枚舉值具有。多個字段

例如,我可以具有動物枚舉,其中每個動物有一個名稱,以及若干腿的:

public enum Animal{ 
Dog(4), Baboon(2); 

public int legs; 

private Animal(int legs) { 
    legs=legs; 
} 
} 

但是,如果沒有這樣的覆蓋,編譯器會生成默認的枚舉對象,這實質上就是您粘貼的內容。

+0

請不要使用'l'作爲變量名稱 – 2011-12-23 20:29:27

+0

檢查oooopsie。 – jayunit100 2011-12-24 16:27:59