每一个枚举常量都是一个其枚举类型的对象,理解这一点很重要.因此,枚举可以定义构造函数,添加方法和包含实例变量.当定义枚举的构造函数时,会在每一个枚举常量创建时调用构造函数.每一个枚举常量都可以调用枚举定义的任何方法.每一个枚举常量对于枚举定义的实例变量都包含自己的副本.下面的Transport演示了构造函数,实例变量和方法的用法,他为每一种运输类型提供了一种常见速度.
public class test2 { // @param args public static void main(String args[]) { System.out.println("All Transport speeds:"); for(Transport t : Transport.values()) System.out.println(t+" typical speed is : "+t.getSpeed()); } } enum Transport { CAR(65),TRUCK(55),AIRPLANE(600),TRAIN(70),BOAT(22); private int speed; Transport(int s) { speed = s; } int getSpeed() { return speed; } }
程序的输出如下所示:
All Transport speeds: CAR typical speed is : 65 TRUCK typical speed is : 55 AIRPLANE typical speed is : 600 TRAIN typical speed is : 70 BOAT typical speed is : 22
该版本的Transport添加了3项内容.首先是实例变量speed,他用来保存每一种运输类型的速度.其次是Transport构造函数,他用来传递运输类型的速度.最后是方法getSpeed().他返回Speed的值.
当在main()中声明变量tp时,指定每一个常量都要调用一次Transport的构造函数.注意,构造函数的实参是如何指定的,他们放在括号中,跟在每一个常量的后面,如下所示:
CAR(65),TRUCK(55),AIRPLANE(600),TRAIN(70),BOAT(22);
这些值被传递给Transport()的s形参,然后赋值给speed.还要注意枚举常量列表,他由一个分号终止,即最后一个常量BOAT的后面跟一个分号.当一个枚举中包含其他成员时,枚举列表必须以分号结束.
由于每一个枚举常量都有自己的speed副本,因此可以通过调用getSpeed()获得指定运输类型的速度.例如,在main()中,飞机的速度使用下面的调用获得:
Transport.AIRPLANE.getSpeed()
问:Java现在添加了枚举,是否不必再使用final变量?换句话说,枚举使得final变量过时了吗?
答:不对,枚举适合与处理必须由标识符表示的条目列表的情况,而final变量适合于拥有的常量值(如数组大小)可用于许多地方的情况.他们各有所长.有了枚举后,就不必在某些适合使用枚举的地方勉为其难的使用final了.
每一种运输类型的速度都通过使用for循环遍历枚举来获得.由于每一个枚举常量都拥有一个speed副本,因此,与一个常量相关联的值与另一个常量相关联的值是不同的.这是一个重要概念,只有当枚举实现为类时才有效,就像Java中这样.
前面的示例中只包含了一个构造函数,其实一个枚举可以提供多个重载形式,就像其他类那样.
两点重要限制:
应用枚举时有两点重要限制:首先,枚举不能继承另一个类;其次,enum不能是超类.这意味着不能扩展enum.除此以外,enum和其他类型都一样.关键是要记住,每一个枚举常量都是定义枚举的类的一个对象.