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