枚舉類型是一種特殊的數據類型,它使變量成爲一組預約義的常量,變量必須等於爲其預約義的值之一,常見示例包括羅盤方向(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