文档

Java™教程
隐藏目录
枚举类型
路径: 学习Java语言
课程: 类和对象

枚举类型

枚举类型是一种特殊的数据类型,可以使变量成为一组预定义的常量之一。变量必须等于预定义的值之一。常见的例子包括指南针方向(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

上一页: 问题和练习:嵌套类
下一页: 问题和练习:枚举类型