枚举(三)深入了解枚举

7.自定义枚举的构造方法

枚举类型不能用public和protected修饰构造方法,所以枚举对象无法在测试类中直接调用其构造方法来初始化。

 1 enum Color{
 2     RED("红色",4),GREEN("绿色",5),BLUE("蓝色",6);//有参构造方法实例化对象
 3     private String name;
 4     private int index;
 5     private Color(String name,int index)//两参构造方法
 6     {
 7         this.name=name;
 8         this.index=index;
 9     }
10     public static String getName(int index)//普通方法
11     {
12         for(Color c:Color.values())
13         {
14             if(c.getIndex()==index)
15             {
16                 return c.name;
17             }
18         }
19         return null;
20     }
21     public String getName()
22     {
23         return name;
24     }
25     public static void setName(int index,String name)
26     {
27         for(Color c:Color.values())
28         {
29             if(c.getIndex()==index)
30             {
31                 c.name=name;
32                 return;
33             }
34         }
35     }
36     public int getIndex()
37     {
38         return index;
39     }
40     public static void setIndex(int index,String name)
41     {
42         for(Color c:Color.values())
43         {
44             if(c.getName()==name)
45             {
46                 c.index=index;
47                 return;
48             }
49         }
50     }
51 };
52 public class DeepEnum
53 {
54     public static void main(String[] args)
55     {
56         System.out.println("原来的颜色和编号:");
57         System.out.println(Color.RED.getIndex()+"-->"+Color.RED.getName());
58         System.out.println(Color.GREEN.getIndex()+"-->"+Color.GREEN.getName());
59         System.out.println(Color.BLUE.getIndex()+"-->"+Color.BLUE.getName());
60         System.out.println("自定义后的颜色和编号:");
61         Color.setName(4,"黑色");//重新设置名称
62         System.out.println("4-->"+Color.getName(4));
63         Color.setIndex(7, "黑色");//重新设置索引编号
64         System.out.println("7-->"+Color.getName(7));
65     }
66 }

上述例子定义了Color类的构造方法和四个普通方法,通过对方法的调用实现了对枚举对象的属性进行赋值和修改。

有几点需要注意:(1)、枚举类定义的对象必须出现在该类的第一行。

                   (2)、一旦定义了枚举类的构造方法,那么所以的枚举对象都必须显示调用此构造方法。

                   (3)、可以通过“枚举类名.对象名.方法名”调用方法得到对象的属性。

                   (4)、可以通过“枚举类名.方法名”调用方法设置对象的属性。

8.枚举的接口

枚举和普通类一样,可以实现一个或多个接口。当一个枚举实现一个接口之后,各个枚举对象都必须分别实现接口中的抽象方法。

 1 interface ColorInterface
 2 {
 3     public String getColor();
 4 }
 5 enum Color implements ColorInterface
 6 {
 7     红色
 8     {
 9         public String getColor()
10         {
11             return "RED";
12         }
13     },
14     绿色
15     {
16         public String getColor()
17         {
18             return "GREEN";
19         }
20     },
21     蓝色
22     {
23         public String getColor()
24         {
25             return "BLUE";
26         }
27     };
28 }
29 public class DeepEnum
30 {
31     public static void main(String[] args)
32     {
33         for(Color c:Color.values())
34         {
35             System.out.println(c.ordinal()+"-->"+c.name()+":"+c.getColor());
36         }
37     }
38 }

第6—27行,就是一条复合的大语句,本质上是一条语句。

9.枚举中定义抽象方法

上述7和8中为枚举对象的属性和编号赋值还可以有第三种方法,那便是在枚举中直接定义抽象方法。

 1 enum Color
 2 {
 3     红色
 4     {
 5         public String getColor()
 6         {
 7             return "RED";
 8         }
 9     },
10     绿色
11     {
12         public String getColor()
13         {
14             return "GREEN";
15         }
16     },
17     蓝色
18     {
19         public String getColor()
20         {
21             return "BLUE";
22         }
23     };
24     public abstract String getColor();//枚举中的抽象方法
25 }
26 public class DeepEnum
27 {
28     public static void main(String[] args)
29     {
30         for(Color c:Color.values())
31         {
32             System.out.println(c.ordinal()+"-->"+c.name()+":"+c.getColor());
33         }
34     }
35 }

10.枚举类不可以被继承

在枚举类内部可以定义一个或多个抽象方法,但枚举类不能用abstract修饰,只能在每个枚举的实例实现抽象方法。

原文地址:https://www.cnblogs.com/wxywxy/p/6773621.html