34、枚举详解

知识点介绍
1、枚举可以实现一个或多个接口。枚举默认继承于java.lang.Enum类,而不是Object类。Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口
2、使用enum定义、非抽象的枚举默认会使用final修饰,因此枚举不能派生子类

3、枚举类的构造器只能使用private访问控制符

4、枚举类的所有势力必须在枚举类的第一行显示列出

下面是一个简单的枚举应用

public class Test{
    public static void main(String[] args) {
        SessonEnum e=Enum.valueOf(SessonEnum.class, "Spring");
        System.out.println(e.name());
    }
}

enum SessonEnum{
    Spring,Summer,Fall,Winter;
}

枚举类的成员变量、方法和构造器

 1 public class Hello {
 2     public static void main(String[] args) {
 3         SessonEnum e=Enum.valueOf(SessonEnum.class, "Spring");
 4         System.out.println(e.getName());
 5     }
 6 }
 7 
 8 
 9 enum SessonEnum{
10     Spring("春"),Summer("夏"),Fall("秋"),Winter("冬");
11     private  final String name;
12     private SessonEnum(String name){
13         this.name=name;
14     }
15     public String getName(){
16         return name;
17     }
18 }

实现接口的枚举

1、由枚举类来实现接口里的方法——所有枚举值实现接口都是调用方法都有相同的行为

 1 interface SessonInfo{
 2     void info();
 3 }
 4 
 5 enum SessonEnum implements SessonInfo {
 6     
 7     Spring("春"),Summer("夏"),Fall("秋"),Winter("冬");
 8     
 9     
10     private  final String name;
11     private SessonEnum(String name){
12         this.name=name;
13     }
14     public String getName(){
15         return name;
16     }
17     @Override
18     public void info() {
19         System.out.println("这里是公用接口的实现");
20         
21     }
22 }
23 
24 public class Test{
25     public static void main(String[] args) {
26         SessonEnum spring=Enum.valueOf(SessonEnum.class, "Spring");
27         SessonEnum summer=SessonEnum.Summer;
28         spring.info();
29         summer.info();
30     }
31 }

输出结果:

这里是公用接口的实现
这里是公用接口的实现

2、分别由每个枚举值来实现接口

 1 interface SessonInfo{
 2     void info();
 3 }
 4 
 5 enum SessonEnum implements SessonInfo {
 6     
 7     Spring("春"){
 8         @Override
 9         public void info() {
10             System.out.println("这里是春季");
11         }
12     },Summer("夏"){
13         @Override
14         public void info() {
15             System.out.println("这里是夏季");
16         }
17         
18     },Fall("秋"){
19         @Override
20         public void info() {
21             System.out.println("这里是秋季");
22         }
23     },Winter("冬"){
24         @Override
25         public void info() {
26             System.out.println("这里是冬季");
27         }
28     };
29     
30     
31     private  final String name;
32     private SessonEnum(String name){
33         this.name=name;
34     }
35     public String getName(){
36         return name;
37     }
38 }
39 
40 public class Hello {
41     public static void main(String[] args) {
42         SessonEnum spring=Enum.valueOf(SessonEnum.class, "Spring");
43         SessonEnum summer=SessonEnum.Summer;
44         spring.info();
45         summer.info();
46     }
47 }

输出结果:

这里是春季
这里是夏季

枚举抽象类

假设有一个Operation枚举类,它的4个枚举值PLUS、MINUS、TIMES、DIVIDE分别代表加、减、乘、除4种运算,该枚举类需要定义一个eval()方法来完成计算

 1 public class Test{
 2     public static void main(String[] args) {
 3         System.out.println("1+2="+Operation.PLUS.eval(1, 2));
 4         System.out.println("5-3="+Operation.MINUS.eval(5, 3));
 5         System.out.println("3*4="+Operation.TIMES.eval(3, 4));
 6         System.out.println("10-2="+Operation.DIVIDE.eval(10, 2));
 7     }
 8 }
 9 
10 enum Operation{
11     PLUS{
12         public double eval(double x, double y) {
13             return x+y;
14         }
15     },
16     MINUS{
17         public double eval(double x, double y) {
18             return x-y;
19         }
20     },
21     TIMES{
22         @Override
23         public double eval(double x, double y) {
24             return x*y;
25         }
26     },
27     DIVIDE{
28         @Override
29         public double eval(double x, double y) {
30             return x/y;
31         }
32     };
33     public abstract double eval(double x,double y);
34 }

 输出结果:

1+2=3.0
5-3=2.0
3*4=12.0
10-2=5.0

原文地址:https://www.cnblogs.com/caoyc/p/5536941.html