1、枚举是什么?
Java中的枚举其实是一种语法糖,在 JDK 1.5之后出现,用来表示固定且有限个的对象。比如一个季节类有春、夏、秋、冬四个对象;一个星期有星期一到星期日七个对象。这些明显都是固定的,且有限个。
2、枚举类和普通类的区别
①、使用 enum 定义的枚举类默认继承 java.lang.Enum 类,即枚举类是不能再继承别的类了。而普通类的一般父类默认是 Object
②、枚举类的构造器只能使用 private 定义,而普通类的还可以用 public 修饰
③、枚举类的所有实例必须在枚举类中显示列出(,分隔 ;结尾),列出的实例系统会默认自动添加 public static final 修饰
④、所有的枚举类都提供了一个 values() 方法,可以用来遍历枚举值
3、怎么用枚举?
首先我们看,以一个季节类有春、夏、秋、冬四个对象为例:在 JDK 1.5以前是怎么表示的呢?
创建一个 季节类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public class Season {
//属性不能修改,用 final 修饰
private final String name;
private final String desc;
//因为枚举类的对象是有限的,即我们不能再外面 new Season(),所以构造器私有化
private Season(String name,String desc) {
this .name = name;
this .desc = desc;
}
//不能再外面new Season(),那么内部必须创建出对象
//外界直接通过类名来访问,用 static 修饰
//外界不能修改,用 final 修饰
public static final Season SPRING = new Season( "春天" , "春暖花开" );
public static final Season SUMMER = new Season( "夏天" , "炎炎盛夏" );
public static final Season FALL = new Season( "秋天" , "秋高气爽" );
public static final Season WINTER = new Season( "冬天" , "大雪纷飞" );
@Override
public String toString() {
return "Season [name=" + name + ", desc=" + desc + "]" ;
}
} |
测试:
1
2
3
4
5
6
7
8
9
|
public class SeasonTest {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.SUMMER);
System.out.println(Season.FALL);
System.out.println(Season.WINTER);
}
} |
结果为:
1
2
3
4
|
Season [name=春天, desc=春暖花开] Season [name=夏天, desc=炎炎盛夏] Season [name=秋天, desc=秋高气爽] Season [name=冬天, desc=大雪纷飞] |
使用 Enum 来表示季节类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public enum SeasonEnum {
//必须在第一行写出有哪些枚举值
SPRING( "春天" , "春暖花开" ),
SUMMER( "夏天" , "炎炎盛夏" ),
FALL( "秋天" , "秋高气爽" ),
WINTER( "冬天" , "大雪纷飞" );
private final String name;
private final String desc;
private SeasonEnum(String name, String desc) {
this .name = name;
this .desc = desc;
}
} |
测试:
1
2
3
4
5
6
7
8
|
public static void main(String[] args) {
System.out.println(SeasonEnum.SPRING); //SPRING
//用 values() 来获取所有的枚举值
for (SeasonEnum s : SeasonEnum.values()){
System.out.println(s);
}
}
|
枚举类还能实现接口:
第一步:定义一个接口,方法是返回季节的月份
1
2
3
4
5
|
public interface SeasonEnumImpl {
//用来返回季节的月份
String getMonth();
} |
第二步:季节类实现接口,并实现接口中的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public enum SeasonEnum implements SeasonEnumImpl{
//必须在第一行写出有哪些枚举值
SPRING( "春天" , "春暖花开" ){
@Override
public String getMonth() {
return "12-2" ;
}
},
SUMMER( "夏天" , "炎炎盛夏" ){
@Override
public String getMonth() {
return "3-5" ;
}
},
FALL( "秋天" , "秋高气爽" ){
@Override
public String getMonth() {
return "6-8" ;
}
},
WINTER( "冬天" , "大雪纷飞" ){
@Override
public String getMonth() {
return "9-11" ;
}
};
private final String name;
private final String desc;
private SeasonEnum(String name, String desc) {
this .name = name;
this .desc = desc;
}
} |
测试:
1
2
3
4
5
6
7
8
9
|
public static void main(String[] args) {
System.out.println(SeasonEnum.SPRING); //SPRING
//用 values() 来获取所有的枚举值
for (SeasonEnum s : SeasonEnum.values()){
System.out.println(s.getMonth());
}
}
|
结果为:
1
2
3
4
5
|
SPRING 12 - 2
3 - 5
6 - 8
9 - 11
|
注意:
①、枚举类可以作为 switch--case 的表达式(JDK 1.5以后)
②、如果枚举类的对象只有一个,那么可以作为单例模式的实现
作者:YSOcean