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修饰,只能在每个枚举的实例实现抽象方法。