Java 如何在编译期间转换枚举以及如何创建对象

Java 如何在编译期间转换枚举以及如何创建对象,java,enums,Java,Enums,对于如何在编译期间创建enum对象,我有点困惑 我看到一些例子,他们这样提到它 enum icecream { vanilla(100), strawberry(20); int price; icecream(int i) { price = i; } } 这将转换为(编译期间) 链接: 但是,当我将值和名称一起传递时,对象是如何创建的,因为它们看起来就像方法调用。E.x.香草(100)这里的香草价格是100,但它实际上是如何产生的?我一点

对于如何在编译期间创建enum对象,我有点困惑

我看到一些例子,他们这样提到它

enum icecream {
    vanilla(100), strawberry(20);
    int price;

    icecream(int i) {
        price = i;
    }

}
这将转换为(编译期间)

链接:


但是,当我将值和名称一起传递时,对象是如何创建的,因为它们看起来就像方法调用。E.x.香草(100)这里的香草价格是100,但它实际上是如何产生的?我一点也不明白。请提供帮助:(

枚举由java编译器读取为常量,但最终它们的实现方式与任何其他对象一样(也就是说,它们不是特殊类型,如int/float/array,而是纯面向对象语言功能上的语法包装器)。因此,枚举具有可重写的构造函数,因此静态枚举不仅仅具有名称。例如,如果希望枚举值具有多个字段,这可能非常有用

例如,我可能有一个动物枚举,其中每只动物都有一个名称,还有一些腿:

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);
    // ...
}
但是,在没有此类重写的情况下,编译器会生成默认枚举对象,这基本上就是您粘贴的对象。

香草(100)、草莓(20)只是一个java5+符号。在编译过程中,它会被转换为正确的对象创建代码:

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

 public int legs;

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

顺便说一句,java类型应该是CamelCased,所以,
icecream
应该被命名为
icecream

您已经很好地回答了问题(在问题中)。那么您还不清楚什么?enum按照您描述的方式翻译。翻译的代码不清楚吗?我对这个香草(100)感到困惑…当我调用vanilla()not icecream()构造函数时,这个100值是如何初始化为price的
public static final Flavor COFFEE=new Flavor(“COFFEE”,0);
。您可以看到该对象是通过调用构造函数创建的。我询问的是值初始化问题,而且我正在重写构造函数。在这种情况下,创建对象的执行流程是什么???请不要将
l
用作变量名谢谢您的回答…还有,序号值将如何't当对象与public static final Flavor VANILLA=new Flavor(“VANILLA”,1)中的名称一起创建时,它需要初始化;因为枚举是“特殊的”你不能自己创建对象,java可以跟踪它的值顺序。如果你使用序列化和特定枚举的不同版本,它甚至可以正常工作。第二行代码不应该是“草莓”而不是“香草”吗?另外,正如你提到的CamelCase,“Icecream”不应该是“Icecream”吗?对不起,如果我吹毛求疵-只是想澄清一下,以防其他人看到这篇文章。。。
public enum Animal{
 Dog(4), Baboon(2);

 public int legs;

 private Animal(int legs) {
   legs=legs;
 }
}
public static final icecream vanilla = new icecream(100);
public static final icecream strawberry = new icecream(20);