枚举类型是一种特殊的数据类型,它使变量成为一组预约义的常量,变量必须等于为其预约义的值之一,常见示例包括罗盘方向(NORTH
、SOUTH
、EAST
和WEST
的值)和星期。java
由于它们是常量,因此枚举类型字段的名称是大写字母。编程
在Java编程语言中,你可使用enum
关键字定义枚举类型,例如,你能够将星期的枚举类型指定为:segmentfault
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("Mondays are bad."); break; case FRIDAY: System.out.println("Fridays are better."); break; case SATURDAY: case SUNDAY: System.out.println("Weekends are best."); break; default: System.out.println("Midweek days are so-so."); 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(); } }
输出是:函数
Mondays are bad. Midweek days are so-so. Fridays are better. Weekends are best. Weekends are best.
Java编程语言枚举类型比其余语言中的对应类型强大得多,枚举声明定义了一个类(称为枚举类型),枚举类体能够包括方法和其余字段,编译器在建立枚举时会自动添加一些特殊方法。例如,它们有一个静态值方法,该方法返回一个数组,该数组按照声明的顺序包含枚举的全部值,此方法一般与for-each
构造结合使用,以迭代枚举类型的值。例如,下面Planet
类示例中的代码遍历太阳系中的全部行星。this
for (Planet p : Planet.values()) { System.out.printf("Your weight on %s is %f%n", p, p.surfaceWeight(mass)); }
注意:全部枚举都隐式扩展
java.lang.Enum
,因为类只能扩展一个父级(请参阅
声明类),所以Java语言不支持状态多重继承(请参阅状态、实现和类型的多重继承),所以枚举不能扩展其余任何内容。
在如下示例中,Planet
是一种枚举类型,表示太阳系中的行星,它们具备恒定的质量和半径属性。命令行
每一个枚举常量都声明了质量和半径参数的值,建立常量时,这些值将传递给构造函数,Java要求在任何字段或方法以前首先定义常量,此外,当存在字段和方法时,枚举常量列表必须以分号结尾。code
注意:枚举类型的构造函数必须是包私有或私有访问,它会自动建立在枚举体开头定义的常量,你不能本身调用枚举构造函数。
除了它的属性和构造函数以外,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; // in kilograms private final double radius; // in meters Planet(double mass, double radius) { this.mass = mass; this.radius = radius; } private double mass() { return mass; } private double radius() { return radius; } // universal gravitational constant (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("Usage: java Planet <earth_weight>"); System.exit(-1); } double earthWeight = Double.parseDouble(args[0]); double mass = earthWeight/EARTH.surfaceGravity(); for (Planet p : Planet.values()) System.out.printf("Your weight on %s is %f%n", p, p.surfaceWeight(mass)); } }
若是从命令行运行Planet.class
,参数为175
,则会获得如下输出:
$ java Planet 175 Your weight on MERCURY is 66.107583 Your weight on VENUS is 158.374842 Your weight on EARTH is 175.000000 Your weight on MARS is 66.279007 Your weight on JUPITER is 442.847567 Your weight on SATURN is 186.552719 Your weight on URANUS is 158.397260 Your weight on NEPTUNE is 199.207413