这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK版本说明,了解所有JDK版本中新功能、增强功能和已删除或不推荐的选项的信息。
枚举类型是一种特殊的数据类型,可以使变量成为一组预定义的常量之一。变量必须等于预定义的值之一。常见的例子包括指南针方向(NORTH、SOUTH、EAST和WEST)和一周的天数。
由于它们是常量,枚举类型的字段名称都是大写字母。
在Java编程语言中,使用enum
关键字定义枚举类型。例如,你可以指定一个星期几的枚举类型:
public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }
每当需要表示一组固定常量时,应使用枚举类型。这包括自然枚举类型,例如我们太阳系中的行星和在编译时已知所有可能值的数据集,例如菜单上的选项、命令行标志等。
下面是一些代码,展示了如何使用上面定义的Day
枚举:
public class EnumTest { Day day; public EnumTest(Day day) { this.day = day; } public void tellItLikeItIs() { switch (day) { case MONDAY: System.out.println("星期一很糟糕。"); break; case FRIDAY: System.out.println("星期五更好。"); break; case SATURDAY: case SUNDAY: System.out.println("周末最棒。"); break; default: System.out.println("工作日一般般。"); break; } } public static void main(String[] args) { EnumTest firstDay = new EnumTest(Day.MONDAY); firstDay.tellItLikeItIs(); EnumTest thirdDay = new EnumTest(Day.WEDNESDAY); thirdDay.tellItLikeItIs(); EnumTest fifthDay = new EnumTest(Day.FRIDAY); fifthDay.tellItLikeItIs(); EnumTest sixthDay = new EnumTest(Day.SATURDAY); sixthDay.tellItLikeItIs(); EnumTest seventhDay = new EnumTest(Day.SUNDAY); seventhDay.tellItLikeItIs(); } }
输出结果为:
星期一很糟糕。 工作日一般般。 星期五更好。 周末最棒。 周末最棒。
Java编程语言的枚举类型比其他语言的枚举类型更强大。enum
声明定义了一个类(称为枚举类型)。枚举类的主体可以包含方法和其他字段。编译器在创建枚举时会自动添加一些特殊的方法。例如,它们有一个静态的values
方法,返回按照声明顺序包含所有枚举值的数组。这种方法通常与for-each循环结合使用,用于迭代枚举类型的值。例如,下面来自Planet
类示例的代码遍历了太阳系中的所有行星。
for (Planet p : Planet.values()) { System.out.printf("在%s上的体重为%f%n", p, p.surfaceWeight(mass)); }
java.lang.Enum
。因为一个类只能继承一个父类(参见声明类),Java语言不支持多重继承的状态(参见多重继承的状态、实现和类型),因此枚举不能继承其他任何东西。
在下面的示例中,Planet
是一个枚举类型,表示太阳系中的行星。它们被定义为具有恒定质量和半径属性。
每个枚举常量都声明了质量和半径参数的值。这些值在常量创建时传递给构造函数。Java要求常量在任何字段或方法之前定义。而且,当有字段和方法时,枚举常量的列表必须以分号结尾。
除了属性和构造函数之外,Planet
还有一些方法,允许您在每个行星上检索物体的表面重力和重量。下面是一个示例程序,它接受您在地球上的体重(以任何单位)并计算并打印出您在所有行星上的体重(以相同的单位):
public enum Planet { MERCURY (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), EARTH (5.976e+24, 6.37814e6), MARS (6.421e+23, 3.3972e6), JUPITER (1.9e+27, 7.1492e7), SATURN (5.688e+26, 6.0268e7), URANUS (8.686e+25, 2.5559e7), NEPTUNE (1.024e+26, 2.4746e7); private final double mass; // 千克 private final double radius; // 米 Planet(double mass, double radius) { this.mass = mass; this.radius = radius; } private double mass() { return mass; } private double radius() { return radius; } // 宇宙引力常数 (m3 kg-1 s-2) public static final double G = 6.67300E-11; double surfaceGravity() { return G * mass / (radius * radius); } double surfaceWeight(double otherMass) { return otherMass * surfaceGravity(); } public static void main(String[] args) { if (args.length != 1) { System.err.println("用法: java Planet <地球体重>"); System.exit(-1); } double earthWeight = Double.parseDouble(args[0]); double mass = earthWeight/EARTH.surfaceGravity(); for (Planet p : Planet.values()) System.out.printf("在%s上的体重为%f%n", p, p.surfaceWeight(mass)); } }
如果你在命令行中运行Planet.class
并给出一个参数为175,你将得到以下输出:
$ java Planet 175 你在水星上的体重为66.107583 你在金星上的体重为158.374842 你在地球上的体重为175.000000 你在火星上的体重为66.279007 你在木星上的体重为442.847567 你在土星上的体重为186.552719 你在天王星上的体重为158.397260 你在海王星上的体重为199.207413