8.
【知识点】
(1)枚举类型(Enum Type)
枚举类型允许预定义一组常量,并且只能从这组常量中取值,每个枚举常量在声明时可以定义它的属性值,属性值包含在常量名后的圆括号中,如果没有声明属性值,则由系统按默认规则分配属性值。习惯上,枚举常量名的字母都大写。
Java语言中枚举类型的关键词是enum,例如:
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
Java语言的枚举类型隐式地继承了java.lang.Enum类,因此,它本质上是一个类(class),可以包含方法和字段,但却不能再继承其他任何类了。另外,编译器在创建枚举对象时会自动添加一些特殊方法,如静态方法values()会按定义枚举类型时常量顺序返回一个包括所有枚举值的数组。
(2)定义枚举类型
枚举类型中除了枚举常量列表,还可定义方法、字段,枚举常量必须定义在整个枚举类的开始部分,即必须先于所有字段和方法定义。
当枚举类型中包含字段、方法时,枚举常量列表必须以分号结束。
另外,枚举类型还可以定义构造方法,构造方法访问类型是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
public staticfinal 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 (Planetp : Planet.values())
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
}
在上例中,每个枚举常量在声明时可以定义它的属性值,属性值包含在常量名后的圆括号中,如:EARTH (5.976e+24, 6.37814e6),这表示EARTH常量有两个属性值,这两个属性值在使用EARTH常量时会传递给枚举类型的构造方法Planet(double mass,double radius)中对应的参数,因此,应该注意枚举类型构造方法参数与常量属性之间类型、个数、次序的对应关系。虽然本质上来说,每个枚举类型常量在使用时相当于创建了一个枚举类型的实例,但必须要注意的是,枚举类型不允许调用其构造方法创建新的枚举常量,也就是说除了自己声明的枚举常量外不能再创建其他常量,这是因为枚举构造方法的访问类型是private,不允许在本类以外被调用,当然也就不能再创建实例了。
【例题】
Given:
class Nav{
publicenum Direction { NORTH, SOUTH, EAST, WEST }
}
public class Sprite{
// insertcode here
}
Which code, inserted at line 14, allows the Spriteclass to compile?
A. Direction d = NORTH;
B. Nav.Direction d = NORTH;
C. Direction d = Direction.NORTH;
D. Nav.Direction d = Nav.Direction.NORTH;
【Answer】D
【例题辨析】
A. (1)枚举类型Direction相当于Nav的内部类,声明它的变量时,Direction d应修改为Nav.Direction d;(2)使用枚举常量时应该指定枚举类型名,因此NORTH应修改为Direction.NORTH。
B. 使用枚举常量时应该指定枚举类型名,因此NORTH应修改为Direction.NORTH。
C. 枚举类型Direction相当于Nav的内部类,声明它的变量时,Direction d应修改为Nav.Direction d.
D. 符合枚举类型使用语法。