一、枚举是什么?java
Java中的枚举实际上是一种语法糖,在 JDK 1.5以后出现,用来表示固定且有限个的对象。好比一个季节类有春、夏、秋、冬四个对象;一个星期有星期一到星期日七个对象。这些明显都是固定的,且有限个。ide
二、枚举类和普通类的区别post
①、使用 enum 定义的枚举类默认继承 java.lang.Enum 类,即枚举类是不能再继承别的类了。而普通类的通常父类默认是 Object测试
②、枚举类的构造器只能使用 private 定义,而普通类的还能够用 public 修饰this
③、枚举类的全部实例必须在枚举类中显示列出(,分隔 ;结尾),列出的实例系统会默认自动添加 public static final 修饰url
④、全部的枚举类都提供了一个 values() 方法,能够用来遍历枚举值spa
三、怎么用枚举?.net
首先咱们看,以一个季节类有春、夏、秋、冬四个对象为例:在 JDK 1.5之前是怎么表示的呢?code
建立一个 季节类:对象
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之后)
②、若是枚举类的对象只有一个,那么能够做为单例模式的实现