Java 枚举类
Galloping_Leo 2020-09-08 Java
# Java 枚举类
# 1.1 概述
- 类的对象只有有限个,确定的。为枚举类
- 当需要定义一组常量时,强烈建议使用枚举类
- 若枚举只有一个对象, 则可以作为一种单例模式的实现方式
- 枚举类的属性
- 枚举类对象的属性不应允许被改动, 所以应该使用
private final
修饰 - 枚举类的使用
private final
修饰的属性应该在构造器中为其赋值 - 若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的 传入参数
- 枚举类对象的属性不应允许被改动, 所以应该使用
# 1.2 创建枚举类
# 1.2.1 方式一 自定义枚举类
- 私有化类的构造器,保证不能在类的外部创建其对象
- 在类的内部创建枚举类的实例。声明为:
public static final
- 对象如果有实例变量,应该声明为
private final
,并在构造器中初始化
public class EnumTest {
public static void main(String[] args) {
System.out.println(Season.SPRING.getName());
}
}
// 自定义枚举类
class Season{
//声明属性 private final
private final String name;
private final String describe;
//私有构造器 private
private Season(String name, String describe) {
this.name = name;
this.describe = describe;
}
// 提供多个对象
public static final Season SPRING = new Season("春天","风和日丽");
public static final Season SUMMER = new Season("夏天","烈日炎炎");
public static final Season AUTUMN = new Season("秋","秋高气爽");
public static final Season WINTER = new Season("冬","大雪将至");
public String getName() {
return name;
}
public String getDescribe() {
return describe;
}
}
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
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
# 1.2.2 方式二 enum 定义枚举类
使用说明
- 使用
enum
定义的枚举类默认继承了java.lang.Enum
类,因此不能再 继承其他类 - 枚举类的构造器只能使用
private
权限修饰符 - 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾)。列出的 实例系统会自动添加
public static final
修饰 - 必须在枚举类的第一行声明枚举类对象
JDK 1.5
中可以在switch
表达式中使用enum
定义的枚举类的对象 作为表达式,case
子句可以直接使用枚举值的名字, 无需添加枚举 类作为限定。
public class EnumTest1 {
public static void main(String[] args) {
Season1 season1 = Season1.AUTUMN;
System.out.println(season1);// AUTUMN
//说明Season1枚举类继承了java.lang.Enum 它重写了 toString 方法
System.out.println(Season1.class.getSuperclass()); //class java.lang.Enum
// switch 中的使用
switch (season1){
case SPRING:
System.out.println("春天");
break;
case AUTUMN:
System.out.println("秋天");
break;
}
}
}
enum Season1{
// 提供多个对象 对象之间 用, 隔开
SPRING ("春天","风和日丽"),
SUMMER ("夏天","烈日炎炎"),
AUTUMN("秋","秋高气爽"),
WINTER ("冬","大雪将至");
//声明属性 private final
private final String name;
private final String describe;
//私有构造器 private
private Season1(String name, String describe) {
this.name = name;
this.describe = describe;
}
public String getName() {
return name;
}
public String getDescribe() {
return describe;
}
}
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
37
38
39
40
41
42
43
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
37
38
39
40
41
42
43
# 1.2.3 实现接口的枚举类
可以再类中实现接口方法,亦可以在实例对象中实现接口方法。
public class EnumTest {
public static void main(String[] args) {
Season.SPRING.show();// 实例中实现的接口方法
Season.WINTER.show();// 类中实现的接口方法
}
}
interface Info {
public abstract void show();
}
// 自定义枚举类
class Season implements Info{
//声明属性 private final
private final String name;
private final String describe;
//私有构造器 private
private Season(String name, String describe) {
this.name = name;
this.describe = describe;
}
@Override
public void show() {
System.out.println("类中实现的");
}
// 提供多个对象 在实例中实现接口的方法
public static final Season SPRING = new Season("春天","风和日丽"){
@Override
public void show() {
System.out.println("实例中实现的春天");
}
};
public static final Season SUMMER = new Season("夏天","烈日炎炎"){
@Override
public void show() {
System.out.println("实例中实现的夏天");
}
};
public static final Season AUTUMN = new Season("秋","秋高气爽"){
@Override
public void show() {
System.out.println("实例中实现的秋天");
}
};
public static final Season WINTER = new Season("冬","大雪将至");
public String getName() {
return name;
}
public String getDescribe() {
return describe;
}
}
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class EnumTest1 {
public static void main(String[] args) {
Season1.SPRING.show(); // 类中实现的接口方法
Season1.WINTER.show(); // 实例中实现的接口方法
}
}
interface Infor {
void show();
}
enum Season1 implements Infor{
// 提供多个对象 对象之间 用, 隔开
SPRING ("春天","风和日丽"){
@Override
public void show() {
System.out.println("1");
}
},
SUMMER ("夏天","烈日炎炎"){
@Override
public void show() {
System.out.println("2");
}
},
AUTUMN("秋","秋高气爽"){
@Override
public void show() {
System.out.println("3");
}
},
WINTER ("冬","大雪将至");
//声明属性 private final
private final String name;
private final String describe;
//私有构造器 private
private Season1(String name, String describe) {
this.name = name;
this.describe = describe;
}
public String getName() {
return name;
}
public String getDescribe() {
return describe;
}
@Override
public void show() {
System.out.println("类中实现的接口方法");
}
}
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 1.3 Enum 的主要方法
Enum
类的主要方法:values()
方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。valueOf(String str)
:可以把一个字符串转为对应的枚举类对象。要求字符 串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException
。toString()
:返回当前枚举类对象常量的名称
Season1 summer = Season1.SUMMER;
System.out.println(summer); // toString ()
//values() 枚举类对象数组
Season1[] values = Season1.values();
for (int i = 0; i < values.length ; i++) {
System.out.println(values[i]);
}
//valueOf() 字符串返回 对应的枚举类 没有则报错
Season1 winter = Season1.valueOf("WINTER");
System.out.println(winter);
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12