多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Java 枚举示例 > 原文: [https://javatutorial.net/java-enum-example](https://javatutorial.net/java-enum-example) 枚举类型是一种特殊的数据类型,它具有不同的常量,例如`WHITE`,`BLACK`,`RED`。 约定是,它们应以大写字母命名,因为它们又是常量。 在 Java 中,您可以使用`enum`关键字定义枚举类型。 ![java-featured-image](https://img.kancloud.cn/05/3e/053ee0bb59842d92359246c98f815e0c_780x330.jpg) ```java public enum Macronutrients { FATS, CARBOHYDRATES, PROTEIN } ``` 如果您知道编译时程序的所有可能常量,则应以枚举类型表示它们。 Java 在 1.5 中引入了 enum 数据类型。 其他编程语言(例如 C++ 甚至 C)也具有枚举数据类型,但是在 Java 中,它更强大。 例如,在 C/C++ 中,枚举只是整数值的列表,而在 Java 中,它是扩展`Enum`的类本身,并且通常对读取和写入都更好。 最重要的是,由于枚举是一个类的事实,它还提供了允许在枚举成员上进行迭代的不同方法。 在 Java 中,您还可以使用`name()`方法,该方法将为您提供枚举数据类型的成员值: ```java public class Main { public enum Macronutrients { FAT, CARBOHYDRATES, PROTEIN; } public static void main(String[] args) { Macronutrients m = Macronutrients.PROTEIN; System.out.println(m.name()); // PROTEIN } } ``` **输出** ```java PROTEIN ``` Java 中的枚举还为我们提供了灵活性–可以在类内部或外部声明它们。 在类之外声明的枚举: ```java enum Macronutrients { FAT, CARBOHYDRATES, PROTEIN, NONE } public class Main { public static void main(String[] args) { Macronutrients m = Macronutrients.NONE; System.out.println(m.name()); // PROTEIN } } ``` **输出** ```java NONE ``` 在类内声明的枚举: ```java public class Main { public enum Macronutrients { FAT, CARBOHYDRATES, PROTEIN, NONE } public static void main(String[] args) { Macronutrients m = Macronutrients.NONE; System.out.println(m.name()); // PROTEIN } } ``` **输出** ```java NONE ``` 每个枚举都是枚举类型的对象。 还记得我说的枚举赋予我们灵活性吗? 好吧,它也可以作为参数传递给`switch`语句。 **使用`switch`语句**的示例 ```java enum Macronutrients { FAT, CARBOHYDRATES, PROTEIN, NONE } public class Main { Macronutrients macro; public Main(Macronutrients macro) { this.macro = macro; } public void whichMacro() { switch (macro) { case FAT: System.out.println("You've chosen FAT. A bit unhealthy, if it is the bad type of it."); break; case CARBOHYDRATES: System.out.println("You've chosen CARBOHYDRATES. Let's hope it's not sugars, right?"); break; case PROTEIN: System.out.println("You've chosen PROTEIN. Smart decision."); break; default: System.out.println("You have not chosen anything. You must be starving.."); break; } } public static void main(String[] args) { Macronutrients carbs = Macronutrients.CARBOHYDRATES; Macronutrients fats = Macronutrients.FAT; Macronutrients protein = Macronutrients.PROTEIN; Macronutrients nothing = Macronutrients.NONE; Main instance1 = new Main(carbs); instance1.whichMacro(); Main instance2 = new Main(fats); instance2.whichMacro(); Main instance3 = new Main(protein); instance3.whichMacro(); Main instance4 = new Main(nothing); instance4.whichMacro(); } } ``` **输出** ```java You've chosen CARBOHYDRATES. Let's hope it's not sugars, right? You've chosen FAT. A bit unhealthy, if it is the bad type of it. You've chosen PROTEIN. Smart decision. You have not chosen anything. You must be starving.. ``` **要记住的关键事项**: * 由于枚举是公共静态最终,这意味着可以使用枚举名称来访问它,而且由于它是最终的,因此我们无法创建该枚举的子代。 类和枚举之间到底有什么区别? 这是您可能会遇到的一个问题,它将是完全有效的! **类和枚举之间的主要区别** * 枚举扩展了`java.land.Enum`,并为它提供了人类可读的`.toString`方法,`.name`和`.ordinal`方法等。 * 枚举可用于`switch`语句 * 枚举构造函数为我们提供了一些额外的支持方法,例如`values()`,`valueOf()`等,这些方法被证明确实有用。