【Java新特性JDK5】1.枚举
一、枚举类
1、JDK5中提供了枚举类。
格式是:只有枚举项的枚举类
public enum 枚举类名 {
枚举项1,枚举项2,枚举项3…;
}
2、枚举类的注意事项:
-
定义枚举类时要用关键字enum
-
所有的枚举类都是Enum的子类
-
枚举类的第一行上必须是枚举项,最后一个枚举项后的分号可以省略,但是,如果枚举类后面有其他东西,这个分号就不能省略。建议不要省略!
-
枚举类可以有构造方法,但必须是私有private的,它默认的也是private的。枚举项的构造方法的用法比较特殊:枚举(“枚举值”);
-
枚举类也可以有抽象方法abstract,但是,枚举项必须重写该方法。
-
枚举类在switch语句中的使用。
3、测试举例
(1)版本1
package cn.itcast_02;
/*
* 通过JDK5提供的枚举来做枚举类
*/
public enum Direction {
FRONT, BEHIND, LEFT, RIGHT;
}
(2)版本2:Enum的构造方法
package cn.itcast_02;
/*
* 通过JDK5提供的枚举来做枚举类
* protected Enum(String name, int ordinal)
* Enum的单独的构造方法。程序员无法调用此构造方法。该构造方法用于由响应枚举类型声明的编译器发出的代码。
* 参数:
* name - - 此枚举常量的名称,它是用来声明该常量的标识符。
* ordinal - - 枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
*/
public enum Direction2 {
FRONT("前"), BEHIND("后"), LEFT("左"), RIGHT("右");
private String name;
private Direction2(String name) {
this.name = name;
}
public String getName() {
return name;
}
// @Override
// public String toString() {
// return "我爱林青霞";
// }
}
(3)版本3
package cn.itcast_02;
/*
* 通过JDK5提供的枚举来做枚举类
*/
public enum Direction3 {
FRONT("前") {
@Override
public void show() {
System.out.println("前");
}
},
BEHIND("后") {
@Override
public void show() {
System.out.println("后");
}
},
LEFT("左") {
@Override
public void show() {
System.out.println("左");
}
},
RIGHT("右") {
@Override
public void show() {
System.out.println("右");
}
};
//可以有成员变量
private String name;
private Direction3(String name) {
this.name = name;
}
public String getName() {
return name;
}
//可以有抽象方法
public abstract void show();
}
(4)枚举类的测试:public String toString():返回枚举常量的名称,它包含在声明中。(可以重写toString方法!)
package cn.itcast_02;
public class DirectionDemo {
public static void main(String[] args) {
Direction d = Direction.FRONT;
System.out.println(d); // FRONT
// public String toString()返回枚举常量的名称,它包含在声明中。
System.out.println("-------------");
Direction2 d2 = Direction2.FRONT;
System.out.println(d2);
System.out.println(d2.getName());
System.out.println("-------------");
Direction3 d3 = Direction3.FRONT;
System.out.println(d3);
System.out.println(d3.getName());
d3.show();
System.out.println("--------------");
//枚举类在switch中的用法
Direction3 dd = Direction3.FRONT;
dd = Direction3.LEFT;
switch (dd) {
case FRONT:
System.out.println("你选择了前");
break;
case BEHIND:
System.out.println("你选择了后");
break;
case LEFT:
System.out.println("你选择了左");
break;
case RIGHT:
System.out.println("你选择了右");
break;
}
}
}
(5)枚举类的方法测试
package cn.itcast_02;
public class EnumMethodDemo {
public static void main(String[] args) {
// int compareTo(E o):比较此枚举与指定对象的顺序。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。
Direction2 d21 = Direction2.FRONT;
Direction2 d22 = Direction2.BEHIND;
Direction2 d23 = Direction2.LEFT;
Direction2 d24 = Direction2.RIGHT;
System.out.println(d21.compareTo(d21));//0
System.out.println(d21.compareTo(d24));//-3
System.out.println(d24.compareTo(d21));//3
System.out.println("---------------");
// String name():返回此枚举常量的名称,在其枚举声明中对其进行声明
System.out.println(d21.name());//FRONT
System.out.println(d22.name());
System.out.println(d23.name());
System.out.println(d24.name());
System.out.println("--------------");
// int ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
System.out.println(d21.ordinal());//0
System.out.println(d22.ordinal());
System.out.println(d23.ordinal());
System.out.println(d24.ordinal());
System.out.println("--------------");
// String toString():返回枚举常量的名称,它包含在声明中。
// 可以重写此方法,虽然一般来说没有必要。当存在更加“程序员友好的”字符串形式时,应该使用枚举类型重写此方法.
System.out.println(d21.toString());//FRONT
System.out.println(d22.toString());
System.out.println(d23.toString());
System.out.println(d24.toString());
System.out.println("--------------");
// <T> T valueOf(Class<T> type,String name):返回带指定名称的指定枚举类型的枚举常量。
Direction2 d = Enum.valueOf(Direction2.class, "FRONT");
System.out.println(d.getName());//前
System.out.println("----------------");
// values():此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便!!!
Direction2[] dirs = Direction2.values();
for (Direction2 d2 : dirs) {
System.out.println(d2);//FRONT
System.out.println(d2.getName());//前
}
}
}