和class
一样,通过Enum
关键字来定义枚举类,来表示某个常量集合,因为是常量,其中的字段通常大写:
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
java中的枚举类十分强大,本质上是class
,因此包含成员变量和方法。当创建一个Enum
时,编译器会自动加上一些特定方法,比如静态方法values
,这个方法按照定义的顺序返回枚举类中的枚举值,可以跟for-each
一同使用。
for (Planet p : Planet.values()) {
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
所有Enum
隐式继承了java.lang.Enum
,由于java不允许多重继承,因此枚举类不能再继承其他类。
java规定枚举类中,枚举值要先定义,然后再定义成员变量和方法。如果有成员,枚举值最后要加上分号;
,枚举值之间用逗号,
连接。
枚举值后面可以跟一个或多个参数,用圆括号括起来,创建枚举值时,这些参数会自动传给构造函数。枚举类的构造函数必须是package-private
或 private
的,因为构造函数是自动调用创建枚举值的,不能用户手动调用。
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));
}
}
以上代码定义了太阳系八大行星的质量和半径,并且可以根据物体在地球的重量(单位:N)计算出该物体分别在八大行星的重量。
$ 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