当我们想定义一种新类型时,发现这个类型的对象的可取值是我一定的范围,并且所有的可取值是可一 一列举
声明枚举类
[public] enum 枚举类型名称 [implement 接口名称列表] {
枚举值;
变量成员声明及初始化;
方法声明及方法体;
}
//枚举类
//定义学生成绩枚举类
enum Score{
EXCELLENT,//优秀
QUALIFIED, //合格
FAILED; //不合格
};
//测试类
public class ScoreTest{
//主方法
public static void main(String[] args){
giveScore(Score.EXCELLENT);
}
//giveScore方法参数 传入 枚举类属性
public static void giveScore(Score s){
switch(s){
case EXCELLENT;
System.out.println("Excellent");
break;
case QUALIFIED;
System.out.println("QUALIFIED");
break;
case FAILED;
System.out.println("FAILED");
break;
}
}
} //ScoreTest类结束
枚举类的特点
- 枚举类定义实际上是定义了一个类
- 所有枚举类型都隐含继承(扩展)自java.lang.Enum,因此枚举类型不能再继 续继承其他任何类(java单继承机制)
- 枚举类型的类体中可以包括方法和变量
-枚举类型的构造方法必须是包内私有或者私有的。定义在枚举开头的常量会被自动创建,不能显式地调用枚举类的构造方法(枚举类构造方法比较特殊的地方)
枚举类型的默认方法
- 静态的values()方法用于获得枚举类型的枚举值的数组(返回一个包含所有枚举值的数组)
- toString方法返回枚举值的字符串描述(将枚举值转成字符串类型)
- valueOf方法将以字符串形式表示的枚举值转化为枚举值类型的对象
- Ordinal方法获得对象在枚举类型中的位置索性
例:声明了变量和方法的枚举类
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;
//静态变量G为整个类所有,是static常量
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的引用p(冒号后面调用枚举类型已有方法,返回整个枚举构成的数组,for循环会依序取出数组的各个元素,每次取出一个元素,都会把引用赋给p)
System.out.printf(“Your weight on %s is %f%n”),
p,p.surfaceWeight(mass));
//枚举值是一个对象,对象有自己的行为能力
//枚举对象在定义枚举类时自动被构造
说明
-本例取自《The Java Tutorials》
-http://docs.oracle.com/javase/tutorial/java/TOC.html
-Planet是一个代表太阳系中行星的枚举类型,其中定义了mass和radius常量(final)成员